Check for ClassKind in getClassifier() and getObjectDescriptor() implementations in java scopes

# KT-3124 fixed
This commit is contained in:
Pavel V. Talanov
2012-12-05 20:53:02 +04:00
parent 0fea6822c3
commit ad848f2ebc
7 changed files with 57 additions and 20 deletions
@@ -32,7 +32,7 @@ public abstract class JavaClassMembersScope extends JavaBaseScope {
@NotNull @NotNull
protected final ClassPsiDeclarationProvider declarationProvider; protected final ClassPsiDeclarationProvider declarationProvider;
private Map<Name, ClassifierDescriptor> classifiersMap = null; private Map<Name, ClassDescriptor> innerClassesMap = null;
protected JavaClassMembersScope( protected JavaClassMembersScope(
@NotNull ClassOrNamespaceDescriptor descriptor, @NotNull ClassOrNamespaceDescriptor descriptor,
@@ -56,21 +56,16 @@ public abstract class JavaClassMembersScope extends JavaBaseScope {
return getResolver().resolveFunctionGroup(name, declarationProvider, descriptor); return getResolver().resolveFunctionGroup(name, declarationProvider, descriptor);
} }
@Override
public ClassifierDescriptor getClassifier(@NotNull Name name) {
return getClassifiersMap().get(name);
}
@NotNull @NotNull
private Map<Name, ClassifierDescriptor> getClassifiersMap() { private Map<Name, ClassDescriptor> getInnerClassesMap() {
if (classifiersMap == null) { if (innerClassesMap == null) {
Collection<ClassDescriptor> innerClasses = getInnerClasses(); Collection<ClassDescriptor> innerClasses = getInnerClasses();
classifiersMap = new HashMap<Name, ClassifierDescriptor>(); innerClassesMap = new HashMap<Name, ClassDescriptor>();
for (ClassDescriptor innerClass : innerClasses) { for (ClassDescriptor innerClass : innerClasses) {
classifiersMap.put(innerClass.getName(), innerClass); innerClassesMap.put(innerClass.getName(), innerClass);
} }
} }
return classifiersMap; return innerClassesMap;
} }
@NotNull @NotNull
@@ -78,4 +73,22 @@ public abstract class JavaClassMembersScope extends JavaBaseScope {
protected Collection<ClassDescriptor> computeInnerClasses() { protected Collection<ClassDescriptor> computeInnerClasses() {
return getResolver().resolveInnerClasses(descriptor, declarationProvider); 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;
}
} }
@@ -39,12 +39,6 @@ public final class JavaClassStaticMembersScope extends JavaClassMembersScope {
this.packageFQN = packageFQN; 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 @Override
public NamespaceDescriptor getNamespace(@NotNull Name name) { public NamespaceDescriptor getNamespace(@NotNull Name name) {
return getResolver().resolveNamespace(packageFQN.child(name), DescriptorSearchRule.INCLUDE_KOTLIN); return getResolver().resolveNamespace(packageFQN.child(name), DescriptorSearchRule.INCLUDE_KOTLIN);
@@ -52,13 +52,22 @@ public abstract class JavaPackageScope extends JavaBaseScope {
@Override @Override
public ClassifierDescriptor getClassifier(@NotNull Name name) { 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 @Override
public ClassDescriptor getObjectDescriptor(@NotNull Name name) { public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
//TODO: check that class is an object ClassDescriptor classDescriptor =
return getResolver().resolveClass(packageFQN.child(name), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN); getResolver().resolveClass(packageFQN.child(name), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
if (classDescriptor != null && classDescriptor.getKind().isObject()) {
return classDescriptor;
}
return null;
} }
@Override @Override
@@ -39,6 +39,9 @@ public interface JetScope {
} }
}; };
/**
* Should not return object (class object or enum entry) class descriptors.
*/
@Nullable @Nullable
ClassifierDescriptor getClassifier(@NotNull Name name); 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
}
@@ -43,6 +43,11 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl
doTest("compiler/testData/compileKotlinAgainstKotlin/DefaultConstructor.A.kt"); 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") @TestMetadata("Simple.A.kt")
public void testSimple_A() throws Exception { public void testSimple_A() throws Exception {
doTest("compiler/testData/compileKotlinAgainstKotlin/Simple.A.kt"); doTest("compiler/testData/compileKotlinAgainstKotlin/Simple.A.kt");