diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index b049522a282..4d05e569156 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -128,43 +128,35 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { boolean isAbstract = false; boolean isInterface = false; boolean isFinal = false; - boolean isStatic; boolean isAnnotation = false; boolean isEnum = false; ClassKind kind = descriptor.getKind(); - if (kind == ClassKind.OBJECT) { - isStatic = isCompanionObject(descriptor); - isFinal = true; + Modality modality = descriptor.getModality(); + + if (modality == Modality.ABSTRACT || modality == Modality.SEALED) { + isAbstract = true; } - else { - Modality modality = descriptor.getModality(); - if (modality == Modality.ABSTRACT || modality == Modality.SEALED) { - isAbstract = true; - } + if (kind == ClassKind.INTERFACE) { + isAbstract = true; + isInterface = true; + } + else if (kind == ClassKind.ANNOTATION_CLASS) { + isAbstract = true; + isInterface = true; + isAnnotation = true; + } + else if (kind == ClassKind.ENUM_CLASS) { + isAbstract = hasAbstractMembers(descriptor); + isEnum = true; + } - if (kind == ClassKind.INTERFACE) { - isAbstract = true; - isInterface = true; - } - else if (kind == ClassKind.ANNOTATION_CLASS) { - isAbstract = true; - isInterface = true; - isAnnotation = true; - } - else if (kind == ClassKind.ENUM_CLASS) { - isAbstract = hasAbstractMembers(descriptor); - isEnum = true; - } - - if (modality != Modality.OPEN && !isAbstract) { - // Light-class mode: Do not make enum classes final since PsiClass corresponding to enum is expected to be inheritable from - isFinal = !(kind == ClassKind.ENUM_CLASS && !state.getClassBuilderMode().generateBodies); - } - - isStatic = !descriptor.isInner(); + if (modality != Modality.OPEN && !isAbstract) { + isFinal = kind == ClassKind.OBJECT || + // Light-class mode: Do not make enum classes final since PsiClass corresponding to enum is expected to be inheritable from + !(kind == ClassKind.ENUM_CLASS && !state.getClassBuilderMode().generateBodies); } int access = 0; @@ -176,7 +168,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { // Thus we must write full accessibility flags on inner classes in this mode access |= getVisibilityAccessFlag(descriptor); // Same for STATIC - if (isStatic) { + if (!descriptor.isInner()) { access |= ACC_STATIC; } } diff --git a/compiler/testData/asJava/lightClasses/NestedObjects.java b/compiler/testData/asJava/lightClasses/NestedObjects.java new file mode 100644 index 00000000000..095ac24d979 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/NestedObjects.java @@ -0,0 +1,37 @@ +public final class A { + public A() { /* compiled code */ } + + public static final class B { + public B() { /* compiled code */ } + + public static final class I { + public static final A.B.I INSTANCE; + + private I() { /* compiled code */ } + } + + public static final class II { + public static final A.B.II INSTANCE; + + private II() { /* compiled code */ } + } + } + + public static final class C { + public static final A.C INSTANCE; + + private C() { /* compiled code */ } + + public static final class D { + public static final A.C.D INSTANCE; + + private D() { /* compiled code */ } + + public static final class G { + public static final A.C.D.G INSTANCE; + + private G() { /* compiled code */ } + } + } + } +} \ No newline at end of file diff --git a/compiler/testData/asJava/lightClasses/NestedObjects.kt b/compiler/testData/asJava/lightClasses/NestedObjects.kt new file mode 100644 index 00000000000..59c3bbaa366 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/NestedObjects.kt @@ -0,0 +1,15 @@ +// A + +class A { + class B { + object I + + object II + } + + object C { + object D { + object G + } + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/light-analysis/enum/objectInEnum.txt b/compiler/testData/codegen/light-analysis/enum/objectInEnum.txt index cb2db623488..bb445ccef15 100644 --- a/compiler/testData/codegen/light-analysis/enum/objectInEnum.txt +++ b/compiler/testData/codegen/light-analysis/enum/objectInEnum.txt @@ -11,7 +11,7 @@ public enum class E { } @kotlin.Metadata -public final class E/O { +public final static class E/O { public final static field INSTANCE: E.O inner class E/O private method (): void @@ -27,7 +27,7 @@ final static class E/SUBCLASS { } @kotlin.Metadata -public final class E/SUBCLASS/O { +public final static class E/SUBCLASS/O { public final static field INSTANCE: E.SUBCLASS.O inner class E/SUBCLASS inner class E/SUBCLASS/O diff --git a/compiler/testData/codegen/light-analysis/innerNested/nestedObjects.txt b/compiler/testData/codegen/light-analysis/innerNested/nestedObjects.txt index 415d88547bb..9237bbb0b2f 100644 --- a/compiler/testData/codegen/light-analysis/innerNested/nestedObjects.txt +++ b/compiler/testData/codegen/light-analysis/innerNested/nestedObjects.txt @@ -6,7 +6,7 @@ public final class A { } @kotlin.Metadata -public final class A/B { +public final static class A/B { public final static field INSTANCE: A.B inner class A/B inner class A/B/C @@ -14,7 +14,7 @@ public final class A/B { } @kotlin.Metadata -public final class A/B/C { +public final static class A/B/C { public final static field INSTANCE: A.B.C private final static @org.jetbrains.annotations.NotNull field ok: java.lang.String inner class A/B diff --git a/compiler/testData/codegen/light-analysis/jvmStatic/privateMethod.txt b/compiler/testData/codegen/light-analysis/jvmStatic/privateMethod.txt index c435431ec12..55c54b8e803 100644 --- a/compiler/testData/codegen/light-analysis/jvmStatic/privateMethod.txt +++ b/compiler/testData/codegen/light-analysis/jvmStatic/privateMethod.txt @@ -7,7 +7,7 @@ public final class A { } @kotlin.Metadata -public final class A/Z { +public final static class A/Z { public final static field INSTANCE: A.Z private final static @org.jetbrains.annotations.NotNull field p: java.lang.String inner class A/Z diff --git a/compiler/testData/codegen/light-analysis/objects/kt2398.txt b/compiler/testData/codegen/light-analysis/objects/kt2398.txt index 4e7f3c0e7bc..7faf6b5e698 100644 --- a/compiler/testData/codegen/light-analysis/objects/kt2398.txt +++ b/compiler/testData/codegen/light-analysis/objects/kt2398.txt @@ -5,7 +5,7 @@ public final class C { } @kotlin.Metadata -public final class C/Obj { +public final static class C/Obj { public final static field INSTANCE: C.Obj private final static @org.jetbrains.annotations.NotNull field o: java.lang.String inner class C/Obj @@ -25,7 +25,7 @@ public final static class C/Obj/D { } @kotlin.Metadata -public final class C/Obj/InnerObj { +public final static class C/Obj/InnerObj { public final static field INSTANCE: C.Obj.InnerObj inner class C/Obj inner class C/Obj/InnerObj diff --git a/compiler/testData/codegen/light-analysis/objects/kt2675.txt b/compiler/testData/codegen/light-analysis/objects/kt2675.txt index 2ce50fe0592..ca4426a133c 100644 --- a/compiler/testData/codegen/light-analysis/objects/kt2675.txt +++ b/compiler/testData/codegen/light-analysis/objects/kt2675.txt @@ -6,7 +6,7 @@ public final class A { } @kotlin.Metadata -private final class A/Foo { +private final static class A/Foo { public final static field INSTANCE: A.Foo private final static @org.jetbrains.annotations.NotNull field foov: java.lang.String inner class A/Foo @@ -17,7 +17,7 @@ private final class A/Foo { } @kotlin.Metadata -public final class A/Foo/Bar { +public final static class A/Foo/Bar { public final static field INSTANCE: A.Foo.Bar private final static @org.jetbrains.annotations.NotNull field barv: java.lang.String inner class A/Foo diff --git a/compiler/testData/codegen/light-analysis/objects/nestedObjectWithSuperclass.txt b/compiler/testData/codegen/light-analysis/objects/nestedObjectWithSuperclass.txt index 137891c2165..50b3a463237 100644 --- a/compiler/testData/codegen/light-analysis/objects/nestedObjectWithSuperclass.txt +++ b/compiler/testData/codegen/light-analysis/objects/nestedObjectWithSuperclass.txt @@ -19,7 +19,7 @@ public final class Outer { } @kotlin.Metadata -public final class Outer/O { +public final static class Outer/O { public final static field INSTANCE: Outer.O inner class Outer/O private method (): void diff --git a/compiler/testData/codegen/light-analysis/objects/privateFunctionFromClosureInInitializer_kt5582.txt b/compiler/testData/codegen/light-analysis/objects/privateFunctionFromClosureInInitializer_kt5582.txt index 96a11dd9eca..71dfcb73463 100644 --- a/compiler/testData/codegen/light-analysis/objects/privateFunctionFromClosureInInitializer_kt5582.txt +++ b/compiler/testData/codegen/light-analysis/objects/privateFunctionFromClosureInInitializer_kt5582.txt @@ -10,7 +10,7 @@ public final class Foo { } @kotlin.Metadata -private final class Foo/O { +private final static class Foo/O { public final static field INSTANCE: Foo.O inner class Foo/O private method (): void diff --git a/compiler/testData/codegen/light-analysis/privateConstructors/withLinkedClasses.txt b/compiler/testData/codegen/light-analysis/privateConstructors/withLinkedClasses.txt index ac4d5f3d190..79da085e9e7 100644 --- a/compiler/testData/codegen/light-analysis/privateConstructors/withLinkedClasses.txt +++ b/compiler/testData/codegen/light-analysis/privateConstructors/withLinkedClasses.txt @@ -8,7 +8,7 @@ public class Outer { } @kotlin.Metadata -public final class Outer/First { +public final static class Outer/First { public final static field INSTANCE: Outer.First inner class Outer/First private method (): void diff --git a/compiler/testData/codegen/light-analysis/privateConstructors/withLinkedObjects.txt b/compiler/testData/codegen/light-analysis/privateConstructors/withLinkedObjects.txt index 523fe7bad9c..34be0d16995 100644 --- a/compiler/testData/codegen/light-analysis/privateConstructors/withLinkedObjects.txt +++ b/compiler/testData/codegen/light-analysis/privateConstructors/withLinkedObjects.txt @@ -9,21 +9,21 @@ public class Outer { } @kotlin.Metadata -public final class Outer/Another { +public final static class Outer/Another { public final static field INSTANCE: Outer.Another inner class Outer/Another private method (): void } @kotlin.Metadata -public final class Outer/Inner { +public final static class Outer/Inner { public final static field INSTANCE: Outer.Inner inner class Outer/Inner private method (): void } @kotlin.Metadata -public final class Outer/Other { +public final static class Outer/Other { public final static field INSTANCE: Outer.Other inner class Outer/Other private method (): void diff --git a/compiler/testData/codegen/light-analysis/reflection/modifiers/classes.txt b/compiler/testData/codegen/light-analysis/reflection/modifiers/classes.txt index 0be34f02f64..65da868ee1f 100644 --- a/compiler/testData/codegen/light-analysis/reflection/modifiers/classes.txt +++ b/compiler/testData/codegen/light-analysis/reflection/modifiers/classes.txt @@ -41,7 +41,7 @@ public final class S/InnerClass { } @kotlin.Metadata -public final class S/NonCompanionObject { +public final static class S/NonCompanionObject { public final static field INSTANCE: S.NonCompanionObject inner class S/NonCompanionObject private method (): void diff --git a/compiler/testData/codegen/light-analysis/sealed/objects.txt b/compiler/testData/codegen/light-analysis/sealed/objects.txt index da35fea6146..78021425c3d 100644 --- a/compiler/testData/codegen/light-analysis/sealed/objects.txt +++ b/compiler/testData/codegen/light-analysis/sealed/objects.txt @@ -12,14 +12,14 @@ public abstract class Season { } @kotlin.Metadata -public final class Season/Cold { +public final static class Season/Cold { public final static field INSTANCE: Season.Cold inner class Season/Cold private method (): void } @kotlin.Metadata -public final class Season/Warm { +public final static class Season/Warm { public final static field INSTANCE: Season.Warm inner class Season/Warm private method (): void diff --git a/compiler/testData/codegen/light-analysis/secondaryConstructors/accessToNestedObject.txt b/compiler/testData/codegen/light-analysis/secondaryConstructors/accessToNestedObject.txt index db60c2c9525..0eca53a44eb 100644 --- a/compiler/testData/codegen/light-analysis/secondaryConstructors/accessToNestedObject.txt +++ b/compiler/testData/codegen/light-analysis/secondaryConstructors/accessToNestedObject.txt @@ -9,7 +9,7 @@ public final class A { } @kotlin.Metadata -public final class A/B { +public final static class A/B { public final static field INSTANCE: A.B private final static field prop: int inner class A/B @@ -19,7 +19,7 @@ public final class A/B { } @kotlin.Metadata -public final class A/C { +public final static class A/C { public final static field INSTANCE: A.C inner class A/C private method (): void diff --git a/compiler/testData/codegen/light-analysis/statics/syntheticAccessor.txt b/compiler/testData/codegen/light-analysis/statics/syntheticAccessor.txt index 0ac653c0aed..078dc7cbf38 100644 --- a/compiler/testData/codegen/light-analysis/statics/syntheticAccessor.txt +++ b/compiler/testData/codegen/light-analysis/statics/syntheticAccessor.txt @@ -7,7 +7,7 @@ public final class A { } @kotlin.Metadata -public final class A/B { +public final static class A/B { public final static field INSTANCE: A.B private final static @org.jetbrains.annotations.NotNull field z: java.lang.String inner class A/B diff --git a/compiler/testData/codegen/light-analysis/when/sealedWhenInitialization.txt b/compiler/testData/codegen/light-analysis/when/sealedWhenInitialization.txt index 27ed9e64253..b7fc32cd884 100644 --- a/compiler/testData/codegen/light-analysis/when/sealedWhenInitialization.txt +++ b/compiler/testData/codegen/light-analysis/when/sealedWhenInitialization.txt @@ -6,7 +6,7 @@ public abstract class A { } @kotlin.Metadata -public final class A/B { +public final static class A/B { public final static field INSTANCE: A.B inner class A/B private method (): void diff --git a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java index 53e3fb46638..8fb58c8ef8c 100644 --- a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -72,6 +72,12 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT doTest(fileName); } + @TestMetadata("NestedObjects.kt") + public void testNestedObjects() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/NestedObjects.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/asJava/lightClasses/compilationErrors") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java index 0e9571b6f2e..05964a6030a 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java @@ -72,6 +72,12 @@ public class IdeCompiledLightClassTestGenerated extends AbstractIdeCompiledLight doTest(fileName); } + @TestMetadata("NestedObjects.kt") + public void testNestedObjects() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/NestedObjects.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/asJava/lightClasses/delegation") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java index 1d7f378367f..e3b0d0d4a7d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java @@ -72,6 +72,12 @@ public class IdeLightClassTestGenerated extends AbstractIdeLightClassTest { doTest(fileName); } + @TestMetadata("NestedObjects.kt") + public void testNestedObjects() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/NestedObjects.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/asJava/lightClasses/compilationErrors") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)