Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(460)

Side by Side Diff: sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart

Issue 641923003: Remove the need for functionSignature. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library backend_ast_emitter; 5 library backend_ast_emitter;
6 6
7 import 'tree_ir_nodes.dart' as tree; 7 import 'tree_ir_nodes.dart' as tree;
8 import 'backend_ast_nodes.dart'; 8 import 'backend_ast_nodes.dart';
9 import '../constants/expressions.dart'; 9 import '../constants/expressions.dart';
10 import '../constants/values.dart'; 10 import '../constants/values.dart';
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 void removeTrailingReturn() { 147 void removeTrailingReturn() {
148 if (statementBuffer.isEmpty) return; 148 if (statementBuffer.isEmpty) return;
149 if (statementBuffer.last is! Return) return; 149 if (statementBuffer.last is! Return) return;
150 Return ret = statementBuffer.last; 150 Return ret = statementBuffer.last;
151 Expression expr = ret.expression; 151 Expression expr = ret.expression;
152 if (expr is Literal && expr.value.isNull) { 152 if (expr is Literal && expr.value.isNull) {
153 statementBuffer.removeLast(); 153 statementBuffer.removeLast();
154 } 154 }
155 } 155 }
156 156
157 Parameter emitParameterFromElement(FormalElement element, [String name]) { 157 /// TODO(johnniwinther): Remove this when issue 21283 has been resolved.
158 if (name == null) { 158 int pseudoNameCounter = 0;
159
160 Parameter emitParameter(DartType type,
161 {String name,
162 Element element,
163 ConstantExpression defaultValue}) {
164 if (name == null && element != null) {
159 name = element.name; 165 name = element.name;
160 } 166 }
161 if (element.functionSignature != null) { 167 if (name == null) {
162 FunctionSignature signature = element.functionSignature; 168 name = '_${pseudoNameCounter++}';
163 TypeAnnotation returnType = emitOptionalType(signature.type.returnType); 169 }
164 Parameters innerParameters = emitParameters(signature); 170 Parameter parameter;
165 return new Parameter.function(name, returnType, innerParameters) 171 if (type.isFunctionType) {
166 ..element = element; 172 FunctionType functionType = type;
173 TypeAnnotation returnType = emitOptionalType(functionType.returnType);
174 Parameters innerParameters = emitParametersFromType(functionType);
175 parameter = new Parameter.function(name, returnType, innerParameters);
167 } else { 176 } else {
168 TypeAnnotation type = emitOptionalType(element.type); 177 TypeAnnotation typeAnnotation = emitOptionalType(type);
169 return new Parameter(name, type:type) 178 parameter = new Parameter(name, type: typeAnnotation);
170 ..element = element; 179 }
180 parameter.element = element;
181 if (defaultValue != null && !defaultValue.value.isNull) {
182 parameter.defaultValue = emitConstant(defaultValue);
183 }
184 return parameter;
185 }
186
187 Parameters emitParametersFromType(FunctionType functionType) {
188 if (functionType.namedParameters.isEmpty) {
189 return new Parameters(
190 emitParameters(functionType.parameterTypes),
191 emitParameters(functionType.optionalParameterTypes),
192 false);
193 } else {
194 return new Parameters(
195 emitParameters(functionType.parameterTypes),
196 emitParameters(functionType.namedParameterTypes,
197 names: functionType.namedParameters),
198 true);
171 } 199 }
172 } 200 }
173 201
174 Parameters emitParameters(FunctionSignature signature) { 202 List<Parameter> emitParameters(
175 return new Parameters( 203 Iterable<DartType> parameterTypes,
176 signature.requiredParameters.mapToList(emitParameterFromElement), 204 {Iterable<String> names: const <String>[],
177 signature.optionalParameters.mapToList(emitParameterFromElement), 205 Iterable<ConstantExpression> defaultValues: const <ConstantExpression>[],
178 signature.optionalParametersAreNamed); 206 Iterable<Element> elements: const <Element>[]}) {
207 Iterator<String> name = names.iterator;
208 Iterator<ConstantExpression> defaultValue = defaultValues.iterator;
209 Iterator<Element> element = elements.iterator;
210 return parameterTypes.map((DartType type) {
211 return emitParameter(type,
212 name: name.moveNext() ? name.current : null,
floitsch 2014/10/10 12:56:04 Minor nit. (not much better. just wanted to point
Johnni Winther 2014/10/13 08:10:53 Done. I thought [current] would throw!
213 defaultValue: defaultValue.moveNext() ? defaultValue.current : null,
214 element: element.moveNext() ? element.current : null);
215 }).toList();
179 } 216 }
180 217
181 /// Emits parameters that are not nested inside other parameters. 218 /// Emits parameters that are not nested inside other parameters.
182 /// Root parameters can have default values, while inner parameters cannot. 219 /// Root parameters can have default values, while inner parameters cannot.
183 Parameters emitRootParameters(tree.FunctionDefinition function) { 220 Parameters emitRootParameters(tree.FunctionDefinition function) {
184 FunctionSignature signature = function.element.functionSignature; 221 ParameterElement elementFromParameter(tree.Variable parameter) {
floitsch 2014/10/10 12:56:04 I prefer to inline it. If it doesn't fit, I'm ok w
Johnni Winther 2014/10/13 08:10:53 Done.
185 List<ConstantExpression> defaults = function.defaultParameterValues; 222 return parameter.element;
186 List<Parameter> required =
187 signature.requiredParameters.mapToList(emitParameterFromElement);
188 List<Parameter> optional = new List<Parameter>(defaults.length);
189 for (int i = 0; i < defaults.length; i++) {
190 ParameterElement element = signature.orderedOptionalParameters[i];
191 optional[i] = emitParameterFromElement(element);
192 Expression constant = emitConstant(defaults[i]);
193 if (!isNullLiteral(constant)) {
194 optional[i].defaultValue = constant;
195 }
196 } 223 }
197 return new Parameters(required, optional, 224
198 signature.optionalParametersAreNamed); 225 FunctionType functionType = function.element.type;
226 List<Parameter> required = emitParameters(
227 functionType.parameterTypes,
228 elements: function.parameters.map(elementFromParameter));
229 bool optionalParametersAreNamed = !functionType.namedParameters.isEmpty;
230 List<Parameter> optional = emitParameters(
231 optionalParametersAreNamed
232 ? functionType.namedParameterTypes
233 : functionType.optionalParameterTypes,
234 defaultValues: function.defaultParameterValues,
235 elements: function.parameters.skip(required.length)
236 .map(elementFromParameter));
237 return new Parameters(required, optional, optionalParametersAreNamed);
199 } 238 }
200 239
201 /// True if the two expressions are a reference to the same variable. 240 /// True if the two expressions are a reference to the same variable.
202 bool isSameVariable(Receiver e1, Receiver e2) { 241 bool isSameVariable(Receiver e1, Receiver e2) {
203 return e1 is Identifier && 242 return e1 is Identifier &&
204 e2 is Identifier && 243 e2 is Identifier &&
205 e1.element is VariableElement && 244 e1.element is VariableElement &&
206 e1.element == e2.element; 245 e1.element == e2.element;
207 } 246 }
208 247
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 } 891 }
853 } 892 }
854 893
855 visitVariable(tree.Variable variable) { 894 visitVariable(tree.Variable variable) {
856 if (shadowedParameters.contains(variable)) { 895 if (shadowedParameters.contains(variable)) {
857 hasShadowedUse.add(variable); 896 hasShadowedUse.add(variable);
858 } 897 }
859 } 898 }
860 899
861 } 900 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698