Index: dart/compiler/java/com/google/dart/compiler/resolver/SupertypeResolver.java |
diff --git a/dart/compiler/java/com/google/dart/compiler/resolver/SupertypeResolver.java b/dart/compiler/java/com/google/dart/compiler/resolver/SupertypeResolver.java |
deleted file mode 100644 |
index ed9505e4f11232bb344f78af9285cf8d5e468f4d..0000000000000000000000000000000000000000 |
--- a/dart/compiler/java/com/google/dart/compiler/resolver/SupertypeResolver.java |
+++ /dev/null |
@@ -1,217 +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.base.Objects; |
-import com.google.common.collect.ImmutableSet; |
-import com.google.common.collect.Sets; |
-import com.google.dart.compiler.DartCompilerContext; |
-import com.google.dart.compiler.Source; |
-import com.google.dart.compiler.ast.ASTVisitor; |
-import com.google.dart.compiler.ast.DartClass; |
-import com.google.dart.compiler.ast.DartClassTypeAlias; |
-import com.google.dart.compiler.ast.DartFunctionTypeAlias; |
-import com.google.dart.compiler.ast.DartParameterizedTypeNode; |
-import com.google.dart.compiler.ast.DartTypeNode; |
-import com.google.dart.compiler.ast.DartTypeParameter; |
-import com.google.dart.compiler.ast.DartUnit; |
-import com.google.dart.compiler.type.InterfaceType; |
-import com.google.dart.compiler.type.Type; |
-import com.google.dart.compiler.type.TypeKind; |
- |
-import java.util.List; |
-import java.util.Set; |
- |
-/** |
- * Resolves the super class, interfaces, default implementation and |
- * bounds type parameters of classes in a DartUnit. |
- */ |
-public class SupertypeResolver { |
- private static final Set<String> BLACK_LISTED_TYPES = ImmutableSet.of( |
- "dynamic", |
- "Function", |
- "bool", |
- "num", |
- "int", |
- "double", |
- "String"); |
- |
- private ResolutionContext topLevelContext; |
- private CoreTypeProvider typeProvider; |
- |
- public void exec(DartUnit unit, DartCompilerContext context, CoreTypeProvider typeProvider) { |
- exec(unit, context, unit.getLibrary().getElement().getScope(), typeProvider); |
- } |
- |
- public void exec(DartUnit unit, DartCompilerContext compilerContext, Scope libraryScope, |
- CoreTypeProvider typeProvider) { |
- this.typeProvider = typeProvider; |
- this.topLevelContext = new ResolutionContext(libraryScope, compilerContext, typeProvider); |
- unit.accept(new ClassElementResolver()); |
- } |
- |
- // Resolves super class, interfaces and default class of all classes. |
- private class ClassElementResolver extends ASTVisitor<Void> { |
- @Override |
- public Void visitClass(DartClass node) { |
- ClassElement classElement = node.getElement(); |
- |
- // Make sure that the type parameters are in scope before resolving the |
- // super class and interfaces |
- ResolutionContext classContext = topLevelContext.extend(classElement); |
- |
- DartTypeNode superclassNode = node.getSuperclass(); |
- List<DartTypeNode> mixins = node.getMixins(); |
- List<DartTypeNode> interfaces = node.getInterfaces(); |
- |
- visitClassLike(classElement, classContext, superclassNode, mixins, interfaces, |
- node.getDefaultClass()); |
- return null; |
- } |
- |
- @Override |
- public Void visitClassTypeAlias(DartClassTypeAlias node) { |
- ClassElement classElement = node.getElement(); |
- |
- // Make sure that the type parameters are in scope before resolving the |
- // super class and interfaces |
- ResolutionContext classContext = topLevelContext.extend(classElement); |
- |
- DartTypeNode superclassNode = node.getSuperclass(); |
- List<DartTypeNode> mixins = node.getMixins(); |
- List<DartTypeNode> interfaces = node.getInterfaces(); |
- |
- visitClassLike(classElement, classContext, superclassNode, mixins, interfaces, null); |
- return null; |
- } |
- |
- private void visitClassLike(ClassElement classElement, ResolutionContext classContext, |
- DartTypeNode superclassNode, List<DartTypeNode> mixins, List<DartTypeNode> interfaces, |
- DartParameterizedTypeNode defaultClassNode) { |
- Source source = classElement.getSourceInfo().getSource(); |
- InterfaceType supertype; |
- if (superclassNode == null) { |
- supertype = typeProvider.getObjectType(); |
- if (supertype.equals(classElement.getType())) { |
- // Object has no supertype. |
- supertype = null; |
- } |
- } else { |
- supertype = classContext.resolveClass(superclassNode, false, false); |
- supertype.getClass(); // Quick null check. |
- } |
- if (supertype != null) { |
- if (Elements.isTypeNode(superclassNode, BLACK_LISTED_TYPES) |
- && !Elements.isCoreLibrarySource(source)) { |
- topLevelContext.onError( |
- superclassNode, |
- ResolverErrorCode.BLACK_LISTED_EXTENDS, |
- superclassNode); |
- } |
- classElement.setSupertype(supertype); |
- } else { |
- assert classElement.getName().equals("Object") : classElement; |
- } |
- |
- if (defaultClassNode != null) { |
- Element defaultClassElement = classContext.resolveName(defaultClassNode.getExpression()); |
- if (ElementKind.of(defaultClassElement).equals(ElementKind.CLASS)) { |
- Elements.setDefaultClass(classElement, (InterfaceType)defaultClassElement.getType()); |
- defaultClassNode.setType(defaultClassElement.getType()); |
- } |
- } |
- |
- if (interfaces != null) { |
- Set<InterfaceType> seenImplement = Sets.newHashSet(); |
- for (DartTypeNode intNode : interfaces) { |
- InterfaceType intType = classContext.resolveInterface(intNode, false, false); |
- // May be type which can not be used as interface. |
- if (Elements.isTypeNode(intNode, BLACK_LISTED_TYPES) |
- && !Elements.isCoreLibrarySource(source)) { |
- topLevelContext.onError(intNode, ResolverErrorCode.BLACK_LISTED_IMPLEMENTS, intNode); |
- continue; |
- } |
- // May be unresolved type, error already reported, ignore. |
- if (intType.getKind() == TypeKind.DYNAMIC) { |
- continue; |
- } |
- // check for uniqueness |
- if (!classElement.isInterface()) { |
- if (seenImplement.contains(intType)) { |
- topLevelContext.onError(intNode, ResolverErrorCode.DUPLICATE_IMPLEMENTS_TYPE); |
- continue; |
- } |
- if (Objects.equal(intType, supertype)) { |
- topLevelContext.onError(intNode, ResolverErrorCode.SUPER_CLASS_IN_IMPLEMENTS); |
- continue; |
- } |
- seenImplement.add(intType); |
- } |
- // OK, add |
- Elements.addInterface(classElement, intType); |
- } |
- } |
- |
- if (mixins != null) { |
- Set<InterfaceType> seenMixin = Sets.newHashSet(); |
- for (DartTypeNode mixNode : mixins) { |
- InterfaceType mixType = classContext.resolveInterface(mixNode, false, false); |
- // May be type which can not be used as interface. |
- if (Elements.isTypeNode(mixNode, BLACK_LISTED_TYPES) |
- && !Elements.isCoreLibrarySource(source)) { |
- topLevelContext.onError(mixNode, ResolverErrorCode.BLACK_LISTED_MIXINS, mixNode); |
- continue; |
- } |
- // May be unresolved type, error already reported, ignore. |
- if (mixType.getKind() == TypeKind.DYNAMIC) { |
- continue; |
- } |
- // check for uniqueness |
- if (seenMixin.contains(mixType)) { |
- topLevelContext.onError(mixNode, ResolverErrorCode.DUPLICATE_WITH_TYPE); |
- continue; |
- } |
- if (Objects.equal(mixType, supertype)) { |
- topLevelContext.onError(mixNode, ResolverErrorCode.SUPER_CLASS_IN_WITH); |
- continue; |
- } |
- seenMixin.add(mixType); |
- // OK, add |
- Elements.addMixin(classElement, mixType); |
- } |
- } |
- setBoundsOnTypeParameters(classElement.getTypeParameters(), classContext); |
- } |
- |
- @Override |
- public Void visitFunctionTypeAlias(DartFunctionTypeAlias node) { |
- ResolutionContext resolutionContext = topLevelContext.extend(node.getElement()); |
- Elements.addInterface(node.getElement(), typeProvider.getFunctionType()); |
- setBoundsOnTypeParameters(node.getElement().getTypeParameters(), resolutionContext); |
- return null; |
- } |
- } |
- |
- private void setBoundsOnTypeParameters(List<Type> typeParameters, |
- ResolutionContext resolutionContext) { |
- for (Type typeParameter : typeParameters) { |
- TypeVariableNodeElement variable = (TypeVariableNodeElement) typeParameter.getElement(); |
- DartTypeParameter typeParameterNode = (DartTypeParameter) variable.getNode(); |
- DartTypeNode boundNode = typeParameterNode.getBound(); |
- if (boundNode != null) { |
- Type bound = |
- resolutionContext.resolveType( |
- boundNode, |
- false, |
- false, |
- true, |
- ResolverErrorCode.NO_SUCH_TYPE, |
- ResolverErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS); |
- boundNode.setType(bound); |
- } |
- } |
- } |
- |
-} |