Check for ClassKind in getClassifier() and getObjectDescriptor() implementations in java scopes
# KT-3124 fixed
This commit is contained in:
+24
-11
@@ -32,7 +32,7 @@ public abstract class JavaClassMembersScope extends JavaBaseScope {
|
||||
@NotNull
|
||||
protected final ClassPsiDeclarationProvider declarationProvider;
|
||||
|
||||
private Map<Name, ClassifierDescriptor> classifiersMap = null;
|
||||
private Map<Name, ClassDescriptor> innerClassesMap = null;
|
||||
|
||||
protected JavaClassMembersScope(
|
||||
@NotNull ClassOrNamespaceDescriptor descriptor,
|
||||
@@ -56,21 +56,16 @@ public abstract class JavaClassMembersScope extends JavaBaseScope {
|
||||
return getResolver().resolveFunctionGroup(name, declarationProvider, descriptor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClassifierDescriptor getClassifier(@NotNull Name name) {
|
||||
return getClassifiersMap().get(name);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private Map<Name, ClassifierDescriptor> getClassifiersMap() {
|
||||
if (classifiersMap == null) {
|
||||
private Map<Name, ClassDescriptor> getInnerClassesMap() {
|
||||
if (innerClassesMap == null) {
|
||||
Collection<ClassDescriptor> innerClasses = getInnerClasses();
|
||||
classifiersMap = new HashMap<Name, ClassifierDescriptor>();
|
||||
innerClassesMap = new HashMap<Name, ClassDescriptor>();
|
||||
for (ClassDescriptor innerClass : innerClasses) {
|
||||
classifiersMap.put(innerClass.getName(), innerClass);
|
||||
innerClassesMap.put(innerClass.getName(), innerClass);
|
||||
}
|
||||
}
|
||||
return classifiersMap;
|
||||
return innerClassesMap;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -78,4 +73,22 @@ public abstract class JavaClassMembersScope extends JavaBaseScope {
|
||||
protected Collection<ClassDescriptor> computeInnerClasses() {
|
||||
return getResolver().resolveInnerClasses(descriptor, declarationProvider);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
|
||||
ClassDescriptor innerClass = getInnerClassesMap().get(name);
|
||||
if (innerClass != null && innerClass.getKind().isObject()) {
|
||||
return innerClass;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClassifierDescriptor getClassifier(@NotNull Name name) {
|
||||
ClassDescriptor innerClass = getInnerClassesMap().get(name);
|
||||
if (innerClass == null || innerClass.getKind().isObject()) {
|
||||
return null;
|
||||
}
|
||||
return innerClass;
|
||||
}
|
||||
}
|
||||
|
||||
-6
@@ -39,12 +39,6 @@ public final class JavaClassStaticMembersScope extends JavaClassMembersScope {
|
||||
this.packageFQN = packageFQN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
|
||||
//TODO: check that class is an object
|
||||
return getResolver().resolveClass(packageFQN.child(name), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NamespaceDescriptor getNamespace(@NotNull Name name) {
|
||||
return getResolver().resolveNamespace(packageFQN.child(name), DescriptorSearchRule.INCLUDE_KOTLIN);
|
||||
|
||||
+12
-3
@@ -52,13 +52,22 @@ public abstract class JavaPackageScope extends JavaBaseScope {
|
||||
|
||||
@Override
|
||||
public ClassifierDescriptor getClassifier(@NotNull Name name) {
|
||||
return getResolver().resolveClass(packageFQN.child(name), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
|
||||
ClassDescriptor classDescriptor =
|
||||
getResolver().resolveClass(packageFQN.child(name), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
|
||||
if (classDescriptor == null || classDescriptor.getKind().isObject()) {
|
||||
return null;
|
||||
}
|
||||
return classDescriptor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
|
||||
//TODO: check that class is an object
|
||||
return getResolver().resolveClass(packageFQN.child(name), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
|
||||
ClassDescriptor classDescriptor =
|
||||
getResolver().resolveClass(packageFQN.child(name), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
|
||||
if (classDescriptor != null && classDescriptor.getKind().isObject()) {
|
||||
return classDescriptor;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -39,6 +39,9 @@ public interface JetScope {
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Should not return object (class object or enum entry) class descriptors.
|
||||
*/
|
||||
@Nullable
|
||||
ClassifierDescriptor getClassifier(@NotNull Name name);
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
//This a test for blinking bug from KT-3124
|
||||
package some
|
||||
|
||||
public object SOME_OBJECT {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
//This a test for blinking bug from KT-3124
|
||||
|
||||
import some.SOME_OBJECT
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val a = SOME_OBJECT
|
||||
}
|
||||
+5
@@ -43,6 +43,11 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl
|
||||
doTest("compiler/testData/compileKotlinAgainstKotlin/DefaultConstructor.A.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("ImportObject.A.kt")
|
||||
public void testImportObject_A() throws Exception {
|
||||
doTest("compiler/testData/compileKotlinAgainstKotlin/ImportObject.A.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("Simple.A.kt")
|
||||
public void testSimple_A() throws Exception {
|
||||
doTest("compiler/testData/compileKotlinAgainstKotlin/Simple.A.kt");
|
||||
|
||||
Reference in New Issue
Block a user