From b950a82fcdeeb56bc5c830dbe1e7d77686d79ba8 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 27 May 2011 13:54:46 +0400 Subject: [PATCH] Qualified this resolved correctly --- .../descriptors/MutableClassDescriptor.java | 7 +- .../jet/lang/resolve/ChainedScope.java | 95 +++++++++++++++++++ .../jet/lang/resolve/WritableScopeImpl.java | 2 +- .../resolve/WritableScopeWithImports.java | 13 +++ .../jet/lang/types/JetTypeInferrer.java | 1 + idea/testData/checker/ResolveToJava.jet | 9 +- idea/testData/resolve/Classifiers.jet | 14 ++- 7 files changed, 134 insertions(+), 7 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/lang/resolve/ChainedScope.java diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java index f0283caa89c..16bd49db7c4 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -30,10 +30,9 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme public MutableClassDescriptor(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor containingDeclaration, @NotNull JetScope outerScope) { super(containingDeclaration); - this.scopeForMemberLookup = new WritableScopeImpl(JetScope.EMPTY, this, trace.getErrorHandler()); - this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, trace.getErrorHandler()); - this.scopeForMemberResolution = new WritableScopeImpl(scopeForMemberLookup, this, trace.getErrorHandler()); - scopeForMemberResolution.importScope(scopeForSupertypeResolution); + this.scopeForMemberLookup = new WritableScopeImpl(JetScope.EMPTY, this, trace.getErrorHandler()).setDebugName("MemberLookup"); + this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, trace.getErrorHandler()).setDebugName("SupertypeResolution"); + this.scopeForMemberResolution = new WritableScopeImpl(new ChainedScope(this, scopeForMemberLookup, scopeForSupertypeResolution), this, trace.getErrorHandler()).setDebugName("MemberResolution"); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/idea/src/org/jetbrains/jet/lang/resolve/ChainedScope.java b/idea/src/org/jetbrains/jet/lang/resolve/ChainedScope.java new file mode 100644 index 00000000000..1aae583dc43 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/resolve/ChainedScope.java @@ -0,0 +1,95 @@ +package org.jetbrains.jet.lang.resolve; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.types.JetType; + +import java.util.Collection; +import java.util.Collections; + +/** + * @author abreslav + */ +public class ChainedScope implements JetScope { + private final DeclarationDescriptor containingDeclaration; + private final JetScope[] scopeChain; + + public ChainedScope(DeclarationDescriptor containingDeclaration, JetScope... scopes) { + this.containingDeclaration = containingDeclaration; + scopeChain = scopes.clone(); + } + + @Override + public ClassifierDescriptor getClassifier(@NotNull String name) { + for (JetScope scope : scopeChain) { + ClassifierDescriptor classifier = scope.getClassifier(name); + if (classifier != null) return classifier; + } + return null; + } + + @Override + public NamespaceDescriptor getNamespace(@NotNull String name) { + for (JetScope jetScope : scopeChain) { + NamespaceDescriptor namespace = jetScope.getNamespace(name); + if (namespace != null) { + return namespace; + } + } + return null; + } + + @Override + public VariableDescriptor getVariable(@NotNull String name) { + for (JetScope jetScope : scopeChain) { + VariableDescriptor variable = jetScope.getVariable(name); + if (variable != null) { + return variable; + } + } + return null; + } + + @NotNull + @Override + public FunctionGroup getFunctionGroup(@NotNull String name) { + for (JetScope jetScope : scopeChain) { + FunctionGroup functionGroup = jetScope.getFunctionGroup(name); + if (!functionGroup.isEmpty()) return functionGroup; + } + return FunctionGroup.EMPTY; + } + + @NotNull + @Override + public JetType getThisType() { + throw new UnsupportedOperationException(); // TODO + } + + @NotNull + @Override + public DeclarationDescriptor getContainingDeclaration() { + return containingDeclaration; + } + + @NotNull + @Override + public Collection getDeclarationsByLabel(String labelName) { + for (JetScope jetScope : scopeChain) { + Collection declarationsByLabel = jetScope.getDeclarationsByLabel(labelName); + if (!declarationsByLabel.isEmpty()) return declarationsByLabel; // TODO : merge? + } + return Collections.emptyList(); + } + + @Override + public PropertyDescriptor getPropertyByFieldReference(@NotNull String fieldName) { + for (JetScope jetScope : scopeChain) { + PropertyDescriptor propertyByFieldReference = jetScope.getPropertyByFieldReference(fieldName); + if (propertyByFieldReference != null) { + return propertyByFieldReference; + } + } + return null; + } +} diff --git a/idea/src/org/jetbrains/jet/lang/resolve/WritableScopeImpl.java b/idea/src/org/jetbrains/jet/lang/resolve/WritableScopeImpl.java index 151ad21c783..78479fafb1a 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/WritableScopeImpl.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/WritableScopeImpl.java @@ -59,8 +59,8 @@ public class WritableScopeImpl extends WritableScopeWithImports { @NotNull @Override public Collection getDeclarationsByLabel(@NotNull String labelName) { - Map> labelsToDescriptors = getLabelsToDescriptors(); Collection superResult = super.getDeclarationsByLabel(labelName); + Map> labelsToDescriptors = getLabelsToDescriptors(); List declarationDescriptors = labelsToDescriptors.get(labelName); if (declarationDescriptors == null) { return superResult; diff --git a/idea/src/org/jetbrains/jet/lang/resolve/WritableScopeWithImports.java b/idea/src/org/jetbrains/jet/lang/resolve/WritableScopeWithImports.java index 0a557bc4256..381ab81ecbd 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/WritableScopeWithImports.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/WritableScopeWithImports.java @@ -15,6 +15,8 @@ import java.util.List; */ public abstract class WritableScopeWithImports extends JetScopeAdapter implements WritableScope { + private String debugName; + @Nullable private List imports; @@ -22,6 +24,12 @@ public abstract class WritableScopeWithImports extends JetScopeAdapter implement super(scope); } + public WritableScopeWithImports setDebugName(@NotNull String debugName) { + assert this.debugName == null : this.debugName; + this.debugName = debugName; + return this; + } + @NotNull protected final List getImports() { if (imports == null) { @@ -80,4 +88,9 @@ public abstract class WritableScopeWithImports extends JetScopeAdapter implement } return null; } + + @Override + public String toString() { + return debugName + " for " + getContainingDeclaration(); + } } diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index 79b696921f7..5c949ae5242 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -938,6 +938,7 @@ public class JetTypeInferrer { if (declarationDescriptor instanceof ClassDescriptor) { ClassDescriptor classDescriptor = (ClassDescriptor) declarationDescriptor; thisType = classDescriptor.getDefaultType(); + trace.recordReferenceResolution(expression.getTargetLabel(), classDescriptor); } else { throw new UnsupportedOperationException(); // TODO diff --git a/idea/testData/checker/ResolveToJava.jet b/idea/testData/checker/ResolveToJava.jet index 99907a0d7cc..ca8cbd774dd 100644 --- a/idea/testData/checker/ResolveToJava.jet +++ b/idea/testData/checker/ResolveToJava.jet @@ -26,7 +26,6 @@ fun test(l : java.util.List) { new List -// Collections.sort(new ArrayList()) val o = "sdf" as Object @@ -42,4 +41,12 @@ fun test(l : java.util.List) { val c : Com? = null c : java.lang.Comparable? + +// Collections.sort(new ArrayList()) + //new xxx.error>Class/error>() +} + + +namespace xxx { + import java.lang.Class; } diff --git a/idea/testData/resolve/Classifiers.jet b/idea/testData/resolve/Classifiers.jet index 19a5025f1b3..d9dfa80d85e 100644 --- a/idea/testData/resolve/Classifiers.jet +++ b/idea/testData/resolve/Classifiers.jet @@ -1,3 +1,14 @@ +namespace qualified_this { + ~qtA~class A(val a:Int) { + + ~qtB~class B() { + val x = this`qtB`@B + val y = this`qtA`@A + } + } +} + + class A<~T~T, ~E~E> { val a : `T`T val x : A<`T`T, `E`E> @@ -8,4 +19,5 @@ class A<~T~T, ~E~E> { ~X.E~class E {} } -} \ No newline at end of file +} +