Index: sdk/lib/_internal/compiler/implementation/resolution/signatures.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart |
deleted file mode 100644 |
index 08bb37fad28e118806c1cd5a71016bc2d8492b97..0000000000000000000000000000000000000000 |
--- a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart |
+++ /dev/null |
@@ -1,378 +0,0 @@ |
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-part of resolution; |
- |
-/** |
- * [SignatureResolver] resolves function signatures. |
- */ |
-class SignatureResolver extends MappingVisitor<FormalElementX> { |
- final ResolverVisitor resolver; |
- final FunctionTypedElement enclosingElement; |
- final Scope scope; |
- final MessageKind defaultValuesError; |
- final bool createRealParameters; |
- Link<Element> optionalParameters = const Link<Element>(); |
- int optionalParameterCount = 0; |
- bool isOptionalParameter = false; |
- bool optionalParametersAreNamed = false; |
- VariableDefinitions currentDefinitions; |
- |
- SignatureResolver(Compiler compiler, |
- FunctionTypedElement enclosingElement, |
- ResolutionRegistry registry, |
- {this.defaultValuesError, |
- this.createRealParameters}) |
- : this.enclosingElement = enclosingElement, |
- this.scope = enclosingElement.buildScope(), |
- this.resolver = |
- new ResolverVisitor(compiler, enclosingElement, registry), |
- super(compiler, registry); |
- |
- bool get defaultValuesAllowed => defaultValuesError == null; |
- |
- visitNodeList(NodeList node) { |
- // This must be a list of optional arguments. |
- String value = node.beginToken.stringValue; |
- if ((!identical(value, '[')) && (!identical(value, '{'))) { |
- internalError(node, "expected optional parameters"); |
- } |
- optionalParametersAreNamed = (identical(value, '{')); |
- isOptionalParameter = true; |
- LinkBuilder<Element> elements = analyzeNodes(node.nodes); |
- optionalParameterCount = elements.length; |
- optionalParameters = elements.toLink(); |
- } |
- |
- FormalElementX visitVariableDefinitions(VariableDefinitions node) { |
- Link<Node> definitions = node.definitions.nodes; |
- if (definitions.isEmpty) { |
- internalError(node, 'no parameter definition'); |
- return null; |
- } |
- if (!definitions.tail.isEmpty) { |
- internalError(definitions.tail.head, 'extra definition'); |
- return null; |
- } |
- Node definition = definitions.head; |
- if (definition is NodeList) { |
- internalError(node, 'optional parameters are not implemented'); |
- } |
- if (node.modifiers.isConst) { |
- compiler.reportError(node, MessageKind.FORMAL_DECLARED_CONST); |
- } |
- if (node.modifiers.isStatic) { |
- compiler.reportError(node, MessageKind.FORMAL_DECLARED_STATIC); |
- } |
- |
- if (currentDefinitions != null) { |
- internalError(node, 'function type parameters not supported'); |
- } |
- currentDefinitions = node; |
- FormalElementX element = definition.accept(this); |
- if (currentDefinitions.metadata != null) { |
- element.metadata = compiler.resolver.resolveMetadata(element, node); |
- } |
- currentDefinitions = null; |
- return element; |
- } |
- |
- void validateName(Identifier node) { |
- String name = node.source; |
- if (isOptionalParameter && |
- optionalParametersAreNamed && |
- isPrivateName(node.source)) { |
- compiler.reportError(node, MessageKind.PRIVATE_NAMED_PARAMETER); |
- } |
- } |
- |
- void computeParameterType(FormalElementX element, |
- [VariableElement fieldElement]) { |
- void computeFunctionType(FunctionExpression functionExpression) { |
- FunctionSignature functionSignature = SignatureResolver.analyze( |
- compiler, functionExpression.parameters, |
- functionExpression.returnType, element, registry, |
- defaultValuesError: MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT); |
- element.functionSignatureCache = functionSignature; |
- element.typeCache = functionSignature.type; |
- } |
- |
- if (currentDefinitions.type != null) { |
- element.typeCache = resolveTypeAnnotation(currentDefinitions.type); |
- } else { |
- // Is node.definitions exactly one FunctionExpression? |
- Link<Node> link = currentDefinitions.definitions.nodes; |
- assert(invariant(currentDefinitions, !link.isEmpty)); |
- assert(invariant(currentDefinitions, link.tail.isEmpty)); |
- if (link.head.asFunctionExpression() != null) { |
- // Inline function typed parameter, like `void m(int f(String s))`. |
- computeFunctionType(link.head); |
- } else if (link.head.asSend() != null && |
- link.head.asSend().selector.asFunctionExpression() != null) { |
- // Inline function typed initializing formal or |
- // parameter with default value, like `C(int this.f(String s))` or |
- // `void m([int f(String s) = null])`. |
- computeFunctionType(link.head.asSend().selector.asFunctionExpression()); |
- } else { |
- assert(invariant(currentDefinitions, |
- link.head.asIdentifier() != null || link.head.asSend() != null)); |
- if (fieldElement != null) { |
- element.typeCache = fieldElement.computeType(compiler); |
- } else { |
- element.typeCache = const DynamicType(); |
- } |
- } |
- } |
- } |
- |
- Element visitIdentifier(Identifier node) { |
- return createParameter(node, null); |
- } |
- |
- Identifier getParameterName(Send node) { |
- var identifier = node.selector.asIdentifier(); |
- if (identifier != null) { |
- // Normal parameter: [:Type name:]. |
- return identifier; |
- } else { |
- // Function type parameter: [:void name(DartType arg):]. |
- var functionExpression = node.selector.asFunctionExpression(); |
- if (functionExpression != null && |
- functionExpression.name.asIdentifier() != null) { |
- return functionExpression.name.asIdentifier(); |
- } else { |
- internalError(node, |
- 'internal error: unimplemented receiver on parameter send'); |
- return null; |
- } |
- } |
- } |
- |
- // The only valid [Send] can be in constructors and must be of the form |
- // [:this.x:] (where [:x:] represents an instance field). |
- InitializingFormalElementX visitSend(Send node) { |
- return createFieldParameter(node, null); |
- } |
- |
- FormalElementX createParameter(Identifier name, Expression initializer) { |
- validateName(name); |
- FormalElementX parameter; |
- if (createRealParameters) { |
- parameter = new LocalParameterElementX( |
- enclosingElement, currentDefinitions, name, initializer); |
- } else { |
- parameter = new FormalElementX( |
- ElementKind.PARAMETER, enclosingElement, currentDefinitions, name); |
- } |
- computeParameterType(parameter); |
- return parameter; |
- } |
- |
- InitializingFormalElementX createFieldParameter(Send node, |
- Expression initializer) { |
- InitializingFormalElementX element; |
- if (node.receiver.asIdentifier() == null || |
- !node.receiver.asIdentifier().isThis()) { |
- error(node, MessageKind.INVALID_PARAMETER); |
- } else if (!identical(enclosingElement.kind, |
- ElementKind.GENERATIVE_CONSTRUCTOR)) { |
- error(node, MessageKind.INITIALIZING_FORMAL_NOT_ALLOWED); |
- } else { |
- Identifier name = getParameterName(node); |
- validateName(name); |
- Element fieldElement = |
- enclosingElement.enclosingClass.lookupLocalMember(name.source); |
- if (fieldElement == null || |
- !identical(fieldElement.kind, ElementKind.FIELD)) { |
- error(node, MessageKind.NOT_A_FIELD, {'fieldName': name}); |
- } else if (!fieldElement.isInstanceMember) { |
- error(node, MessageKind.NOT_INSTANCE_FIELD, {'fieldName': name}); |
- } |
- element = new InitializingFormalElementX(enclosingElement, |
- currentDefinitions, name, initializer, fieldElement); |
- computeParameterType(element, fieldElement); |
- } |
- return element; |
- } |
- |
- /// A [SendSet] node is an optional parameter with a default value. |
- Element visitSendSet(SendSet node) { |
- FormalElementX element; |
- if (node.receiver != null) { |
- element = createFieldParameter(node, node.arguments.first); |
- } else if (node.selector.asIdentifier() != null || |
- node.selector.asFunctionExpression() != null) { |
- element = createParameter(getParameterName(node), node.arguments.first); |
- } |
- Node defaultValue = node.arguments.head; |
- if (!defaultValuesAllowed) { |
- compiler.reportError(defaultValue, defaultValuesError); |
- } |
- return element; |
- } |
- |
- Element visitFunctionExpression(FunctionExpression node) { |
- // This is a function typed parameter. |
- Modifiers modifiers = currentDefinitions.modifiers; |
- if (modifiers.isFinal) { |
- compiler.reportError(modifiers, |
- MessageKind.FINAL_FUNCTION_TYPE_PARAMETER); |
- } |
- if (modifiers.isVar) { |
- compiler.reportError(modifiers, MessageKind.VAR_FUNCTION_TYPE_PARAMETER); |
- } |
- |
- return createParameter(node.name, null); |
- } |
- |
- LinkBuilder<Element> analyzeNodes(Link<Node> link) { |
- LinkBuilder<Element> elements = new LinkBuilder<Element>(); |
- for (; !link.isEmpty; link = link.tail) { |
- Element element = link.head.accept(this); |
- if (element != null) { |
- elements.addLast(element); |
- } else { |
- // If parameter is null, the current node should be the last, |
- // and a list of optional named parameters. |
- if (!link.tail.isEmpty || (link.head is !NodeList)) { |
- internalError(link.head, "expected optional parameters"); |
- } |
- } |
- } |
- return elements; |
- } |
- |
- /** |
- * Resolves formal parameters and return type of a [FunctionExpression] |
- * to a [FunctionSignature]. |
- * |
- * If [createRealParameters] is `true`, the parameters will be |
- * real parameters implementing the [ParameterElement] interface. Otherwise, |
- * the parameters will only implement [FormalElement]. |
- */ |
- static FunctionSignature analyze(Compiler compiler, |
- NodeList formalParameters, |
- Node returnNode, |
- FunctionTypedElement element, |
- ResolutionRegistry registry, |
- {MessageKind defaultValuesError, |
- bool createRealParameters: false}) { |
- SignatureResolver visitor = new SignatureResolver(compiler, element, |
- registry, defaultValuesError: defaultValuesError, |
- createRealParameters: createRealParameters); |
- Link<Element> parameters = const Link<Element>(); |
- int requiredParameterCount = 0; |
- if (formalParameters == null) { |
- if (!element.isGetter) { |
- if (element.isErroneous) { |
- // If the element is erroneous, an error should already have been |
- // reported. In the case of parse errors, it is possible that there |
- // are formal parameters, but something else in the method failed to |
- // parse. So we suppress the message about missing formals. |
- assert(invariant(element, compiler.compilationFailed)); |
- } else { |
- compiler.reportError(element, MessageKind.MISSING_FORMALS); |
- } |
- } |
- } else { |
- if (element.isGetter) { |
- if (!identical(formalParameters.endToken.next.stringValue, |
- // TODO(ahe): Remove the check for native keyword. |
- 'native')) { |
- compiler.reportError(formalParameters, |
- MessageKind.EXTRA_FORMALS); |
- } |
- } |
- LinkBuilder<Element> parametersBuilder = |
- visitor.analyzeNodes(formalParameters.nodes); |
- requiredParameterCount = parametersBuilder.length; |
- parameters = parametersBuilder.toLink(); |
- } |
- DartType returnType; |
- if (element.isFactoryConstructor) { |
- returnType = element.enclosingClass.thisType; |
- // Because there is no type annotation for the return type of |
- // this element, we explicitly add one. |
- if (compiler.enableTypeAssertions) { |
- registry.registerIsCheck(returnType); |
- } |
- } else { |
- returnType = visitor.resolveReturnType(returnNode); |
- } |
- |
- if (element.isSetter && (requiredParameterCount != 1 || |
- visitor.optionalParameterCount != 0)) { |
- // If there are no formal parameters, we already reported an error above. |
- if (formalParameters != null) { |
- compiler.reportError(formalParameters, |
- MessageKind.ILLEGAL_SETTER_FORMALS); |
- } |
- } |
- LinkBuilder<DartType> parameterTypes = new LinkBuilder<DartType>(); |
- for (FormalElement parameter in parameters) { |
- parameterTypes.addLast(parameter.type); |
- } |
- List<DartType> optionalParameterTypes = const <DartType>[]; |
- List<String> namedParameters = const <String>[]; |
- List<DartType> namedParameterTypes = const <DartType>[]; |
- List<Element> orderedOptionalParameters = |
- visitor.optionalParameters.toList(); |
- if (visitor.optionalParametersAreNamed) { |
- // TODO(karlklose); replace when [visitor.optinalParameters] is a [List]. |
- orderedOptionalParameters.sort((Element a, Element b) { |
- return a.name.compareTo(b.name); |
- }); |
- LinkBuilder<String> namedParametersBuilder = new LinkBuilder<String>(); |
- LinkBuilder<DartType> namedParameterTypesBuilder = |
- new LinkBuilder<DartType>(); |
- for (FormalElement parameter in orderedOptionalParameters) { |
- namedParametersBuilder.addLast(parameter.name); |
- namedParameterTypesBuilder.addLast(parameter.type); |
- } |
- namedParameters = namedParametersBuilder.toLink().toList(growable: false); |
- namedParameterTypes = namedParameterTypesBuilder.toLink() |
- .toList(growable: false); |
- } else { |
- // TODO(karlklose); replace when [visitor.optinalParameters] is a [List]. |
- LinkBuilder<DartType> optionalParameterTypesBuilder = |
- new LinkBuilder<DartType>(); |
- for (FormalElement parameter in visitor.optionalParameters) { |
- optionalParameterTypesBuilder.addLast(parameter.type); |
- } |
- optionalParameterTypes = optionalParameterTypesBuilder.toLink() |
- .toList(growable: false); |
- } |
- FunctionType type = new FunctionType( |
- element.declaration, |
- returnType, |
- parameterTypes.toLink().toList(growable: false), |
- optionalParameterTypes, |
- namedParameters, |
- namedParameterTypes); |
- return new FunctionSignatureX(parameters, |
- visitor.optionalParameters, |
- requiredParameterCount, |
- visitor.optionalParameterCount, |
- visitor.optionalParametersAreNamed, |
- orderedOptionalParameters, |
- type); |
- } |
- |
- DartType resolveTypeAnnotation(TypeAnnotation annotation) { |
- DartType type = resolveReturnType(annotation); |
- if (type.isVoid) { |
- compiler.reportError(annotation, MessageKind.VOID_NOT_ALLOWED); |
- } |
- return type; |
- } |
- |
- DartType resolveReturnType(TypeAnnotation annotation) { |
- if (annotation == null) return const DynamicType(); |
- DartType result = resolver.resolveTypeAnnotation(annotation); |
- if (result == null) { |
- return const DynamicType(); |
- } |
- return result; |
- } |
-} |