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

Side by Side Diff: pkg/compiler/lib/src/resolution/signatures.dart

Issue 1859343004: dartfmt pkg/compiler (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 8 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
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 dart2js.resolution.signatures; 5 library dart2js.resolution.signatures;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../compiler.dart' show 8 import '../compiler.dart' show Compiler;
9 Compiler;
10 import '../dart_types.dart'; 9 import '../dart_types.dart';
11 import '../elements/elements.dart'; 10 import '../elements/elements.dart';
12 import '../elements/modelx.dart' show 11 import '../elements/modelx.dart'
13 ErroneousFieldElementX, 12 show
14 ErroneousInitializingFormalElementX, 13 ErroneousFieldElementX,
15 FormalElementX, 14 ErroneousInitializingFormalElementX,
16 FunctionElementX, 15 FormalElementX,
17 FunctionSignatureX, 16 FunctionElementX,
18 InitializingFormalElementX, 17 FunctionSignatureX,
19 LocalParameterElementX; 18 InitializingFormalElementX,
19 LocalParameterElementX;
20 import '../tree/tree.dart'; 20 import '../tree/tree.dart';
21 import '../universe/use.dart' show 21 import '../universe/use.dart' show TypeUse;
22 TypeUse; 22 import '../util/util.dart' show Link, LinkBuilder;
23 import '../util/util.dart' show
24 Link,
25 LinkBuilder;
26 23
27 import 'members.dart' show 24 import 'members.dart' show ResolverVisitor;
28 ResolverVisitor; 25 import 'registry.dart' show ResolutionRegistry;
29 import 'registry.dart' show 26 import 'resolution_common.dart' show MappingVisitor;
30 ResolutionRegistry; 27 import 'scope.dart' show Scope;
31 import 'resolution_common.dart' show
32 MappingVisitor;
33 import 'scope.dart' show
34 Scope;
35 28
36 /** 29 /**
37 * [SignatureResolver] resolves function signatures. 30 * [SignatureResolver] resolves function signatures.
38 */ 31 */
39 class SignatureResolver extends MappingVisitor<FormalElementX> { 32 class SignatureResolver extends MappingVisitor<FormalElementX> {
40 final ResolverVisitor resolver; 33 final ResolverVisitor resolver;
41 final FunctionTypedElement enclosingElement; 34 final FunctionTypedElement enclosingElement;
42 final Scope scope; 35 final Scope scope;
43 final MessageKind defaultValuesError; 36 final MessageKind defaultValuesError;
44 final bool createRealParameters; 37 final bool createRealParameters;
45 List<Element> optionalParameters = const <Element>[]; 38 List<Element> optionalParameters = const <Element>[];
46 int optionalParameterCount = 0; 39 int optionalParameterCount = 0;
47 bool isOptionalParameter = false; 40 bool isOptionalParameter = false;
48 bool optionalParametersAreNamed = false; 41 bool optionalParametersAreNamed = false;
49 VariableDefinitions currentDefinitions; 42 VariableDefinitions currentDefinitions;
50 43
51 SignatureResolver(Compiler compiler, 44 SignatureResolver(Compiler compiler, FunctionTypedElement enclosingElement,
52 FunctionTypedElement enclosingElement, 45 ResolutionRegistry registry,
53 ResolutionRegistry registry, 46 {this.defaultValuesError, this.createRealParameters})
54 {this.defaultValuesError,
55 this.createRealParameters})
56 : this.enclosingElement = enclosingElement, 47 : this.enclosingElement = enclosingElement,
57 this.scope = enclosingElement.buildScope(), 48 this.scope = enclosingElement.buildScope(),
58 this.resolver = 49 this.resolver =
59 new ResolverVisitor(compiler, enclosingElement, registry), 50 new ResolverVisitor(compiler, enclosingElement, registry),
60 super(compiler, registry); 51 super(compiler, registry);
61 52
62 bool get defaultValuesAllowed => defaultValuesError == null; 53 bool get defaultValuesAllowed => defaultValuesError == null;
63 54
64 visitNodeList(NodeList node) { 55 visitNodeList(NodeList node) {
65 // This must be a list of optional arguments. 56 // This must be a list of optional arguments.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 101
111 void validateName(Identifier node) { 102 void validateName(Identifier node) {
112 if (isOptionalParameter && 103 if (isOptionalParameter &&
113 optionalParametersAreNamed && 104 optionalParametersAreNamed &&
114 Name.isPrivateName(node.source)) { 105 Name.isPrivateName(node.source)) {
115 reporter.reportErrorMessage(node, MessageKind.PRIVATE_NAMED_PARAMETER); 106 reporter.reportErrorMessage(node, MessageKind.PRIVATE_NAMED_PARAMETER);
116 } 107 }
117 } 108 }
118 109
119 void computeParameterType(FormalElementX element, 110 void computeParameterType(FormalElementX element,
120 [VariableElement fieldElement]) { 111 [VariableElement fieldElement]) {
121 void computeFunctionType(FunctionExpression functionExpression) { 112 void computeFunctionType(FunctionExpression functionExpression) {
122 FunctionSignature functionSignature = SignatureResolver.analyze( 113 FunctionSignature functionSignature = SignatureResolver.analyze(
123 compiler, functionExpression.parameters, 114 compiler,
124 functionExpression.returnType, element, registry, 115 functionExpression.parameters,
116 functionExpression.returnType,
117 element,
118 registry,
125 defaultValuesError: MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT); 119 defaultValuesError: MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT);
126 element.functionSignature = functionSignature; 120 element.functionSignature = functionSignature;
127 } 121 }
128 122
129 if (currentDefinitions.type != null) { 123 if (currentDefinitions.type != null) {
130 element.typeCache = resolveTypeAnnotation(currentDefinitions.type); 124 element.typeCache = resolveTypeAnnotation(currentDefinitions.type);
131 } else { 125 } else {
132 // Is node.definitions exactly one FunctionExpression? 126 // Is node.definitions exactly one FunctionExpression?
133 Link<Node> link = currentDefinitions.definitions.nodes; 127 Link<Node> link = currentDefinitions.definitions.nodes;
134 assert(invariant(currentDefinitions, !link.isEmpty)); 128 assert(invariant(currentDefinitions, !link.isEmpty));
135 assert(invariant(currentDefinitions, link.tail.isEmpty)); 129 assert(invariant(currentDefinitions, link.tail.isEmpty));
136 if (link.head.asFunctionExpression() != null) { 130 if (link.head.asFunctionExpression() != null) {
137 // Inline function typed parameter, like `void m(int f(String s))`. 131 // Inline function typed parameter, like `void m(int f(String s))`.
138 computeFunctionType(link.head); 132 computeFunctionType(link.head);
139 } else if (link.head.asSend() != null && 133 } else if (link.head.asSend() != null &&
140 link.head.asSend().selector.asFunctionExpression() != null) { 134 link.head.asSend().selector.asFunctionExpression() != null) {
141 // Inline function typed initializing formal or 135 // Inline function typed initializing formal or
142 // parameter with default value, like `C(int this.f(String s))` or 136 // parameter with default value, like `C(int this.f(String s))` or
143 // `void m([int f(String s) = null])`. 137 // `void m([int f(String s) = null])`.
144 computeFunctionType(link.head.asSend().selector.asFunctionExpression()); 138 computeFunctionType(link.head.asSend().selector.asFunctionExpression());
145 } else { 139 } else {
146 assert(invariant(currentDefinitions, 140 assert(invariant(currentDefinitions,
147 link.head.asIdentifier() != null || link.head.asSend() != null)); 141 link.head.asIdentifier() != null || link.head.asSend() != null));
148 if (fieldElement != null) { 142 if (fieldElement != null) {
149 element.typeCache = fieldElement.computeType(resolution); 143 element.typeCache = fieldElement.computeType(resolution);
150 } else { 144 } else {
(...skipping 12 matching lines...) Expand all
163 if (identifier != null) { 157 if (identifier != null) {
164 // Normal parameter: [:Type name:]. 158 // Normal parameter: [:Type name:].
165 return identifier; 159 return identifier;
166 } else { 160 } else {
167 // Function type parameter: [:void name(DartType arg):]. 161 // Function type parameter: [:void name(DartType arg):].
168 var functionExpression = node.selector.asFunctionExpression(); 162 var functionExpression = node.selector.asFunctionExpression();
169 if (functionExpression != null && 163 if (functionExpression != null &&
170 functionExpression.name.asIdentifier() != null) { 164 functionExpression.name.asIdentifier() != null) {
171 return functionExpression.name.asIdentifier(); 165 return functionExpression.name.asIdentifier();
172 } else { 166 } else {
173 reporter.internalError(node, 167 reporter.internalError(
174 'internal error: unimplemented receiver on parameter send'); 168 node, 'internal error: unimplemented receiver on parameter send');
175 return null; 169 return null;
176 } 170 }
177 } 171 }
178 } 172 }
179 173
180 // The only valid [Send] can be in constructors and must be of the form 174 // The only valid [Send] can be in constructors and must be of the form
181 // [:this.x:] (where [:x:] represents an instance field). 175 // [:this.x:] (where [:x:] represents an instance field).
182 InitializingFormalElementX visitSend(Send node) { 176 InitializingFormalElementX visitSend(Send node) {
183 return createFieldParameter(node, null); 177 return createFieldParameter(node, null);
184 } 178 }
185 179
186 FormalElementX createParameter(Identifier name, Expression initializer) { 180 FormalElementX createParameter(Identifier name, Expression initializer) {
187 validateName(name); 181 validateName(name);
188 FormalElementX parameter; 182 FormalElementX parameter;
189 if (createRealParameters) { 183 if (createRealParameters) {
190 parameter = new LocalParameterElementX( 184 parameter = new LocalParameterElementX(
191 enclosingElement, currentDefinitions, name, initializer, 185 enclosingElement, currentDefinitions, name, initializer,
192 isOptional: isOptionalParameter, isNamed: optionalParametersAreNamed); 186 isOptional: isOptionalParameter, isNamed: optionalParametersAreNamed);
193 } else { 187 } else {
194 parameter = new FormalElementX( 188 parameter = new FormalElementX(
195 ElementKind.PARAMETER, enclosingElement, currentDefinitions, name); 189 ElementKind.PARAMETER, enclosingElement, currentDefinitions, name);
196 } 190 }
197 computeParameterType(parameter); 191 computeParameterType(parameter);
198 return parameter; 192 return parameter;
199 } 193 }
200 194
201 InitializingFormalElementX createFieldParameter(Send node, 195 InitializingFormalElementX createFieldParameter(
202 Expression initializer) { 196 Send node, Expression initializer) {
203 InitializingFormalElementX element; 197 InitializingFormalElementX element;
204 Identifier receiver = node.receiver.asIdentifier(); 198 Identifier receiver = node.receiver.asIdentifier();
205 if (receiver == null || !receiver.isThis()) { 199 if (receiver == null || !receiver.isThis()) {
206 reporter.reportErrorMessage(node, MessageKind.INVALID_PARAMETER); 200 reporter.reportErrorMessage(node, MessageKind.INVALID_PARAMETER);
207 return new ErroneousInitializingFormalElementX( 201 return new ErroneousInitializingFormalElementX(
208 getParameterName(node), enclosingElement); 202 getParameterName(node), enclosingElement);
209 } else { 203 } else {
210 if (!enclosingElement.isGenerativeConstructor) { 204 if (!enclosingElement.isGenerativeConstructor) {
211 reporter.reportErrorMessage( 205 reporter.reportErrorMessage(
212 node, MessageKind.INITIALIZING_FORMAL_NOT_ALLOWED); 206 node, MessageKind.INITIALIZING_FORMAL_NOT_ALLOWED);
213 return new ErroneousInitializingFormalElementX( 207 return new ErroneousInitializingFormalElementX(
214 getParameterName(node), enclosingElement); 208 getParameterName(node), enclosingElement);
215 } 209 }
216 Identifier name = getParameterName(node); 210 Identifier name = getParameterName(node);
217 validateName(name); 211 validateName(name);
218 Element fieldElement = 212 Element fieldElement =
219 enclosingElement.enclosingClass.lookupLocalMember(name.source); 213 enclosingElement.enclosingClass.lookupLocalMember(name.source);
220 if (fieldElement == null || 214 if (fieldElement == null ||
221 !identical(fieldElement.kind, ElementKind.FIELD)) { 215 !identical(fieldElement.kind, ElementKind.FIELD)) {
222 reporter.reportErrorMessage( 216 reporter.reportErrorMessage(
223 node, MessageKind.NOT_A_FIELD, {'fieldName': name}); 217 node, MessageKind.NOT_A_FIELD, {'fieldName': name});
224 fieldElement = new ErroneousFieldElementX( 218 fieldElement =
225 name, enclosingElement.enclosingClass); 219 new ErroneousFieldElementX(name, enclosingElement.enclosingClass);
226 } else if (!fieldElement.isInstanceMember) { 220 } else if (!fieldElement.isInstanceMember) {
227 reporter.reportErrorMessage( 221 reporter.reportErrorMessage(
228 node, MessageKind.NOT_INSTANCE_FIELD, {'fieldName': name}); 222 node, MessageKind.NOT_INSTANCE_FIELD, {'fieldName': name});
229 fieldElement = new ErroneousFieldElementX( 223 fieldElement =
230 name, enclosingElement.enclosingClass); 224 new ErroneousFieldElementX(name, enclosingElement.enclosingClass);
231 } 225 }
232 element = new InitializingFormalElementX(enclosingElement, 226 element = new InitializingFormalElementX(
233 currentDefinitions, name, initializer, fieldElement, 227 enclosingElement, currentDefinitions, name, initializer, fieldElement,
234 isOptional: isOptionalParameter, isNamed: optionalParametersAreNamed); 228 isOptional: isOptionalParameter, isNamed: optionalParametersAreNamed);
235 computeParameterType(element, fieldElement); 229 computeParameterType(element, fieldElement);
236 } 230 }
237 return element; 231 return element;
238 } 232 }
239 233
240 /// A [SendSet] node is an optional parameter with a default value. 234 /// A [SendSet] node is an optional parameter with a default value.
241 Element visitSendSet(SendSet node) { 235 Element visitSendSet(SendSet node) {
242 FormalElementX element; 236 FormalElementX element;
243 if (node.receiver != null) { 237 if (node.receiver != null) {
244 element = createFieldParameter(node, node.arguments.first); 238 element = createFieldParameter(node, node.arguments.first);
245 } else if (node.selector.asIdentifier() != null || 239 } else if (node.selector.asIdentifier() != null ||
246 node.selector.asFunctionExpression() != null) { 240 node.selector.asFunctionExpression() != null) {
247 element = createParameter(getParameterName(node), node.arguments.first); 241 element = createParameter(getParameterName(node), node.arguments.first);
248 } 242 }
249 Node defaultValue = node.arguments.head; 243 Node defaultValue = node.arguments.head;
250 if (!defaultValuesAllowed) { 244 if (!defaultValuesAllowed) {
251 reporter.reportErrorMessage(defaultValue, defaultValuesError); 245 reporter.reportErrorMessage(defaultValue, defaultValuesError);
252 } 246 }
253 return element; 247 return element;
254 } 248 }
255 249
256 Element visitFunctionExpression(FunctionExpression node) { 250 Element visitFunctionExpression(FunctionExpression node) {
257 // This is a function typed parameter. 251 // This is a function typed parameter.
258 Modifiers modifiers = currentDefinitions.modifiers; 252 Modifiers modifiers = currentDefinitions.modifiers;
259 if (modifiers.isFinal) { 253 if (modifiers.isFinal) {
260 reporter.reportErrorMessage( 254 reporter.reportErrorMessage(
261 modifiers, 255 modifiers, MessageKind.FINAL_FUNCTION_TYPE_PARAMETER);
262 MessageKind.FINAL_FUNCTION_TYPE_PARAMETER);
263 } 256 }
264 if (modifiers.isVar) { 257 if (modifiers.isVar) {
265 reporter.reportErrorMessage( 258 reporter.reportErrorMessage(
266 modifiers, MessageKind.VAR_FUNCTION_TYPE_PARAMETER); 259 modifiers, MessageKind.VAR_FUNCTION_TYPE_PARAMETER);
267 } 260 }
268 261
269 return createParameter(node.name, null); 262 return createParameter(node.name, null);
270 } 263 }
271 264
272 LinkBuilder<Element> analyzeNodes(Link<Node> link) { 265 LinkBuilder<Element> analyzeNodes(Link<Node> link) {
273 LinkBuilder<Element> elements = new LinkBuilder<Element>(); 266 LinkBuilder<Element> elements = new LinkBuilder<Element>();
274 for (; !link.isEmpty; link = link.tail) { 267 for (; !link.isEmpty; link = link.tail) {
275 Element element = link.head.accept(this); 268 Element element = link.head.accept(this);
276 if (element != null) { 269 if (element != null) {
277 elements.addLast(element); 270 elements.addLast(element);
278 } else { 271 } else {
279 // If parameter is null, the current node should be the last, 272 // If parameter is null, the current node should be the last,
280 // and a list of optional named parameters. 273 // and a list of optional named parameters.
281 if (!link.tail.isEmpty || (link.head is !NodeList)) { 274 if (!link.tail.isEmpty || (link.head is! NodeList)) {
282 reporter.internalError(link.head, "expected optional parameters"); 275 reporter.internalError(link.head, "expected optional parameters");
283 } 276 }
284 } 277 }
285 } 278 }
286 return elements; 279 return elements;
287 } 280 }
288 281
289 /** 282 /**
290 * Resolves formal parameters and return type of a [FunctionExpression] 283 * Resolves formal parameters and return type of a [FunctionExpression]
291 * to a [FunctionSignature]. 284 * to a [FunctionSignature].
292 * 285 *
293 * If [createRealParameters] is `true`, the parameters will be 286 * If [createRealParameters] is `true`, the parameters will be
294 * real parameters implementing the [ParameterElement] interface. Otherwise, 287 * real parameters implementing the [ParameterElement] interface. Otherwise,
295 * the parameters will only implement [FormalElement]. 288 * the parameters will only implement [FormalElement].
296 */ 289 */
297 static FunctionSignature analyze( 290 static FunctionSignature analyze(
298 Compiler compiler, 291 Compiler compiler,
299 NodeList formalParameters, 292 NodeList formalParameters,
300 Node returnNode, 293 Node returnNode,
301 FunctionTypedElement element, 294 FunctionTypedElement element,
302 ResolutionRegistry registry, 295 ResolutionRegistry registry,
303 {MessageKind defaultValuesError, 296 {MessageKind defaultValuesError,
304 bool createRealParameters: false, 297 bool createRealParameters: false,
305 bool isFunctionExpression: false}) { 298 bool isFunctionExpression: false}) {
306 DiagnosticReporter reporter = compiler.reporter; 299 DiagnosticReporter reporter = compiler.reporter;
307 300
308 SignatureResolver visitor = new SignatureResolver(compiler, element, 301 SignatureResolver visitor = new SignatureResolver(
309 registry, defaultValuesError: defaultValuesError, 302 compiler, element, registry,
303 defaultValuesError: defaultValuesError,
310 createRealParameters: createRealParameters); 304 createRealParameters: createRealParameters);
311 List<Element> parameters = const <Element>[]; 305 List<Element> parameters = const <Element>[];
312 int requiredParameterCount = 0; 306 int requiredParameterCount = 0;
313 if (formalParameters == null) { 307 if (formalParameters == null) {
314 if (!element.isGetter) { 308 if (!element.isGetter) {
315 if (element.isMalformed) { 309 if (element.isMalformed) {
316 // If the element is erroneous, an error should already have been 310 // If the element is erroneous, an error should already have been
317 // reported. In the case of parse errors, it is possible that there 311 // reported. In the case of parse errors, it is possible that there
318 // are formal parameters, but something else in the method failed to 312 // are formal parameters, but something else in the method failed to
319 // parse. So we suppress the message about missing formals. 313 // parse. So we suppress the message about missing formals.
320 assert(invariant(element, compiler.compilationFailed)); 314 assert(invariant(element, compiler.compilationFailed));
321 } else { 315 } else {
322 reporter.reportErrorMessage(element, MessageKind.MISSING_FORMALS); 316 reporter.reportErrorMessage(element, MessageKind.MISSING_FORMALS);
323 } 317 }
324 } 318 }
325 } else { 319 } else {
326 if (element.isGetter) { 320 if (element.isGetter) {
327 if (!identical(formalParameters.endToken.next.stringValue, 321 if (!identical(
328 // TODO(ahe): Remove the check for native keyword. 322 formalParameters.endToken.next.stringValue,
329 'native')) { 323 // TODO(ahe): Remove the check for native keyword.
324 'native')) {
330 reporter.reportErrorMessage( 325 reporter.reportErrorMessage(
331 formalParameters, 326 formalParameters, MessageKind.EXTRA_FORMALS);
332 MessageKind.EXTRA_FORMALS);
333 } 327 }
334 } 328 }
335 LinkBuilder<Element> parametersBuilder = 329 LinkBuilder<Element> parametersBuilder =
336 visitor.analyzeNodes(formalParameters.nodes); 330 visitor.analyzeNodes(formalParameters.nodes);
337 requiredParameterCount = parametersBuilder.length; 331 requiredParameterCount = parametersBuilder.length;
338 parameters = parametersBuilder.toList(); 332 parameters = parametersBuilder.toList();
339 } 333 }
340 DartType returnType; 334 DartType returnType;
341 if (element.isFactoryConstructor) { 335 if (element.isFactoryConstructor) {
342 returnType = element.enclosingClass.thisType; 336 returnType = element.enclosingClass.thisType;
343 // Because there is no type annotation for the return type of 337 // Because there is no type annotation for the return type of
344 // this element, we explicitly add one. 338 // this element, we explicitly add one.
345 if (compiler.options.enableTypeAssertions) { 339 if (compiler.options.enableTypeAssertions) {
346 registry.registerTypeUse(new TypeUse.checkedModeCheck(returnType)); 340 registry.registerTypeUse(new TypeUse.checkedModeCheck(returnType));
347 } 341 }
348 } else { 342 } else {
349 AsyncMarker asyncMarker = AsyncMarker.SYNC; 343 AsyncMarker asyncMarker = AsyncMarker.SYNC;
350 if (isFunctionExpression) { 344 if (isFunctionExpression) {
351 // Use async marker to determine the return type of function 345 // Use async marker to determine the return type of function
352 // expressions. 346 // expressions.
353 FunctionElement function = element; 347 FunctionElement function = element;
354 asyncMarker = function.asyncMarker; 348 asyncMarker = function.asyncMarker;
355 } 349 }
356 switch (asyncMarker) { 350 switch (asyncMarker) {
357 case AsyncMarker.SYNC: 351 case AsyncMarker.SYNC:
358 returnType = visitor.resolveReturnType(returnNode); 352 returnType = visitor.resolveReturnType(returnNode);
359 break; 353 break;
360 case AsyncMarker.SYNC_STAR: 354 case AsyncMarker.SYNC_STAR:
361 returnType = compiler.coreTypes.iterableType(); 355 returnType = compiler.coreTypes.iterableType();
362 break; 356 break;
363 case AsyncMarker.ASYNC: 357 case AsyncMarker.ASYNC:
364 returnType = compiler.coreTypes.futureType(); 358 returnType = compiler.coreTypes.futureType();
365 break; 359 break;
366 case AsyncMarker.ASYNC_STAR: 360 case AsyncMarker.ASYNC_STAR:
367 returnType = compiler.coreTypes.streamType(); 361 returnType = compiler.coreTypes.streamType();
368 break; 362 break;
369 } 363 }
370 } 364 }
371 365
372 if (element.isSetter && (requiredParameterCount != 1 || 366 if (element.isSetter &&
373 visitor.optionalParameterCount != 0)) { 367 (requiredParameterCount != 1 || visitor.optionalParameterCount != 0)) {
374 // If there are no formal parameters, we already reported an error above. 368 // If there are no formal parameters, we already reported an error above.
375 if (formalParameters != null) { 369 if (formalParameters != null) {
376 reporter.reportErrorMessage( 370 reporter.reportErrorMessage(
377 formalParameters, 371 formalParameters, MessageKind.ILLEGAL_SETTER_FORMALS);
378 MessageKind.ILLEGAL_SETTER_FORMALS);
379 } 372 }
380 } 373 }
381 LinkBuilder<DartType> parameterTypes = new LinkBuilder<DartType>(); 374 LinkBuilder<DartType> parameterTypes = new LinkBuilder<DartType>();
382 for (FormalElement parameter in parameters) { 375 for (FormalElement parameter in parameters) {
383 parameterTypes.addLast(parameter.type); 376 parameterTypes.addLast(parameter.type);
384 } 377 }
385 List<DartType> optionalParameterTypes = const <DartType>[]; 378 List<DartType> optionalParameterTypes = const <DartType>[];
386 List<String> namedParameters = const <String>[]; 379 List<String> namedParameters = const <String>[];
387 List<DartType> namedParameterTypes = const <DartType>[]; 380 List<DartType> namedParameterTypes = const <DartType>[];
388 List<Element> orderedOptionalParameters = 381 List<Element> orderedOptionalParameters =
389 visitor.optionalParameters.toList(); 382 visitor.optionalParameters.toList();
390 if (visitor.optionalParametersAreNamed) { 383 if (visitor.optionalParametersAreNamed) {
391 // TODO(karlklose); replace when [visitor.optinalParameters] is a [List]. 384 // TODO(karlklose); replace when [visitor.optinalParameters] is a [List].
392 orderedOptionalParameters.sort((Element a, Element b) { 385 orderedOptionalParameters.sort((Element a, Element b) {
393 return a.name.compareTo(b.name); 386 return a.name.compareTo(b.name);
394 }); 387 });
395 LinkBuilder<String> namedParametersBuilder = new LinkBuilder<String>(); 388 LinkBuilder<String> namedParametersBuilder = new LinkBuilder<String>();
396 LinkBuilder<DartType> namedParameterTypesBuilder = 389 LinkBuilder<DartType> namedParameterTypesBuilder =
397 new LinkBuilder<DartType>(); 390 new LinkBuilder<DartType>();
398 for (FormalElement parameter in orderedOptionalParameters) { 391 for (FormalElement parameter in orderedOptionalParameters) {
399 namedParametersBuilder.addLast(parameter.name); 392 namedParametersBuilder.addLast(parameter.name);
400 namedParameterTypesBuilder.addLast(parameter.type); 393 namedParameterTypesBuilder.addLast(parameter.type);
401 } 394 }
402 namedParameters = namedParametersBuilder.toLink().toList(growable: false); 395 namedParameters = namedParametersBuilder.toLink().toList(growable: false);
403 namedParameterTypes = namedParameterTypesBuilder.toLink() 396 namedParameterTypes =
404 .toList(growable: false); 397 namedParameterTypesBuilder.toLink().toList(growable: false);
405 } else { 398 } else {
406 // TODO(karlklose); replace when [visitor.optinalParameters] is a [List]. 399 // TODO(karlklose); replace when [visitor.optinalParameters] is a [List].
407 LinkBuilder<DartType> optionalParameterTypesBuilder = 400 LinkBuilder<DartType> optionalParameterTypesBuilder =
408 new LinkBuilder<DartType>(); 401 new LinkBuilder<DartType>();
409 for (FormalElement parameter in visitor.optionalParameters) { 402 for (FormalElement parameter in visitor.optionalParameters) {
410 optionalParameterTypesBuilder.addLast(parameter.type); 403 optionalParameterTypesBuilder.addLast(parameter.type);
411 } 404 }
412 optionalParameterTypes = optionalParameterTypesBuilder.toLink() 405 optionalParameterTypes =
413 .toList(growable: false); 406 optionalParameterTypesBuilder.toLink().toList(growable: false);
414 } 407 }
415 FunctionType type = new FunctionType( 408 FunctionType type = new FunctionType(
416 element.declaration, 409 element.declaration,
417 returnType, 410 returnType,
418 parameterTypes.toLink().toList(growable: false), 411 parameterTypes.toLink().toList(growable: false),
419 optionalParameterTypes, 412 optionalParameterTypes,
420 namedParameters, 413 namedParameters,
421 namedParameterTypes); 414 namedParameterTypes);
422 return new FunctionSignatureX( 415 return new FunctionSignatureX(
423 requiredParameters: parameters, 416 requiredParameters: parameters,
(...skipping 15 matching lines...) Expand all
439 432
440 DartType resolveReturnType(TypeAnnotation annotation) { 433 DartType resolveReturnType(TypeAnnotation annotation) {
441 if (annotation == null) return const DynamicType(); 434 if (annotation == null) return const DynamicType();
442 DartType result = resolver.resolveTypeAnnotation(annotation); 435 DartType result = resolver.resolveTypeAnnotation(annotation);
443 if (result == null) { 436 if (result == null) {
444 return const DynamicType(); 437 return const DynamicType();
445 } 438 }
446 return result; 439 return result;
447 } 440 }
448 } 441 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/resolution/send_structure.dart ('k') | pkg/compiler/lib/src/resolution/tree_elements.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698