Fix @JvmMultifileClass in ClassBuilderMode=LIGHT_CLASSES

This commit is contained in:
Yan Zhulanow
2016-11-23 17:54:15 +03:00
parent 0914a65234
commit 8bdb54929b
2 changed files with 42 additions and 22 deletions
@@ -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);
}
@@ -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, "<init>", "()V", null, null).apply {
visitCode()
visitVarInsn(Opcodes.ALOAD, 0)
visitMethodInsn(Opcodes.INVOKESPECIAL, superClassInternalName, "<init>", "()V", false)
visitInsn(Opcodes.RETURN)
visitMaxs(1, 1)
if (generateBodies) {
visitCode()
visitVarInsn(Opcodes.ALOAD, 0)
visitMethodInsn(Opcodes.INVOKESPECIAL, superClassInternalName, "<init>", "()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, "<clinit>").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()
}