Properly load objects nested into class objects from Java
This commit is contained in:
+1
-1
@@ -149,7 +149,7 @@ public final class JavaClassObjectResolver {
|
|||||||
classObjectDescriptor.createTypeConstructor();
|
classObjectDescriptor.createTypeConstructor();
|
||||||
JavaClassNonStaticMembersScope classMembersScope = new JavaClassNonStaticMembersScope(classObjectDescriptor, data, semanticServices);
|
JavaClassNonStaticMembersScope classMembersScope = new JavaClassNonStaticMembersScope(classObjectDescriptor, data, semanticServices);
|
||||||
WritableScopeImpl writableScope =
|
WritableScopeImpl writableScope =
|
||||||
new WritableScopeImpl(classMembersScope, classObjectDescriptor, RedeclarationHandler.THROW_EXCEPTION, fqName.toString());
|
new WritableScopeImpl(classMembersScope, classObjectDescriptor, RedeclarationHandler.THROW_EXCEPTION, "Member lookup scope");
|
||||||
writableScope.changeLockLevel(WritableScope.LockLevel.BOTH);
|
writableScope.changeLockLevel(WritableScope.LockLevel.BOTH);
|
||||||
classObjectDescriptor.setScopeForMemberLookup(writableScope);
|
classObjectDescriptor.setScopeForMemberLookup(writableScope);
|
||||||
classObjectDescriptor.setScopeForConstructorResolve(classMembersScope);
|
classObjectDescriptor.setScopeForConstructorResolve(classMembersScope);
|
||||||
|
|||||||
+24
-5
@@ -20,7 +20,9 @@ import com.google.common.collect.Lists;
|
|||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.intellij.openapi.progress.ProgressIndicatorProvider;
|
import com.intellij.openapi.progress.ProgressIndicatorProvider;
|
||||||
|
import com.intellij.openapi.util.Condition;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
|
import com.intellij.util.containers.ContainerUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
@@ -33,10 +35,7 @@ import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider;
|
|||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScopeImpl;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScopeImpl;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public abstract class JavaBaseScope extends JetScopeImpl {
|
public abstract class JavaBaseScope extends JetScopeImpl {
|
||||||
|
|
||||||
@@ -50,6 +49,8 @@ public abstract class JavaBaseScope extends JetScopeImpl {
|
|||||||
private final Map<Name, Set<VariableDescriptor>> propertyDescriptors = Maps.newHashMap();
|
private final Map<Name, Set<VariableDescriptor>> propertyDescriptors = Maps.newHashMap();
|
||||||
@Nullable
|
@Nullable
|
||||||
private Collection<DeclarationDescriptor> allDescriptors = null;
|
private Collection<DeclarationDescriptor> allDescriptors = null;
|
||||||
|
@Nullable
|
||||||
|
private Set<ClassDescriptor> objectDescriptors = null;
|
||||||
@NotNull
|
@NotNull
|
||||||
protected final ClassOrNamespaceDescriptor descriptor;
|
protected final ClassOrNamespaceDescriptor descriptor;
|
||||||
|
|
||||||
@@ -130,10 +131,19 @@ public abstract class JavaBaseScope extends JetScopeImpl {
|
|||||||
protected Collection<DeclarationDescriptor> computeAllDescriptors() {
|
protected Collection<DeclarationDescriptor> computeAllDescriptors() {
|
||||||
Collection<DeclarationDescriptor> result = Sets.newHashSet();
|
Collection<DeclarationDescriptor> result = Sets.newHashSet();
|
||||||
result.addAll(computeFieldAndFunctionDescriptors());
|
result.addAll(computeFieldAndFunctionDescriptors());
|
||||||
result.addAll(getInnerClasses());
|
result.addAll(filterObjects(getInnerClasses(), false));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Set<ClassDescriptor> getObjectDescriptors() {
|
||||||
|
if (objectDescriptors == null) {
|
||||||
|
objectDescriptors = new HashSet<ClassDescriptor>(filterObjects(getInnerClasses(), true));
|
||||||
|
}
|
||||||
|
return objectDescriptors;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
protected abstract Collection<ClassDescriptor> computeInnerClasses();
|
protected abstract Collection<ClassDescriptor> computeInnerClasses();
|
||||||
|
|
||||||
@@ -174,4 +184,13 @@ public abstract class JavaBaseScope extends JetScopeImpl {
|
|||||||
}
|
}
|
||||||
return innerClasses;
|
return innerClasses;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static <T extends ClassDescriptor> Collection<T> filterObjects(Collection<T> classes, final boolean objects) {
|
||||||
|
return ContainerUtil.filter(classes, new Condition<T>() {
|
||||||
|
@Override
|
||||||
|
public boolean value(T classDescriptor) {
|
||||||
|
return classDescriptor.getKind().isObject() == objects;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ public class WritableScopeImpl extends WritableScopeWithImports {
|
|||||||
private final Multimap<Name, DeclarationDescriptor> declaredDescriptorsAccessibleBySimpleName = HashMultimap.create();
|
private final Multimap<Name, DeclarationDescriptor> declaredDescriptorsAccessibleBySimpleName = HashMultimap.create();
|
||||||
private boolean allDescriptorsDone = false;
|
private boolean allDescriptorsDone = false;
|
||||||
|
|
||||||
|
private Set<ClassDescriptor> allObjectDescriptors = null;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private final DeclarationDescriptor ownerDeclarationDescriptor;
|
private final DeclarationDescriptor ownerDeclarationDescriptor;
|
||||||
|
|
||||||
@@ -401,13 +403,26 @@ public class WritableScopeImpl extends WritableScopeWithImports {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
|
public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
|
||||||
return getObjectDescriptorsMap().get(name);
|
ClassDescriptor descriptor = getObjectDescriptorsMap().get(name);
|
||||||
|
if (descriptor != null) return descriptor;
|
||||||
|
|
||||||
|
ClassDescriptor fromWorker = getWorkerScope().getObjectDescriptor(name);
|
||||||
|
if (fromWorker != null) return fromWorker;
|
||||||
|
|
||||||
|
return super.getObjectDescriptor(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Set<ClassDescriptor> getObjectDescriptors() {
|
public Set<ClassDescriptor> getObjectDescriptors() {
|
||||||
return Sets.newHashSet(getObjectDescriptorsMap().values());
|
if (allObjectDescriptors == null) {
|
||||||
|
allObjectDescriptors = Sets.newHashSet(getObjectDescriptorsMap().values());
|
||||||
|
allObjectDescriptors.addAll(getWorkerScope().getObjectDescriptors());
|
||||||
|
for (JetScope imported : getImports()) {
|
||||||
|
allObjectDescriptors.addAll(imported.getObjectDescriptors());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return allObjectDescriptors;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ package toplevelObjectDeclarations
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object B : <!UNRESOLVED_REFERENCE!>A<!> {}
|
object B : <!SUPERTYPE_NOT_INITIALIZED, FINAL_SUPERTYPE!>A<!> {}
|
||||||
|
|
||||||
val x = A.foo()
|
val x = A.foo()
|
||||||
|
|
||||||
@@ -26,4 +26,4 @@ package toplevelObjectDeclarations
|
|||||||
override fun foo() : Int = 1
|
override fun foo() : Int = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
val z = y.foo()
|
val z = y.foo()
|
||||||
@@ -3,4 +3,4 @@ package toplevelObjectDeclarations
|
|||||||
|
|
||||||
object CObj {}
|
object CObj {}
|
||||||
|
|
||||||
object DOjb : <!UNRESOLVED_REFERENCE!>CObj<!> {}
|
object DOjb : <!SUPERTYPE_NOT_INITIALIZED, FINAL_SUPERTYPE!>CObj<!> {}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
public class Outer {
|
||||||
|
public object Obj {
|
||||||
|
public val v: String = "val"
|
||||||
|
public fun f(): String = "fun"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
public final class Outer {
|
||||||
|
/*primary*/ public constructor Outer()
|
||||||
|
public final val Obj: test.Outer.Obj
|
||||||
|
|
||||||
|
public object Obj {
|
||||||
|
/*primary*/ private constructor Obj()
|
||||||
|
public final val v: jet.String
|
||||||
|
public final fun <get-v>(): jet.String
|
||||||
|
public final fun f(): jet.String
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -158,6 +158,11 @@ public class LoadCompiledKotlinTestGenerated extends AbstractLoadCompiledKotlinT
|
|||||||
doTestWithAccessors("compiler/testData/loadKotlin/class/NamedObject.kt");
|
doTestWithAccessors("compiler/testData/loadKotlin/class/NamedObject.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("NamedObjectInClass.kt")
|
||||||
|
public void testNamedObjectInClass() throws Exception {
|
||||||
|
doTestWithAccessors("compiler/testData/loadKotlin/class/NamedObjectInClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("NamedObjectInClassObject.kt")
|
@TestMetadata("NamedObjectInClassObject.kt")
|
||||||
public void testNamedObjectInClassObject() throws Exception {
|
public void testNamedObjectInClassObject() throws Exception {
|
||||||
doTestWithAccessors("compiler/testData/loadKotlin/class/NamedObjectInClassObject.kt");
|
doTestWithAccessors("compiler/testData/loadKotlin/class/NamedObjectInClassObject.kt");
|
||||||
|
|||||||
+5
@@ -160,6 +160,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
|
|||||||
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/class/NamedObject.kt");
|
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/class/NamedObject.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("NamedObjectInClass.kt")
|
||||||
|
public void testNamedObjectInClass() throws Exception {
|
||||||
|
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/class/NamedObjectInClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("NamedObjectInClassObject.kt")
|
@TestMetadata("NamedObjectInClassObject.kt")
|
||||||
public void testNamedObjectInClassObject() throws Exception {
|
public void testNamedObjectInClassObject() throws Exception {
|
||||||
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/class/NamedObjectInClassObject.kt");
|
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/class/NamedObjectInClassObject.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user