Index: dart/compiler/java/com/google/dart/compiler/resolver/ResolutionContext.java |
diff --git a/dart/compiler/java/com/google/dart/compiler/resolver/ResolutionContext.java b/dart/compiler/java/com/google/dart/compiler/resolver/ResolutionContext.java |
deleted file mode 100644 |
index c1522c3a7a09305d0fc3dbf31933b37f8e2b5712..0000000000000000000000000000000000000000 |
--- a/dart/compiler/java/com/google/dart/compiler/resolver/ResolutionContext.java |
+++ /dev/null |
@@ -1,408 +0,0 @@ |
-// Copyright (c) 2012, 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. |
- |
-package com.google.dart.compiler.resolver; |
-import com.google.common.annotations.VisibleForTesting; |
-import com.google.dart.compiler.DartCompilationError; |
-import com.google.dart.compiler.DartCompilerContext; |
-import com.google.dart.compiler.ErrorCode; |
-import com.google.dart.compiler.ErrorSeverity; |
-import com.google.dart.compiler.PackageLibraryManager; |
-import com.google.dart.compiler.Source; |
-import com.google.dart.compiler.SubSystem; |
-import com.google.dart.compiler.ast.ASTVisitor; |
-import com.google.dart.compiler.ast.DartClassTypeAlias; |
-import com.google.dart.compiler.ast.DartFunctionExpression; |
-import com.google.dart.compiler.ast.DartFunctionTypeAlias; |
-import com.google.dart.compiler.ast.DartIdentifier; |
-import com.google.dart.compiler.ast.DartNode; |
-import com.google.dart.compiler.ast.DartPropertyAccess; |
-import com.google.dart.compiler.ast.DartSyntheticErrorIdentifier; |
-import com.google.dart.compiler.ast.DartTypeNode; |
-import com.google.dart.compiler.ast.LibraryUnit; |
-import com.google.dart.compiler.ast.Modifiers; |
-import com.google.dart.compiler.common.HasSourceInfo; |
-import com.google.dart.compiler.common.SourceInfo; |
-import com.google.dart.compiler.parser.DartParser; |
-import com.google.dart.compiler.type.InterfaceType; |
-import com.google.dart.compiler.type.Type; |
-import com.google.dart.compiler.type.TypeKind; |
-import com.google.dart.compiler.type.TypeVariable; |
-import com.google.dart.compiler.type.Types; |
- |
-import java.util.Arrays; |
-import java.util.List; |
- |
- |
-/** |
- * Resolution context for resolution of Dart programs. The initial context is |
- * derived from the library scope, which is then extended with class scope, |
- * method scope, and block scope as the program is traversed. |
- */ |
-@VisibleForTesting |
-public class ResolutionContext implements ResolutionErrorListener { |
- private Scope scope; |
- private final DartCompilerContext context; |
- private final CoreTypeProvider typeProvider; |
- private final boolean suppressSdkWarnings; |
- |
- ResolutionContext(String name, LibraryElement library, DartCompilerContext context, |
- CoreTypeProvider typeProvider) { |
- this(new Scope(name, library), context, typeProvider); |
- } |
- |
- @VisibleForTesting |
- public ResolutionContext(Scope scope, DartCompilerContext context, |
- CoreTypeProvider typeProvider) { |
- this.scope = scope; |
- this.context = context; |
- this.typeProvider = typeProvider; |
- this.suppressSdkWarnings = context.getCompilerConfiguration().getCompilerOptions() |
- .suppressSdkWarnings(); |
- } |
- |
- ResolutionContext(LibraryUnit unit, DartCompilerContext context, CoreTypeProvider typeProvider) { |
- this(unit.getElement().getScope(), context, typeProvider); |
- } |
- |
- @VisibleForTesting |
- public ResolutionContext extend(ClassElement element) { |
- return new ResolutionContext(new ClassScope(element, scope), context, typeProvider); |
- } |
- |
- ResolutionContext extend(String name) { |
- return new ResolutionContext(new Scope(name, scope.getLibrary(), scope), context, typeProvider); |
- } |
- |
- Scope getScope() { |
- return scope; |
- } |
- |
- void declare(Element element, ErrorCode errorCode) { |
- String name = element.getName(); |
- Element existingLocalElement = scope.findLocalElement(name); |
- // Check for duplicate declaration in the same scope. |
- if (existingLocalElement != null && errorCode != null) { |
- SourceInfo nameSourceInfo = element.getNameLocation(); |
- String existingLocation = Elements.getRelativeElementLocation(element, existingLocalElement); |
- onError(nameSourceInfo, errorCode, name, existingLocation); |
- } |
- // Declare, may be hide existing element. |
- scope.declareElement(name, element); |
- } |
- |
- void pushScope(String name) { |
- scope = new Scope(name, scope.getLibrary(), scope); |
- } |
- |
- void popScope() { |
- scope = scope.getParent(); |
- } |
- |
- /** |
- * Returns <code>true</code> if the type is dynamic or an interface type where |
- * {@link ClassElement#isInterface()} equals <code>isInterface</code>. |
- */ |
- private boolean isInterfaceEquals(Type type, boolean isInterface) { |
- switch (type.getKind()) { |
- case DYNAMIC: |
- // Considered to be a match. |
- return true; |
- |
- case INTERFACE: |
- InterfaceType interfaceType = (InterfaceType) type; |
- ClassElement element = interfaceType.getElement(); |
- return (element != null && element.isInterface() == isInterface); |
- |
- default: |
- break; |
- } |
- |
- return false; |
- } |
- |
- /** |
- * Returns <code>true</code> if the type is dynamic or is a class type. |
- */ |
- private boolean isClassType(Type type) { |
- return isInterfaceEquals(type, false); |
- } |
- |
- /** |
- * Returns <code>true</code> if the type is a class or interface type. |
- */ |
- private boolean isClassOrInterfaceType(Type type) { |
- return type.getKind() == TypeKind.INTERFACE |
- && ((InterfaceType) type).getElement() != null; |
- } |
- |
- /** |
- * To resolve the class<typeparameters?> specified for extends on a class definition. |
- */ |
- InterfaceType resolveClass(DartTypeNode node, boolean isStatic, boolean isFactory) { |
- if (node == null) { |
- return null; |
- } |
- |
- Type type = resolveType(node, isStatic, isFactory, false, ResolverErrorCode.NO_SUCH_TYPE, |
- ResolverErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS); |
- if (!isClassType(type)) { |
- onError(node.getIdentifier(), ResolverErrorCode.NOT_A_CLASS, type); |
- type = typeProvider.getDynamicType(); |
- } |
- |
- node.setType(type); |
- return (InterfaceType) type; |
- } |
- |
- InterfaceType resolveInterface(DartTypeNode node, boolean isStatic, boolean isFactory) { |
- Type type = resolveType(node, isStatic, isFactory, false, |
- ResolverErrorCode.NO_SUCH_TYPE, ResolverErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS); |
- if (type.getKind() != TypeKind.DYNAMIC && !isClassOrInterfaceType(type)) { |
- onError(node.getIdentifier(), ResolverErrorCode.NOT_A_CLASS_OR_INTERFACE, type); |
- type = typeProvider.getDynamicType(); |
- } |
- |
- node.setType(type); |
- return (InterfaceType) type; |
- } |
- |
- Type resolveType(DartTypeNode node, boolean isStatic, boolean isFactory, boolean isAnnotation, |
- ErrorCode errorCode, ErrorCode wrongNumberErrorCode) { |
- if (node == null) { |
- return null; |
- } else { |
- Type type = resolveType(node, node.getIdentifier(), node.getTypeArguments(), isStatic, |
- isFactory, isAnnotation, errorCode, wrongNumberErrorCode); |
- recordTypeIdentifier(node.getIdentifier(), type.getElement()); |
- return type; |
- } |
- } |
- |
- protected <E extends Element> E recordTypeIdentifier(DartNode node, E element) { |
- node.getClass(); |
- if (node instanceof DartPropertyAccess) { |
- recordTypeIdentifier(((DartPropertyAccess)node).getQualifier(), |
- element.getEnclosingElement()); |
- return recordTypeIdentifier(((DartPropertyAccess)node).getName(), element); |
- } else if (node instanceof DartIdentifier) { |
- if (element == null) { |
- // TypeAnalyzer will diagnose unresolved identifiers. |
- return null; |
- } |
- node.setElement(element); |
- } else { |
- throw internalError(node, "Unexpected node: %s", node); |
- } |
- return element; |
- } |
- |
- Type resolveType(DartNode diagnosticNode, DartNode identifier, List<DartTypeNode> typeArguments, |
- boolean isStatic, boolean isFactory, boolean isAnnotation, ErrorCode errorCode, |
- ErrorCode wrongNumberErrorCode) { |
- // Built-in identifier can not be used as a type annotation. |
- if (identifier instanceof DartIdentifier) { |
- String name = ((DartIdentifier) identifier).getName(); |
- if (DartParser.PSEUDO_KEYWORDS_SET.contains(name) && !"dynamic".equals(name) |
- && typeArguments.isEmpty()) { |
- onError(identifier, ResolverErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, name); |
- return Types.newDynamicType(); |
- } |
- } |
- // OK, valid name for type. |
- Element element = resolveName(identifier); |
- ElementKind elementKind = ElementKind.of(element); |
- switch (elementKind) { |
- case TYPE_VARIABLE: { |
- TypeVariableElement typeVariableElement = (TypeVariableElement) element; |
- if (!isFactory && isStatic && |
- typeVariableElement.getDeclaringElement().getKind().equals(ElementKind.CLASS)) { |
- onError(identifier, ResolverErrorCode.TYPE_VARIABLE_IN_STATIC_CONTEXT, identifier); |
- return typeProvider.getDynamicType(); |
- } |
- return makeTypeVariable(typeVariableElement, typeArguments); |
- } |
- case CLASS: |
- case FUNCTION_TYPE_ALIAS: |
- case DYNAMIC: |
- return instantiateParameterizedType( |
- (ClassElement) element, |
- diagnosticNode, |
- typeArguments, |
- isStatic, |
- isFactory, |
- errorCode, |
- wrongNumberErrorCode); |
- case DUPLICATE: { |
- DuplicateElement duplicateElement = (DuplicateElement) element; |
- List<String> locations = duplicateElement.getLocations(); |
- ResolverErrorCode duplicateErrorCode; |
- if (isAnnotation) { |
- duplicateErrorCode = ResolverErrorCode.DUPLICATE_IMPORTED_NAME_TYPE; |
- } else { |
- duplicateErrorCode = ResolverErrorCode.DUPLICATE_IMPORTED_NAME; |
- } |
- onError(identifier, duplicateErrorCode, element.getName(), locations.size(), locations); |
- return typeProvider.getDynamicType(); |
- } |
- case VOID: |
- return typeProvider.getVoidType(); |
- case NONE: |
- onError(identifier, errorCode, identifier); |
- return typeProvider.getDynamicType(); |
- default: |
- if (!(identifier instanceof DartSyntheticErrorIdentifier)) { |
- if (errorCode.getSubSystem().equals(SubSystem.RESOLVER)) { |
- onError(identifier, ResolverErrorCode.NOT_A_TYPE, identifier, elementKind); |
- } else { |
- onError(identifier, TypeErrorCode.NOT_A_TYPE, identifier, elementKind); |
- } |
- } |
- return typeProvider.getDynamicType(); |
- } |
- } |
- |
- InterfaceType instantiateParameterizedType(ClassElement element, DartNode node, |
- List<DartTypeNode> typeArgumentNodes, |
- boolean isStatic, |
- boolean isFactory, |
- ErrorCode errorCode, |
- ErrorCode wrongNumberErrorCode) { |
- List<Type> typeParameters = element.getTypeParameters(); |
- Type[] typeArguments; |
- if (typeArgumentNodes == null || typeArgumentNodes.size() != typeParameters.size()) { |
- typeArguments = new Type[typeParameters.size()]; |
- for (int i = 0; i < typeArguments.length; i++) { |
- typeArguments[i] = typeProvider.getDynamicType(); |
- } |
- if (typeArgumentNodes != null && typeArgumentNodes.size() > 0) { |
- onError(node, wrongNumberErrorCode, element.getType(), typeArgumentNodes.size(), typeParameters.size()); |
- } |
- int index = 0; |
- if (typeArgumentNodes != null) { |
- for (DartTypeNode typeNode : typeArgumentNodes) { |
- Type type = resolveType(typeNode, isStatic, isFactory, false, errorCode, |
- wrongNumberErrorCode); |
- typeNode.setType(type); |
- if (index < typeArguments.length) { |
- typeArguments[index] = type; |
- } |
- index++; |
- } |
- } |
- } else { |
- typeArguments = new Type[typeArgumentNodes.size()]; |
- for (int i = 0; i < typeArguments.length; i++) { |
- typeArguments[i] = resolveType(typeArgumentNodes.get(i), isStatic, isFactory, false, errorCode, |
- wrongNumberErrorCode); |
- typeArgumentNodes.get(i).setType(typeArguments[i]); |
- } |
- } |
- return element.getType().subst(Arrays.asList(typeArguments), typeParameters); |
- } |
- |
- private TypeVariable makeTypeVariable(TypeVariableElement element, |
- List<DartTypeNode> typeArguments) { |
- for (DartTypeNode typeArgument : typeArguments) { |
- onError(typeArgument, ResolverErrorCode.EXTRA_TYPE_ARGUMENT); |
- } |
- return element.getTypeVariable(); |
- } |
- |
- /* |
- * Interpret this node as a name reference, |
- */ |
- Element resolveName(DartNode node) { |
- Element result = node.accept(new Selector()); |
- if (result == null) { |
- if (Elements.isIdentifierName(node, "void")) { |
- return typeProvider.getVoidType().getElement(); |
- } |
- if (Elements.isIdentifierName(node, "dynamic")) { |
- return typeProvider.getDynamicType().getElement(); |
- } |
- } |
- return result; |
- } |
- |
- MethodElement declareFunction(DartFunctionExpression node) { |
- MethodElement element = Elements.methodFromFunctionExpression(node, Modifiers.NONE); |
- if (node.getFunctionName() != null) { |
- declare( |
- element, |
- ResolverErrorCode.DUPLICATE_FUNCTION_EXPRESSION); |
- } |
- return element; |
- } |
- |
- void pushFunctionScope(DartFunctionExpression x) { |
- pushScope(x.getFunctionName() == null ? "<function>" : x.getFunctionName()); |
- } |
- |
- void pushFunctionAliasScope(DartFunctionTypeAlias x) { |
- pushScope(x.getName().getName() == null ? "<function>" : x.getName().getName()); |
- } |
- |
- void pushClassAliasScope(DartClassTypeAlias x) { |
- pushScope(x.getName().getName() == null ? "<classTypeAlias>" : x.getName().getName()); |
- } |
- |
- AssertionError internalError(HasSourceInfo node, String message, Object... arguments) { |
- message = String.format(message, arguments); |
- context.onError(new DartCompilationError(node, ResolverErrorCode.INTERNAL_ERROR, |
- message)); |
- return new AssertionError("Internal error: " + message); |
- } |
- |
- @Override |
- public void onError(HasSourceInfo hasSourceInfo, ErrorCode errorCode, Object... arguments) { |
- onError(hasSourceInfo.getSourceInfo(), errorCode, arguments); |
- } |
- |
- public void onError(SourceInfo sourceInfo, ErrorCode errorCode, Object... arguments) { |
- if (suppressSdkWarnings) { |
- ErrorSeverity errorSeverity = errorCode.getErrorSeverity(); |
- if (errorSeverity == ErrorSeverity.WARNING || errorSeverity == ErrorSeverity.INFO) { |
- Source source = sourceInfo.getSource(); |
- if (source != null && PackageLibraryManager.isDartUri(source.getUri())) { |
- return; |
- } |
- } |
- } |
- context.onError(new DartCompilationError(sourceInfo, errorCode, arguments)); |
- } |
- |
- class Selector extends ASTVisitor<Element> { |
- @Override |
- public Element visitNode(DartNode node) { |
- throw internalError(node, "Unexpected node: %s", node); |
- } |
- |
- @Override |
- public Element visitPropertyAccess(DartPropertyAccess node) { |
- Element element = node.getQualifier().accept(this); |
- if (element != null) { |
- switch (element.getKind()) { |
- case LIBRARY_PREFIX : |
- Scope elementScope = ((LibraryPrefixElement) element).getScope(); |
- return elementScope.findElement(scope.getLibrary(), node.getPropertyName()); |
- case CLASS : |
- return Elements.findElement((ClassElement) element, node.getPropertyName()); |
- } |
- } |
- return null; |
- } |
- |
- @Override |
- public Element visitIdentifier(DartIdentifier node) { |
- String name = node.getName(); |
- return scope.findElement(scope.getLibrary(), name); |
- } |
- |
- @Override |
- public Element visitSyntheticErrorIdentifier(DartSyntheticErrorIdentifier node) { |
- return Elements.dynamicElement(); |
- } |
- } |
-} |