From 8bdb54929be15245c0191e0f6faad2923d23dc4a Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 23 Nov 2016 17:54:15 +0300 Subject: [PATCH] Fix @JvmMultifileClass in ClassBuilderMode=LIGHT_CLASSES --- .../kotlin/codegen/ClassBuilderMode.java | 24 ++++++++--- .../codegen/MultifileClassPartCodegen.kt | 40 +++++++++++-------- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderMode.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderMode.java index 1d6dfcff082..ef1549fd8de 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderMode.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderMode.java @@ -20,11 +20,18 @@ public class ClassBuilderMode { public final boolean generateBodies; public final boolean generateMetadata; public final boolean generateSourceRetentionAnnotations; + public final boolean generateMultiFileFacadePartClasses; - private ClassBuilderMode(boolean generateBodies, boolean generateMetadata, boolean generateSourceRetentionAnnotations) { + private ClassBuilderMode( + boolean generateBodies, + boolean generateMetadata, + boolean generateSourceRetentionAnnotations, + boolean generateMultiFileFacadePartClasses + ) { this.generateBodies = generateBodies; this.generateMetadata = generateMetadata; this.generateSourceRetentionAnnotations = generateSourceRetentionAnnotations; + this.generateMultiFileFacadePartClasses = generateMultiFileFacadePartClasses; } public static ClassBuilderMode full(boolean generateSourceRetentionAnnotations) { @@ -37,7 +44,8 @@ public class ClassBuilderMode { private final static ClassBuilderMode FULL = new ClassBuilderMode( /* bodies = */ true, /* metadata = */ true, - /* sourceRetention = */ false); + /* sourceRetention = */ false, + /* generateMultiFileFacadePartClasses = */ true); /** * Full function bodies, write annotations with the "source" retention. @@ -45,7 +53,8 @@ public class ClassBuilderMode { private final static ClassBuilderMode KAPT2 = new ClassBuilderMode( /* bodies = */ true, /* metadata = */ true, - /* sourceRetention = */ true); + /* sourceRetention = */ true, + /* generateMultiFileFacadePartClasses = */ false); /** * Generating light classes: Only function signatures @@ -53,7 +62,8 @@ public class ClassBuilderMode { public final static ClassBuilderMode LIGHT_CLASSES = new ClassBuilderMode( /* bodies = */ false, /* metadata = */ false, - /* sourceRetention = */ true); + /* sourceRetention = */ true, + /* generateMultiFileFacadePartClasses = */ false); /** * Function signatures + metadata (to support incremental compilation with kapt) @@ -61,7 +71,8 @@ public class ClassBuilderMode { public final static ClassBuilderMode KAPT = new ClassBuilderMode( /* bodies = */ false, /* metadata = */ true, - /* sourceRetention = */ true); + /* sourceRetention = */ true, + /* generateMultiFileFacadePartClasses = */ false); /** * Function signatures + metadata (to support incremental compilation with kapt) @@ -69,5 +80,6 @@ public class ClassBuilderMode { public final static ClassBuilderMode KAPT3 = new ClassBuilderMode( /* bodies = */ false, /* metadata = */ true, - /* sourceRetention = */ true); + /* sourceRetention = */ true, + /* generateMultiFileFacadePartClasses = */ true); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt index cda0dd6d777..a8b5cf16aea 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt @@ -78,17 +78,21 @@ class MultifileClassPartCodegen( } override fun generate() { - if (!state.classBuilderMode.generateBodies) return + if (!state.classBuilderMode.generateMultiFileFacadePartClasses) return super.generate() + val generateBodies = state.classBuilderMode.generateBodies + if (shouldGeneratePartHierarchy) { v.newMethod(OtherOrigin(packageFragment), Opcodes.ACC_PUBLIC, "", "()V", null, null).apply { - visitCode() - visitVarInsn(Opcodes.ALOAD, 0) - visitMethodInsn(Opcodes.INVOKESPECIAL, superClassInternalName, "", "()V", false) - visitInsn(Opcodes.RETURN) - visitMaxs(1, 1) + if (generateBodies) { + visitCode() + visitVarInsn(Opcodes.ALOAD, 0) + visitMethodInsn(Opcodes.INVOKESPECIAL, superClassInternalName, "", "()V", false) + visitInsn(Opcodes.RETURN) + visitMaxs(1, 1) + } visitEnd() } } @@ -99,20 +103,24 @@ class MultifileClassPartCodegen( CLINIT_SYNC_NAME, "I", null, null) newSpecialMethod(packageFragment, CLINIT_TRIGGER_NAME).apply { - visitCode() - visitFieldInsn(Opcodes.GETSTATIC, staticInitClassType.internalName, CLINIT_SYNC_NAME, "I") - visitInsn(Opcodes.RETURN) - visitMaxs(1, 0) + if (generateBodies) { + visitCode() + visitFieldInsn(Opcodes.GETSTATIC, staticInitClassType.internalName, CLINIT_SYNC_NAME, "I") + visitInsn(Opcodes.RETURN) + visitMaxs(1, 0) + } visitEnd() } newSpecialMethod(packageFragment, "").apply { - visitCode() - visitMethodInsn(Opcodes.INVOKESTATIC, partType.internalName, DEFERRED_PART_CLINIT_NAME, "()V", false) - visitInsn(Opcodes.ICONST_0) - visitFieldInsn(Opcodes.PUTSTATIC, staticInitClassType.internalName, CLINIT_SYNC_NAME, "I") - visitInsn(Opcodes.RETURN) - visitMaxs(1, 0) + if (generateBodies) { + visitCode() + visitMethodInsn(Opcodes.INVOKESTATIC, partType.internalName, DEFERRED_PART_CLINIT_NAME, "()V", false) + visitInsn(Opcodes.ICONST_0) + visitFieldInsn(Opcodes.PUTSTATIC, staticInitClassType.internalName, CLINIT_SYNC_NAME, "I") + visitInsn(Opcodes.RETURN) + visitMaxs(1, 0) + } visitEnd() }