| 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 '../common/resolution.dart'; | 8 import '../common/resolution.dart'; |
| 9 import '../elements/resolution_types.dart'; | 9 import '../elements/resolution_types.dart'; |
| 10 import '../elements/elements.dart'; | 10 import '../elements/elements.dart'; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 reporter.reportErrorMessage(node, MessageKind.FORMAL_DECLARED_CONST); | 87 reporter.reportErrorMessage(node, MessageKind.FORMAL_DECLARED_CONST); |
| 88 } | 88 } |
| 89 if (node.modifiers.isStatic) { | 89 if (node.modifiers.isStatic) { |
| 90 reporter.reportErrorMessage(node, MessageKind.FORMAL_DECLARED_STATIC); | 90 reporter.reportErrorMessage(node, MessageKind.FORMAL_DECLARED_STATIC); |
| 91 } | 91 } |
| 92 | 92 |
| 93 if (currentDefinitions != null) { | 93 if (currentDefinitions != null) { |
| 94 reporter.internalError(node, 'function type parameters not supported'); | 94 reporter.internalError(node, 'function type parameters not supported'); |
| 95 } | 95 } |
| 96 currentDefinitions = node; | 96 currentDefinitions = node; |
| 97 FormalElementX element = definition == null | 97 FormalElementX element = definition.accept(this); |
| 98 ? createUnnamedParameter() // This happens in function types. | |
| 99 : definition.accept(this); | |
| 100 if (currentDefinitions.metadata != null) { | 98 if (currentDefinitions.metadata != null) { |
| 101 element.metadataInternal = | 99 element.metadataInternal = |
| 102 resolution.resolver.resolveMetadata(element, node); | 100 resolution.resolver.resolveMetadata(element, node); |
| 103 } | 101 } |
| 104 currentDefinitions = null; | 102 currentDefinitions = null; |
| 105 return element; | 103 return element; |
| 106 } | 104 } |
| 107 | 105 |
| 108 void validateName(Identifier node) { | 106 void validateName(Identifier node) { |
| 109 if (isOptionalParameter && | 107 if (isOptionalParameter && |
| 110 optionalParametersAreNamed && | 108 optionalParametersAreNamed && |
| 111 Name.isPrivateName(node.source)) { | 109 Name.isPrivateName(node.source)) { |
| 112 reporter.reportErrorMessage(node, MessageKind.PRIVATE_NAMED_PARAMETER); | 110 reporter.reportErrorMessage(node, MessageKind.PRIVATE_NAMED_PARAMETER); |
| 113 } | 111 } |
| 114 } | 112 } |
| 115 | 113 |
| 116 void computeParameterType(FormalElementX element, | 114 void computeParameterType(FormalElementX element, |
| 117 [VariableElement fieldElement]) { | 115 [VariableElement fieldElement]) { |
| 118 // Function-type as in `foo(int bar(String x))` | 116 void computeFunctionType(FunctionExpression functionExpression) { |
| 119 void computeInlineFunctionType(FunctionExpression functionExpression) { | |
| 120 FunctionSignature functionSignature = SignatureResolver.analyze( | 117 FunctionSignature functionSignature = SignatureResolver.analyze( |
| 121 resolution, | 118 resolution, |
| 122 scope, | 119 scope, |
| 123 functionExpression.typeVariables, | 120 functionExpression.typeVariables, |
| 124 functionExpression.parameters, | 121 functionExpression.parameters, |
| 125 functionExpression.returnType, | 122 functionExpression.returnType, |
| 126 element, | 123 element, |
| 127 registry, | 124 registry, |
| 128 defaultValuesError: MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT); | 125 defaultValuesError: MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT); |
| 129 element.functionSignature = functionSignature; | 126 element.functionSignature = functionSignature; |
| 130 } | 127 } |
| 131 | 128 |
| 132 if (currentDefinitions.type != null) { | 129 if (currentDefinitions.type != null) { |
| 133 element.typeCache = resolveTypeAnnotation(currentDefinitions.type); | 130 element.typeCache = resolveTypeAnnotation(currentDefinitions.type); |
| 134 } else { | 131 } else { |
| 135 // Is node.definitions exactly one FunctionExpression? | 132 // Is node.definitions exactly one FunctionExpression? |
| 136 Link<Node> link = currentDefinitions.definitions.nodes; | 133 Link<Node> link = currentDefinitions.definitions.nodes; |
| 137 assert(invariant(currentDefinitions, !link.isEmpty)); | 134 assert(invariant(currentDefinitions, !link.isEmpty)); |
| 138 assert(invariant(currentDefinitions, link.tail.isEmpty)); | 135 assert(invariant(currentDefinitions, link.tail.isEmpty)); |
| 139 if (link.head.asFunctionExpression() != null) { | 136 if (link.head.asFunctionExpression() != null) { |
| 140 // Inline function typed parameter, like `void m(int f(String s))`. | 137 // Inline function typed parameter, like `void m(int f(String s))`. |
| 141 computeInlineFunctionType(link.head); | 138 computeFunctionType(link.head); |
| 142 } else if (link.head.asSend() != null && | 139 } else if (link.head.asSend() != null && |
| 143 link.head.asSend().selector.asFunctionExpression() != null) { | 140 link.head.asSend().selector.asFunctionExpression() != null) { |
| 144 // Inline function typed initializing formal or | 141 // Inline function typed initializing formal or |
| 145 // parameter with default value, like `C(int this.f(String s))` or | 142 // parameter with default value, like `C(int this.f(String s))` or |
| 146 // `void m([int f(String s) = null])`. | 143 // `void m([int f(String s) = null])`. |
| 147 computeInlineFunctionType( | 144 computeFunctionType(link.head.asSend().selector.asFunctionExpression()); |
| 148 link.head.asSend().selector.asFunctionExpression()); | |
| 149 } else { | 145 } else { |
| 150 assert(invariant(currentDefinitions, | 146 assert(invariant(currentDefinitions, |
| 151 link.head.asIdentifier() != null || link.head.asSend() != null)); | 147 link.head.asIdentifier() != null || link.head.asSend() != null)); |
| 152 if (fieldElement != null) { | 148 if (fieldElement != null) { |
| 153 element.typeCache = fieldElement.computeType(resolution); | 149 element.typeCache = fieldElement.computeType(resolution); |
| 154 } else { | 150 } else { |
| 155 element.typeCache = const ResolutionDynamicType(); | 151 element.typeCache = const ResolutionDynamicType(); |
| 156 } | 152 } |
| 157 } | 153 } |
| 158 } | 154 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 enclosingElement, currentDefinitions, name, initializer, | 191 enclosingElement, currentDefinitions, name, initializer, |
| 196 isOptional: isOptionalParameter, isNamed: optionalParametersAreNamed); | 192 isOptional: isOptionalParameter, isNamed: optionalParametersAreNamed); |
| 197 } else { | 193 } else { |
| 198 parameter = new FormalElementX( | 194 parameter = new FormalElementX( |
| 199 ElementKind.PARAMETER, enclosingElement, currentDefinitions, name); | 195 ElementKind.PARAMETER, enclosingElement, currentDefinitions, name); |
| 200 } | 196 } |
| 201 computeParameterType(parameter); | 197 computeParameterType(parameter); |
| 202 return parameter; | 198 return parameter; |
| 203 } | 199 } |
| 204 | 200 |
| 205 FormalElementX createUnnamedParameter() { | |
| 206 FormalElementX parameter; | |
| 207 assert(!createRealParameters); | |
| 208 parameter = new FormalElementX.unnamed( | |
| 209 ElementKind.PARAMETER, enclosingElement, currentDefinitions); | |
| 210 computeParameterType(parameter); | |
| 211 return parameter; | |
| 212 } | |
| 213 | |
| 214 InitializingFormalElementX createFieldParameter( | 201 InitializingFormalElementX createFieldParameter( |
| 215 Send node, Expression initializer) { | 202 Send node, Expression initializer) { |
| 216 InitializingFormalElementX element; | 203 InitializingFormalElementX element; |
| 217 Identifier receiver = node.receiver.asIdentifier(); | 204 Identifier receiver = node.receiver.asIdentifier(); |
| 218 if (receiver == null || !receiver.isThis()) { | 205 if (receiver == null || !receiver.isThis()) { |
| 219 reporter.reportErrorMessage(node, MessageKind.INVALID_PARAMETER); | 206 reporter.reportErrorMessage(node, MessageKind.INVALID_PARAMETER); |
| 220 return new ErroneousInitializingFormalElementX( | 207 return new ErroneousInitializingFormalElementX( |
| 221 getParameterName(node), enclosingElement); | 208 getParameterName(node), enclosingElement); |
| 222 } else { | 209 } else { |
| 223 if (!enclosingElement.isGenerativeConstructor) { | 210 if (!enclosingElement.isGenerativeConstructor) { |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 for (FormalElement parameter in parameters) { | 414 for (FormalElement parameter in parameters) { |
| 428 parameterTypes.addLast(parameter.type); | 415 parameterTypes.addLast(parameter.type); |
| 429 } | 416 } |
| 430 List<ResolutionDartType> optionalParameterTypes = | 417 List<ResolutionDartType> optionalParameterTypes = |
| 431 const <ResolutionDartType>[]; | 418 const <ResolutionDartType>[]; |
| 432 List<String> namedParameters = const <String>[]; | 419 List<String> namedParameters = const <String>[]; |
| 433 List<ResolutionDartType> namedParameterTypes = const <ResolutionDartType>[]; | 420 List<ResolutionDartType> namedParameterTypes = const <ResolutionDartType>[]; |
| 434 List<Element> orderedOptionalParameters = | 421 List<Element> orderedOptionalParameters = |
| 435 visitor.optionalParameters.toList(); | 422 visitor.optionalParameters.toList(); |
| 436 if (visitor.optionalParametersAreNamed) { | 423 if (visitor.optionalParametersAreNamed) { |
| 437 // TODO(karlklose); replace when [visitor.optionalParameters] is a [List]. | 424 // TODO(karlklose); replace when [visitor.optinalParameters] is a [List]. |
| 438 orderedOptionalParameters.sort((Element a, Element b) { | 425 orderedOptionalParameters.sort((Element a, Element b) { |
| 439 return a.name.compareTo(b.name); | 426 return a.name.compareTo(b.name); |
| 440 }); | 427 }); |
| 441 LinkBuilder<String> namedParametersBuilder = new LinkBuilder<String>(); | 428 LinkBuilder<String> namedParametersBuilder = new LinkBuilder<String>(); |
| 442 LinkBuilder<ResolutionDartType> namedParameterTypesBuilder = | 429 LinkBuilder<ResolutionDartType> namedParameterTypesBuilder = |
| 443 new LinkBuilder<ResolutionDartType>(); | 430 new LinkBuilder<ResolutionDartType>(); |
| 444 for (FormalElement parameter in orderedOptionalParameters) { | 431 for (FormalElement parameter in orderedOptionalParameters) { |
| 445 namedParametersBuilder.addLast(parameter.name); | 432 namedParametersBuilder.addLast(parameter.name); |
| 446 namedParameterTypesBuilder.addLast(parameter.type); | 433 namedParameterTypesBuilder.addLast(parameter.type); |
| 447 } | 434 } |
| 448 namedParameters = namedParametersBuilder.toLink().toList(growable: false); | 435 namedParameters = namedParametersBuilder.toLink().toList(growable: false); |
| 449 namedParameterTypes = | 436 namedParameterTypes = |
| 450 namedParameterTypesBuilder.toLink().toList(growable: false); | 437 namedParameterTypesBuilder.toLink().toList(growable: false); |
| 451 } else { | 438 } else { |
| 452 // TODO(karlklose); replace when [visitor.optionalParameters] is a [List]. | 439 // TODO(karlklose); replace when [visitor.optinalParameters] is a [List]. |
| 453 LinkBuilder<ResolutionDartType> optionalParameterTypesBuilder = | 440 LinkBuilder<ResolutionDartType> optionalParameterTypesBuilder = |
| 454 new LinkBuilder<ResolutionDartType>(); | 441 new LinkBuilder<ResolutionDartType>(); |
| 455 for (FormalElement parameter in visitor.optionalParameters) { | 442 for (FormalElement parameter in visitor.optionalParameters) { |
| 456 optionalParameterTypesBuilder.addLast(parameter.type); | 443 optionalParameterTypesBuilder.addLast(parameter.type); |
| 457 } | 444 } |
| 458 optionalParameterTypes = | 445 optionalParameterTypes = |
| 459 optionalParameterTypesBuilder.toLink().toList(growable: false); | 446 optionalParameterTypesBuilder.toLink().toList(growable: false); |
| 460 } | 447 } |
| 461 ResolutionFunctionType type = new ResolutionFunctionType( | 448 ResolutionFunctionType type = new ResolutionFunctionType( |
| 462 element.declaration, | 449 element.declaration, |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 /// variables of the function signature itself when its signature is analyzed. | 485 /// variables of the function signature itself when its signature is analyzed. |
| 499 class FunctionSignatureBuildingScope extends TypeVariablesScope { | 486 class FunctionSignatureBuildingScope extends TypeVariablesScope { |
| 500 @override | 487 @override |
| 501 final List<ResolutionDartType> typeVariables; | 488 final List<ResolutionDartType> typeVariables; |
| 502 | 489 |
| 503 FunctionSignatureBuildingScope(Scope parent, this.typeVariables) | 490 FunctionSignatureBuildingScope(Scope parent, this.typeVariables) |
| 504 : super(parent); | 491 : super(parent); |
| 505 | 492 |
| 506 String toString() => 'FunctionSignatureBuildingScope($typeVariables)'; | 493 String toString() => 'FunctionSignatureBuildingScope($typeVariables)'; |
| 507 } | 494 } |
| OLD | NEW |