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
|
@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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-6
@@ -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);
|
||||||
|
|||||||
+12
-3
@@ -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
|
||||||
|
}
|
||||||
+5
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user