| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 } | 
| OLD | NEW | 
|---|