import from objects before properties resolve
This commit is contained in:
+12
-3
@@ -9,9 +9,7 @@ import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
|
|||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
import org.jetbrains.jet.lang.types.*;
|
import org.jetbrains.jet.lang.types.*;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
@@ -175,4 +173,15 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements
|
|||||||
}
|
}
|
||||||
return implicitReceiver;
|
return implicitReceiver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getInnerClass(String name) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Collection<ClassDescriptor> getInnerClasses() {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -59,6 +59,11 @@ public class JavaClassMembersScope implements JetScope {
|
|||||||
return classifierDescriptor;
|
return classifierDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getObjectDescriptor(@NotNull String name) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> getAllDescriptors() {
|
public Collection<DeclarationDescriptor> getAllDescriptors() {
|
||||||
|
|||||||
@@ -34,6 +34,11 @@ public class JavaPackageScope extends JetScopeImpl {
|
|||||||
return semanticServices.getDescriptorResolver().resolveClass(getQualifiedName(name));
|
return semanticServices.getDescriptorResolver().resolveClass(getQualifiedName(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getObjectDescriptor(@NotNull String name) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NamespaceDescriptor getNamespace(@NotNull String name) {
|
public NamespaceDescriptor getNamespace(@NotNull String name) {
|
||||||
return semanticServices.getDescriptorResolver().resolveNamespace(getQualifiedName(name));
|
return semanticServices.getDescriptorResolver().resolveNamespace(getQualifiedName(name));
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import org.jetbrains.jet.lang.types.JetType;
|
|||||||
import org.jetbrains.jet.lang.types.TypeProjection;
|
import org.jetbrains.jet.lang.types.TypeProjection;
|
||||||
import org.jetbrains.jet.lang.types.TypeSubstitutor;
|
import org.jetbrains.jet.lang.types.TypeSubstitutor;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@@ -63,4 +64,10 @@ public interface ClassDescriptor extends ClassifierDescriptor, MemberDescriptor
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
ReceiverDescriptor getImplicitReceiver();
|
ReceiverDescriptor getImplicitReceiver();
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
ClassDescriptor getInnerClass(String name);
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
Collection<ClassDescriptor> getInnerClasses();
|
||||||
}
|
}
|
||||||
|
|||||||
+11
@@ -148,4 +148,15 @@ public class ClassDescriptorBoundToReceiver implements ClassDescriptor {
|
|||||||
public String getName() {
|
public String getName() {
|
||||||
return classDescriptor.getName();
|
return classDescriptor.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getInnerClass(String name) {
|
||||||
|
return classDescriptor.getInnerClass(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Collection<ClassDescriptor> getInnerClasses() {
|
||||||
|
return classDescriptor.getInnerClasses();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,7 @@ import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
|
|||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||||
import org.jetbrains.jet.lang.types.*;
|
import org.jetbrains.jet.lang.types.*;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
@@ -164,4 +161,15 @@ public class ClassDescriptorImpl extends DeclarationDescriptorImpl implements Cl
|
|||||||
}
|
}
|
||||||
return implicitReceiver;
|
return implicitReceiver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getInnerClass(String name) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Collection<ClassDescriptor> getInnerClasses() {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
@@ -185,4 +185,15 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
|
|||||||
public void acceptVoid(DeclarationDescriptorVisitor<Void, Void> visitor) {
|
public void acceptVoid(DeclarationDescriptorVisitor<Void, Void> visitor) {
|
||||||
throw new UnsupportedOperationException(); // TODO
|
throw new UnsupportedOperationException(); // TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getInnerClass(String name) {
|
||||||
|
return original.getInnerClass(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Collection<ClassDescriptor> getInnerClasses() {
|
||||||
|
return original.getInnerClasses();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package org.jetbrains.jet.lang.descriptors;
|
package org.jetbrains.jet.lang.descriptors;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -29,6 +30,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme
|
|||||||
private final Set<FunctionDescriptor> functions = Sets.newHashSet();
|
private final Set<FunctionDescriptor> functions = Sets.newHashSet();
|
||||||
private List<TypeParameterDescriptor> typeParameters = Lists.newArrayList();
|
private List<TypeParameterDescriptor> typeParameters = Lists.newArrayList();
|
||||||
private Collection<JetType> supertypes = Lists.newArrayList();
|
private Collection<JetType> supertypes = Lists.newArrayList();
|
||||||
|
private Map<String, ClassDescriptor> innerClasses = Maps.newHashMap();
|
||||||
|
|
||||||
private Modality modality;
|
private Modality modality;
|
||||||
private Visibility visibility;
|
private Visibility visibility;
|
||||||
@@ -186,6 +188,22 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme
|
|||||||
public void addClassifierDescriptor(@NotNull MutableClassDescriptor classDescriptor) {
|
public void addClassifierDescriptor(@NotNull MutableClassDescriptor classDescriptor) {
|
||||||
scopeForMemberLookup.addClassifierDescriptor(classDescriptor);
|
scopeForMemberLookup.addClassifierDescriptor(classDescriptor);
|
||||||
scopeForMemberResolution.addClassifierDescriptor(classDescriptor);
|
scopeForMemberResolution.addClassifierDescriptor(classDescriptor);
|
||||||
|
innerClasses.put(classDescriptor.getName(), classDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public ClassDescriptor getInnerClass(String name) {
|
||||||
|
return innerClasses.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public Collection<ClassDescriptor> getInnerClasses() {
|
||||||
|
return innerClasses.values();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addObjectDescriptor(@NotNull MutableClassDescriptor objectDescriptor) {
|
||||||
|
scopeForMemberLookup.addObjectDescriptor(objectDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSupertype(@NotNull JetType supertype) {
|
public void addSupertype(@NotNull JetType supertype) {
|
||||||
|
|||||||
@@ -43,6 +43,11 @@ public class NamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl imp
|
|||||||
memberScope.addClassifierDescriptor(classDescriptor);
|
memberScope.addClassifierDescriptor(classDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addObjectDescriptor(@NotNull MutableClassDescriptor objectDescriptor) {
|
||||||
|
memberScope.addObjectDescriptor(objectDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addFunctionDescriptor(@NotNull FunctionDescriptor functionDescriptor) {
|
public void addFunctionDescriptor(@NotNull FunctionDescriptor functionDescriptor) {
|
||||||
memberScope.addFunctionDescriptor(functionDescriptor);
|
memberScope.addFunctionDescriptor(functionDescriptor);
|
||||||
|
|||||||
@@ -65,6 +65,8 @@ public interface NamespaceLike extends DeclarationDescriptor {
|
|||||||
|
|
||||||
void addClassifierDescriptor(@NotNull MutableClassDescriptor classDescriptor);
|
void addClassifierDescriptor(@NotNull MutableClassDescriptor classDescriptor);
|
||||||
|
|
||||||
|
void addObjectDescriptor(@NotNull MutableClassDescriptor objectDescriptor);
|
||||||
|
|
||||||
void addFunctionDescriptor(@NotNull FunctionDescriptor functionDescriptor);
|
void addFunctionDescriptor(@NotNull FunctionDescriptor functionDescriptor);
|
||||||
|
|
||||||
void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor);
|
void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor);
|
||||||
|
|||||||
@@ -45,6 +45,11 @@ public abstract class AbstractScopeAdapter implements JetScope {
|
|||||||
return getWorkerScope().getClassifier(name);
|
return getWorkerScope().getClassifier(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getObjectDescriptor(@NotNull String name) {
|
||||||
|
return getWorkerScope().getObjectDescriptor(name);
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Set<VariableDescriptor> getProperties(@NotNull String name) {
|
public Set<VariableDescriptor> getProperties(@NotNull String name) {
|
||||||
|
|||||||
@@ -116,6 +116,11 @@ public class AnalyzingUtils {
|
|||||||
scope.addClassifierDescriptor(classDescriptor);
|
scope.addClassifierDescriptor(classDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addObjectDescriptor(@NotNull MutableClassDescriptor objectDescriptor) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addFunctionDescriptor(@NotNull FunctionDescriptor functionDescriptor) {
|
public void addFunctionDescriptor(@NotNull FunctionDescriptor functionDescriptor) {
|
||||||
scope.addFunctionDescriptor(functionDescriptor);
|
scope.addFunctionDescriptor(functionDescriptor);
|
||||||
|
|||||||
@@ -240,4 +240,9 @@ public class DescriptorUtils {
|
|||||||
PsiElement element = bindingTrace.get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor);
|
PsiElement element = bindingTrace.get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor);
|
||||||
return element instanceof JetObjectDeclarationName;
|
return element instanceof JetObjectDeclarationName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isObjectDescriptor(@NotNull ClassDescriptor descriptor, BindingTrace bindingTrace) {
|
||||||
|
PsiElement element = bindingTrace.get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor);
|
||||||
|
return element instanceof JetObjectDeclaration;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,6 +93,12 @@ public class ImportsResolver {
|
|||||||
if (descriptor instanceof NamespaceDescriptor) {
|
if (descriptor instanceof NamespaceDescriptor) {
|
||||||
namespaceScope.importScope(((NamespaceDescriptor) descriptor).getMemberScope());
|
namespaceScope.importScope(((NamespaceDescriptor) descriptor).getMemberScope());
|
||||||
}
|
}
|
||||||
|
if (descriptor instanceof ClassDescriptor && DescriptorUtils.isObjectDescriptor((ClassDescriptor) descriptor, trace)) {
|
||||||
|
Collection<DeclarationDescriptor> innerClasses = getInnerClasses((ClassDescriptor) descriptor, null);
|
||||||
|
for (DeclarationDescriptor innerClass : innerClasses) {
|
||||||
|
namespaceScope.importClassifierAlias(innerClass.getName(), (ClassifierDescriptor) innerClass);
|
||||||
|
}
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (descriptor instanceof VariableDescriptor) {
|
if (descriptor instanceof VariableDescriptor) {
|
||||||
@@ -164,15 +170,19 @@ public class ImportsResolver {
|
|||||||
if (lastReference == null || !canImportMembersFrom(declarationDescriptors, lastReference)) {
|
if (lastReference == null || !canImportMembersFrom(declarationDescriptors, lastReference)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
Collection<DeclarationDescriptor> result;
|
||||||
for (DeclarationDescriptor declarationDescriptor : declarationDescriptors) {
|
for (DeclarationDescriptor declarationDescriptor : declarationDescriptors) {
|
||||||
if (declarationDescriptor instanceof NamespaceDescriptor) {
|
if (declarationDescriptor instanceof NamespaceDescriptor) {
|
||||||
return lookupDescriptorsForSimpleNameReference(selector, ((NamespaceDescriptor) declarationDescriptor).getMemberScope());
|
result = lookupDescriptorsForSimpleNameReference(selector, ((NamespaceDescriptor) declarationDescriptor).getMemberScope());
|
||||||
|
if (!result.isEmpty()) return result;
|
||||||
}
|
}
|
||||||
if (declarationDescriptor instanceof ClassDescriptor) {
|
if (declarationDescriptor instanceof ClassDescriptor) {
|
||||||
return lookupObjectMembers(selector, (ClassDescriptor) declarationDescriptor);
|
result = lookupObjectMembers(selector, (ClassDescriptor) declarationDescriptor);
|
||||||
|
if (!result.isEmpty()) return result;
|
||||||
}
|
}
|
||||||
if (declarationDescriptor instanceof VariableDescriptor) {
|
if (declarationDescriptor instanceof VariableDescriptor) {
|
||||||
return lookupVariableMembers(selector, (VariableDescriptor) declarationDescriptor);
|
result = lookupVariableMembers(selector, (VariableDescriptor) declarationDescriptor);
|
||||||
|
if (!result.isEmpty()) return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,6 +229,9 @@ public class ImportsResolver {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private Collection<DeclarationDescriptor> lookupObjectMembers(@NotNull JetSimpleNameExpression memberReference,
|
private Collection<DeclarationDescriptor> lookupObjectMembers(@NotNull JetSimpleNameExpression memberReference,
|
||||||
@NotNull ClassDescriptor classDescriptor) {
|
@NotNull ClassDescriptor classDescriptor) {
|
||||||
|
if (DescriptorUtils.isObjectDescriptor(classDescriptor, trace)) {
|
||||||
|
return getInnerClasses(classDescriptor, memberReference);
|
||||||
|
}
|
||||||
if (firstPhase) return Collections.emptyList();
|
if (firstPhase) return Collections.emptyList();
|
||||||
JetType classObjectType = classDescriptor.getClassObjectType();
|
JetType classObjectType = classDescriptor.getClassObjectType();
|
||||||
assert classObjectType != null;
|
assert classObjectType != null;
|
||||||
@@ -226,6 +239,22 @@ public class ImportsResolver {
|
|||||||
return addBoundToReceiver(members, classDescriptor);
|
return addBoundToReceiver(members, classDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private Collection<DeclarationDescriptor> getInnerClasses(@NotNull ClassDescriptor classDescriptor, @Nullable JetSimpleNameExpression memberReference) {
|
||||||
|
if (!DescriptorUtils.isObjectDescriptor(classDescriptor, trace)) return Collections.emptyList();
|
||||||
|
Collection<? extends DeclarationDescriptor> descriptors;
|
||||||
|
if (memberReference != null) {
|
||||||
|
ClassDescriptor innerClass = classDescriptor.getInnerClass(memberReference.getReferencedName());
|
||||||
|
if (innerClass == null) return Collections.emptyList();
|
||||||
|
descriptors = Collections.<DeclarationDescriptor>singletonList(innerClass);
|
||||||
|
recordReference(descriptors, memberReference, JetScope.EMPTY);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
descriptors = classDescriptor.getInnerClasses();
|
||||||
|
}
|
||||||
|
return addBoundToReceiver(descriptors, classDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
private Collection<DeclarationDescriptor> lookupVariableMembers(@NotNull JetSimpleNameExpression memberReference, @NotNull VariableDescriptor variableDescriptor) {
|
private Collection<DeclarationDescriptor> lookupVariableMembers(@NotNull JetSimpleNameExpression memberReference, @NotNull VariableDescriptor variableDescriptor) {
|
||||||
if (firstPhase) return Collections.emptyList();
|
if (firstPhase) return Collections.emptyList();
|
||||||
|
|
||||||
@@ -236,7 +265,7 @@ public class ImportsResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static Collection<DeclarationDescriptor> addBoundToReceiver(@NotNull Collection<DeclarationDescriptor> descriptors, @NotNull final DeclarationDescriptor receiver) {
|
public static Collection<DeclarationDescriptor> addBoundToReceiver(@NotNull Collection<? extends DeclarationDescriptor> descriptors, @NotNull final DeclarationDescriptor receiver) {
|
||||||
return Collections2.transform(descriptors, DescriptorUtils.getAddBoundToReceiverFunction(receiver));
|
return Collections2.transform(descriptors, DescriptorUtils.getAddBoundToReceiverFunction(receiver));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,27 +281,33 @@ public class ImportsResolver {
|
|||||||
ClassifierDescriptor classifierDescriptor = outerScope.getClassifier(referencedName);
|
ClassifierDescriptor classifierDescriptor = outerScope.getClassifier(referencedName);
|
||||||
if (classifierDescriptor != null) descriptors.add(classifierDescriptor);
|
if (classifierDescriptor != null) descriptors.add(classifierDescriptor);
|
||||||
|
|
||||||
|
ClassDescriptor objectDescriptor = outerScope.getObjectDescriptor(referencedName);
|
||||||
|
if (objectDescriptor != null) descriptors.add(objectDescriptor);
|
||||||
|
|
||||||
descriptors.addAll(outerScope.getFunctions(referencedName));
|
descriptors.addAll(outerScope.getFunctions(referencedName));
|
||||||
|
|
||||||
descriptors.addAll(outerScope.getProperties(referencedName));
|
descriptors.addAll(outerScope.getProperties(referencedName));
|
||||||
}
|
}
|
||||||
if (!firstPhase) {
|
recordReference(descriptors, referenceExpression, outerScope);
|
||||||
if (descriptors.size() == 1) {
|
|
||||||
trace.record(BindingContext.REFERENCE_TARGET, referenceExpression, descriptors.get(0));
|
|
||||||
}
|
|
||||||
else if (descriptors.size() > 1) {
|
|
||||||
trace.record(BindingContext.AMBIGUOUS_REFERENCE_TARGET, referenceExpression, descriptors);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
trace.report(UNRESOLVED_REFERENCE.on(referenceExpression));
|
|
||||||
}
|
|
||||||
|
|
||||||
// If it's not an ambiguous case - store resolution scope
|
|
||||||
if (descriptors.size() <= 1 && outerScope != JetScope.EMPTY) {
|
|
||||||
trace.record(BindingContext.RESOLUTION_SCOPE, referenceExpression, outerScope);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return descriptors;
|
return descriptors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void recordReference(Collection<? extends DeclarationDescriptor> descriptors, JetSimpleNameExpression referenceExpression, JetScope outerScope) {
|
||||||
|
if (firstPhase) return;
|
||||||
|
if (descriptors.size() == 1) {
|
||||||
|
trace.record(BindingContext.REFERENCE_TARGET, referenceExpression, descriptors.iterator().next());
|
||||||
|
}
|
||||||
|
else if (descriptors.size() > 1) {
|
||||||
|
trace.record(BindingContext.AMBIGUOUS_REFERENCE_TARGET, referenceExpression, descriptors);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
trace.report(UNRESOLVED_REFERENCE.on(referenceExpression));
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it's not an ambiguous case - store resolution scope
|
||||||
|
if (descriptors.size() <= 1 && outerScope != JetScope.EMPTY) {
|
||||||
|
trace.record(BindingContext.RESOLUTION_SCOPE, referenceExpression, outerScope);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,6 +133,11 @@ public class TopDownAnalyzer {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addObjectDescriptor(@NotNull MutableClassDescriptor objectDescriptor) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addFunctionDescriptor(@NotNull FunctionDescriptor functionDescriptor) {
|
public void addFunctionDescriptor(@NotNull FunctionDescriptor functionDescriptor) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
|
|||||||
@@ -140,6 +140,7 @@ public class TypeHierarchyResolver {
|
|||||||
};
|
};
|
||||||
visitClassOrObject(declaration, (Map) context.getObjects(), mutableClassDescriptor);
|
visitClassOrObject(declaration, (Map) context.getObjects(), mutableClassDescriptor);
|
||||||
createPrimaryConstructorForObject((JetDeclaration) declaration, mutableClassDescriptor);
|
createPrimaryConstructorForObject((JetDeclaration) declaration, mutableClassDescriptor);
|
||||||
|
owner.addObjectDescriptor(mutableClassDescriptor);
|
||||||
context.getTrace().record(BindingContext.CLASS, declaration, mutableClassDescriptor);
|
context.getTrace().record(BindingContext.CLASS, declaration, mutableClassDescriptor);
|
||||||
return mutableClassDescriptor;
|
return mutableClassDescriptor;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,15 @@ public class ChainedScope implements JetScope {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getObjectDescriptor(@NotNull String name) {
|
||||||
|
for (JetScope scope : scopeChain) {
|
||||||
|
ClassDescriptor objectDescriptor = scope.getObjectDescriptor(name);
|
||||||
|
if (objectDescriptor != null) return objectDescriptor;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NamespaceDescriptor getNamespace(@NotNull String name) {
|
public NamespaceDescriptor getNamespace(@NotNull String name) {
|
||||||
for (JetScope jetScope : scopeChain) {
|
for (JetScope jetScope : scopeChain) {
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ public interface JetScope {
|
|||||||
@Nullable
|
@Nullable
|
||||||
ClassifierDescriptor getClassifier(@NotNull String name);
|
ClassifierDescriptor getClassifier(@NotNull String name);
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
ClassDescriptor getObjectDescriptor(@NotNull String name);
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
NamespaceDescriptor getNamespace(@NotNull String name);
|
NamespaceDescriptor getNamespace(@NotNull String name);
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,11 @@ public abstract class JetScopeImpl implements JetScope {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getObjectDescriptor(@NotNull String name) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Set<VariableDescriptor> getProperties(@NotNull String name) {
|
public Set<VariableDescriptor> getProperties(@NotNull String name) {
|
||||||
|
|||||||
@@ -85,6 +85,11 @@ public class ScopeBoundToReceiver implements JetScope {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getObjectDescriptor(@NotNull String name) {
|
||||||
|
return scope.getObjectDescriptor(name);
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public NamespaceDescriptor getNamespace(@NotNull String name) {
|
public NamespaceDescriptor getNamespace(@NotNull String name) {
|
||||||
|
|||||||
@@ -76,6 +76,11 @@ public class SubstitutingScope implements JetScope {
|
|||||||
return substitute(workerScope.getClassifier(name));
|
return substitute(workerScope.getClassifier(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getObjectDescriptor(@NotNull String name) {
|
||||||
|
return substitute(workerScope.getObjectDescriptor(name));
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Set<FunctionDescriptor> getFunctions(@NotNull String name) {
|
public Set<FunctionDescriptor> getFunctions(@NotNull String name) {
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ public interface WritableScope extends JetScope {
|
|||||||
|
|
||||||
void addClassifierDescriptor(@NotNull ClassifierDescriptor classDescriptor);
|
void addClassifierDescriptor(@NotNull ClassifierDescriptor classDescriptor);
|
||||||
|
|
||||||
|
void addObjectDescriptor(@NotNull ClassDescriptor objectDescriptor);
|
||||||
|
|
||||||
void addClassifierAlias(@NotNull String name, @NotNull ClassifierDescriptor classifierDescriptor);
|
void addClassifierAlias(@NotNull String name, @NotNull ClassifierDescriptor classifierDescriptor);
|
||||||
|
|
||||||
void addNamespaceAlias(@NotNull String name, @NotNull NamespaceDescriptor namespaceDescriptor);
|
void addNamespaceAlias(@NotNull String name, @NotNull NamespaceDescriptor namespaceDescriptor);
|
||||||
|
|||||||
@@ -43,6 +43,9 @@ public class WritableScopeImpl extends WritableScopeWithImports {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private Map<String, List<DeclarationDescriptor>> labelsToDescriptors;
|
private Map<String, List<DeclarationDescriptor>> labelsToDescriptors;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private Map<String, ClassDescriptor> objectDescriptors;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private ReceiverDescriptor implicitReceiver;
|
private ReceiverDescriptor implicitReceiver;
|
||||||
|
|
||||||
@@ -119,6 +122,14 @@ public class WritableScopeImpl extends WritableScopeWithImports {
|
|||||||
return labelsToDescriptors;
|
return labelsToDescriptors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public Map<String, ClassDescriptor> getObjectDescriptors() {
|
||||||
|
if (objectDescriptors == null) {
|
||||||
|
objectDescriptors = Maps.newHashMap();
|
||||||
|
}
|
||||||
|
return objectDescriptors;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> getDeclarationsByLabel(@NotNull String labelName) {
|
public Collection<DeclarationDescriptor> getDeclarationsByLabel(@NotNull String labelName) {
|
||||||
@@ -277,6 +288,13 @@ public class WritableScopeImpl extends WritableScopeWithImports {
|
|||||||
addClassifierAlias(classDescriptor.getName(), classDescriptor);
|
addClassifierAlias(classDescriptor.getName(), classDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addObjectDescriptor(@NotNull ClassDescriptor objectDescriptor) {
|
||||||
|
checkMayWrite();
|
||||||
|
|
||||||
|
getObjectDescriptors().put(objectDescriptor.getName(), objectDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addClassifierAlias(@NotNull String name, @NotNull ClassifierDescriptor classifierDescriptor) {
|
public void addClassifierAlias(@NotNull String name, @NotNull ClassifierDescriptor classifierDescriptor) {
|
||||||
checkMayWrite();
|
checkMayWrite();
|
||||||
@@ -346,6 +364,11 @@ public class WritableScopeImpl extends WritableScopeWithImports {
|
|||||||
return super.getClassifier(name);
|
return super.getClassifier(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getObjectDescriptor(@NotNull String name) {
|
||||||
|
return getObjectDescriptors().get(name);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
|
public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
|
||||||
checkMayWrite();
|
checkMayWrite();
|
||||||
|
|||||||
+13
@@ -147,6 +147,19 @@ public abstract class WritableScopeWithImports extends JetScopeAdapter implement
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getObjectDescriptor(@NotNull String name) {
|
||||||
|
checkMayRead();
|
||||||
|
|
||||||
|
for (JetScope imported : getImports()) {
|
||||||
|
ClassDescriptor objectDescriptor = imported.getObjectDescriptor(name);
|
||||||
|
if (objectDescriptor != null) {
|
||||||
|
return objectDescriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NamespaceDescriptor getNamespace(@NotNull String name) {
|
public NamespaceDescriptor getNamespace(@NotNull String name) {
|
||||||
checkMayRead();
|
checkMayRead();
|
||||||
|
|||||||
@@ -124,6 +124,19 @@ public class WriteThroughScope extends WritableScopeWithImports {
|
|||||||
return super.getClassifier(name); // Imports
|
return super.getClassifier(name); // Imports
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getObjectDescriptor(@NotNull String name) {
|
||||||
|
checkMayRead();
|
||||||
|
|
||||||
|
ClassDescriptor objectDescriptor = writableWorker.getObjectDescriptor(name);
|
||||||
|
if (objectDescriptor != null) return objectDescriptor;
|
||||||
|
|
||||||
|
objectDescriptor = getWorkerScope().getObjectDescriptor(name);
|
||||||
|
if (objectDescriptor != null) return objectDescriptor;
|
||||||
|
|
||||||
|
return super.getObjectDescriptor(name); // Imports
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addLabeledDeclaration(@NotNull DeclarationDescriptor descriptor) {
|
public void addLabeledDeclaration(@NotNull DeclarationDescriptor descriptor) {
|
||||||
checkMayWrite();
|
checkMayWrite();
|
||||||
@@ -166,6 +179,13 @@ public class WriteThroughScope extends WritableScopeWithImports {
|
|||||||
writableWorker.addClassifierDescriptor(classDescriptor);
|
writableWorker.addClassifierDescriptor(classDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addObjectDescriptor(@NotNull ClassDescriptor objectDescriptor) {
|
||||||
|
checkMayWrite();
|
||||||
|
|
||||||
|
writableWorker.addObjectDescriptor(objectDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addClassifierAlias(@NotNull String name, @NotNull ClassifierDescriptor classifierDescriptor) {
|
public void addClassifierAlias(@NotNull String name, @NotNull ClassifierDescriptor classifierDescriptor) {
|
||||||
checkMayWrite();
|
checkMayWrite();
|
||||||
|
|||||||
@@ -22,6 +22,11 @@ public class ErrorUtils {
|
|||||||
return ERROR_CLASS;
|
return ERROR_CLASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getObjectDescriptor(@NotNull String name) {
|
||||||
|
return ERROR_CLASS;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Set<VariableDescriptor> getProperties(@NotNull String name) {
|
public Set<VariableDescriptor> getProperties(@NotNull String name) {
|
||||||
|
|||||||
@@ -93,3 +93,38 @@ object M {
|
|||||||
fun foo() {}
|
fun foo() {}
|
||||||
class R() {}
|
class R() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//FILE:d.kt
|
||||||
|
package d
|
||||||
|
|
||||||
|
//import from objects before properties resolve
|
||||||
|
|
||||||
|
import A.*
|
||||||
|
import M.R
|
||||||
|
import M.R.bar
|
||||||
|
import M.T
|
||||||
|
import M.Y
|
||||||
|
|
||||||
|
var r: T = T()
|
||||||
|
val y: T = Y
|
||||||
|
|
||||||
|
fun f() {
|
||||||
|
bar()
|
||||||
|
R.bar()
|
||||||
|
B.foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
object M {
|
||||||
|
object R {
|
||||||
|
fun bar() {}
|
||||||
|
}
|
||||||
|
open class T() {}
|
||||||
|
|
||||||
|
object Y : T() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
object A {
|
||||||
|
object B {
|
||||||
|
fun foo() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user