diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index c7e59bd451c..1aec6bec876 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -114,8 +114,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes } this.staticMembers = staticMembers; - this.kotlin = psiClass != null && - (new PsiClassWrapper(psiClass).getJetClass().isDefined() || psiClass.getName().equals(JvmAbi.PACKAGE_CLASS)); + this.kotlin = psiClass != null && isKotlinClass(psiClass); classOrNamespaceDescriptor = descriptor; if (fqName != null && fqName.lastSegmentIs(Name.identifier(JvmAbi.PACKAGE_CLASS)) && psiClass != null && kotlin) { @@ -586,6 +585,10 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes return createClassObjectDescriptorForEnum(containing, psiClass); } + if (!isKotlinClass(psiClass)) { + return null; + } + // If there's at least one inner enum, we need to create a class object (to put this enum into) for (PsiClass innerClass : psiClass.getInnerClasses()) { if (isInnerEnum(innerClass, containing)) { @@ -610,6 +613,10 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes return classObjectDescriptor; } + private static boolean isKotlinClass(@NotNull PsiClass psiClass) { + return new PsiClassWrapper(psiClass).getJetClass().isDefined() || psiClass.getName().equals(JvmAbi.PACKAGE_CLASS); + } + private static boolean isInnerEnum(@NotNull PsiClass innerClass, DeclarationDescriptor owner) { if (!innerClass.isEnum()) return false; if (!(owner instanceof ClassDescriptor)) return false; @@ -679,7 +686,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes if (clazz == null) { throw new IllegalStateException("PsiClass not found by name " + containerFqName + ", required to be container declaration of " + fqName); } - if (isInnerEnum(psiClass, clazz)) { + if (isInnerEnum(psiClass, clazz) && isKotlinClass(psiClass)) { ClassDescriptor classObjectDescriptor = clazz.getClassObjectDescriptor(); if (classObjectDescriptor == null) { throw new IllegalStateException("Class object for a class with inner enum should've been created earlier: " + clazz); diff --git a/compiler/testData/codegen/stdlib/noClassObjectForJavaClass.java b/compiler/testData/codegen/stdlib/noClassObjectForJavaClass.java new file mode 100644 index 00000000000..6f48ad7b77d --- /dev/null +++ b/compiler/testData/codegen/stdlib/noClassObjectForJavaClass.java @@ -0,0 +1,7 @@ +package test; + +public class noClassObjectForJavaClass { + public enum E { ENTRY } + + public static String foo() { return "OK"; } +} diff --git a/compiler/testData/codegen/stdlib/noClassObjectForJavaClass.kt b/compiler/testData/codegen/stdlib/noClassObjectForJavaClass.kt new file mode 100644 index 00000000000..0bbeb9576b1 --- /dev/null +++ b/compiler/testData/codegen/stdlib/noClassObjectForJavaClass.kt @@ -0,0 +1,5 @@ +package test + +fun box(): String { + return noClassObjectForJavaClass.foo()!! +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java index ec14cdf0b78..5683b341d58 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java @@ -381,4 +381,8 @@ public class StdlibTest extends CodegenTestCase { public void testCollections() { blackBoxFile("jdk-annotations/collections.kt"); } + + public void testNoClassObjectForJavaClass() throws Exception { + blackBoxFileWithJava("stdlib/noClassObjectForJavaClass.kt"); + } }