diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java index ee4ebc2e4bb..c1dae449bd7 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java @@ -160,13 +160,18 @@ public final class JavaNamespaceResolver { } PsiClass psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE); - if (psiClass != null && !psiClass.isEnum()) { - trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.CLASS_STATICS); - return new JavaClassStaticMembersScope(namespaceDescriptor, - createDeclarationProviderForClassStaticMembers(psiClass), - fqName, javaSemanticServices); + if (psiClass == null) { + return null; } - return null; + if (psiClass.isEnum()) { + // NOTE: we don't want to create namespace for enum classes because we put + // static members of enum class into class object descriptor + return null; + } + trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.CLASS_STATICS); + return new JavaClassStaticMembersScope(namespaceDescriptor, + createDeclarationProviderForClassStaticMembers(psiClass), + fqName, javaSemanticServices); } private void cache(@NotNull FqName fqName, @Nullable JavaBaseScope packageScope) { diff --git a/compiler/testData/javaDescriptorResolver/staticMembers/Enum.java b/compiler/testData/javaDescriptorResolver/staticMembers/Enum.java new file mode 100644 index 00000000000..19106c02dad --- /dev/null +++ b/compiler/testData/javaDescriptorResolver/staticMembers/Enum.java @@ -0,0 +1,15 @@ +package test; + +public enum Enum { + A, + B, + C; + + public static class Nested { + void foo() {} + } + + public class Inner { + void bar() {} + } +} \ No newline at end of file diff --git a/compiler/testData/javaDescriptorResolver/staticMembers/Enum_non_static.txt b/compiler/testData/javaDescriptorResolver/staticMembers/Enum_non_static.txt new file mode 100644 index 00000000000..ac5783016bf --- /dev/null +++ b/compiler/testData/javaDescriptorResolver/staticMembers/Enum_non_static.txt @@ -0,0 +1,23 @@ +namespace test + +public final enum class test.Enum : jet.Enum { + private final /*constructor*/ fun (): test.Enum + public final override /*1*/ /*fake_override*/ fun name(): jet.String + public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int + public open class test.Enum.Inner : java.lang.Object { + public final /*constructor*/ fun (): test.Enum.Inner + package open fun bar(): jet.Tuple0 + } + public final class object test.Enum. { + private final /*constructor*/ fun (): test.Enum. + public final val A: test.Enum + public final val B: test.Enum + public final val C: test.Enum + public open class test.Enum.Nested : java.lang.Object { + public final /*constructor*/ fun (): test.Enum.Nested + package open fun foo(): jet.Tuple0 + } + public final fun valueOf(/*0*/ value: jet.String): test.Enum + public final fun values(): jet.Array + } +} diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/StaticMembersJavaDescriptorResolverTest.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/StaticMembersJavaDescriptorResolverTest.java index fca52f895d8..383eccf3d0c 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/StaticMembersJavaDescriptorResolverTest.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/StaticMembersJavaDescriptorResolverTest.java @@ -50,6 +50,10 @@ public final class StaticMembersJavaDescriptorResolverTest extends AbstractJavaR doTest(); } + public void testEnum() throws Exception { + doTest(); + } + private void doTest() throws IOException { String name = getTestName(false); compileJavaFile(name + ".java"); @@ -58,8 +62,12 @@ public final class StaticMembersJavaDescriptorResolverTest extends AbstractJavaR compareNamespaces(namespaceWithClass, namespaceWithClass, DONT_INCLUDE_METHODS_OF_OBJECT, new File(PATH + name + "_non_static.txt")); NamespaceDescriptor namespaceWithStaticMembers = javaDescriptorResolver.resolveNamespace(new FqName(DEFAULT_PACKAGE + "." + name)); - Assert.assertNotNull(namespaceWithStaticMembers); - compareNamespaces(namespaceWithStaticMembers, namespaceWithStaticMembers, DONT_INCLUDE_METHODS_OF_OBJECT, - new File(PATH + name + "_static.txt")); + File fileWithStaticMembers = new File(PATH + name + "_static.txt"); + if (namespaceWithStaticMembers == null) { + Assert.assertTrue(!fileWithStaticMembers.exists()); + } else { + compareNamespaces(namespaceWithStaticMembers, namespaceWithStaticMembers, DONT_INCLUDE_METHODS_OF_OBJECT, + fileWithStaticMembers); + } } }