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 generateBodies;
public final boolean generateMetadata; public final boolean generateMetadata;
public final boolean generateSourceRetentionAnnotations; 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.generateBodies = generateBodies;
this.generateMetadata = generateMetadata; this.generateMetadata = generateMetadata;
this.generateSourceRetentionAnnotations = generateSourceRetentionAnnotations; this.generateSourceRetentionAnnotations = generateSourceRetentionAnnotations;
this.generateMultiFileFacadePartClasses = generateMultiFileFacadePartClasses;
} }
public static ClassBuilderMode full(boolean generateSourceRetentionAnnotations) { public static ClassBuilderMode full(boolean generateSourceRetentionAnnotations) {
@@ -37,7 +44,8 @@ public class ClassBuilderMode {
private final static ClassBuilderMode FULL = new ClassBuilderMode( private final static ClassBuilderMode FULL = new ClassBuilderMode(
/* bodies = */ true, /* bodies = */ true,
/* metadata = */ true, /* metadata = */ true,
/* sourceRetention = */ false); /* sourceRetention = */ false,
/* generateMultiFileFacadePartClasses = */ true);
/** /**
* Full function bodies, write annotations with the "source" retention. * Full function bodies, write annotations with the "source" retention.
@@ -45,7 +53,8 @@ public class ClassBuilderMode {
private final static ClassBuilderMode KAPT2 = new ClassBuilderMode( private final static ClassBuilderMode KAPT2 = new ClassBuilderMode(
/* bodies = */ true, /* bodies = */ true,
/* metadata = */ true, /* metadata = */ true,
/* sourceRetention = */ true); /* sourceRetention = */ true,
/* generateMultiFileFacadePartClasses = */ false);
/** /**
* Generating light classes: Only function signatures * Generating light classes: Only function signatures
@@ -53,7 +62,8 @@ public class ClassBuilderMode {
public final static ClassBuilderMode LIGHT_CLASSES = new ClassBuilderMode( public final static ClassBuilderMode LIGHT_CLASSES = new ClassBuilderMode(
/* bodies = */ false, /* bodies = */ false,
/* metadata = */ false, /* metadata = */ false,
/* sourceRetention = */ true); /* sourceRetention = */ true,
/* generateMultiFileFacadePartClasses = */ false);
/** /**
* Function signatures + metadata (to support incremental compilation with kapt) * Function signatures + metadata (to support incremental compilation with kapt)
@@ -61,7 +71,8 @@ public class ClassBuilderMode {
public final static ClassBuilderMode KAPT = new ClassBuilderMode( public final static ClassBuilderMode KAPT = new ClassBuilderMode(
/* bodies = */ false, /* bodies = */ false,
/* metadata = */ true, /* metadata = */ true,
/* sourceRetention = */ true); /* sourceRetention = */ true,
/* generateMultiFileFacadePartClasses = */ false);
/** /**
* Function signatures + metadata (to support incremental compilation with kapt) * Function signatures + metadata (to support incremental compilation with kapt)
@@ -69,5 +80,6 @@ public class ClassBuilderMode {
public final static ClassBuilderMode KAPT3 = new ClassBuilderMode( public final static ClassBuilderMode KAPT3 = new ClassBuilderMode(
/* bodies = */ false, /* bodies = */ false,
/* metadata = */ true, /* metadata = */ true,
/* sourceRetention = */ true); /* sourceRetention = */ true,
/* generateMultiFileFacadePartClasses = */ true);
} }
@@ -78,17 +78,21 @@ class MultifileClassPartCodegen(
} }
override fun generate() { override fun generate() {
if (!state.classBuilderMode.generateBodies) return if (!state.classBuilderMode.generateMultiFileFacadePartClasses) return
super.generate() super.generate()
val generateBodies = state.classBuilderMode.generateBodies
if (shouldGeneratePartHierarchy) { if (shouldGeneratePartHierarchy) {
v.newMethod(OtherOrigin(packageFragment), Opcodes.ACC_PUBLIC, "<init>", "()V", null, null).apply { v.newMethod(OtherOrigin(packageFragment), Opcodes.ACC_PUBLIC, "<init>", "()V", null, null).apply {
visitCode() if (generateBodies) {
visitVarInsn(Opcodes.ALOAD, 0) visitCode()
visitMethodInsn(Opcodes.INVOKESPECIAL, superClassInternalName, "<init>", "()V", false) visitVarInsn(Opcodes.ALOAD, 0)
visitInsn(Opcodes.RETURN) visitMethodInsn(Opcodes.INVOKESPECIAL, superClassInternalName, "<init>", "()V", false)
visitMaxs(1, 1) visitInsn(Opcodes.RETURN)
visitMaxs(1, 1)
}
visitEnd() visitEnd()
} }
} }
@@ -99,20 +103,24 @@ class MultifileClassPartCodegen(
CLINIT_SYNC_NAME, "I", null, null) CLINIT_SYNC_NAME, "I", null, null)
newSpecialMethod(packageFragment, CLINIT_TRIGGER_NAME).apply { newSpecialMethod(packageFragment, CLINIT_TRIGGER_NAME).apply {
visitCode() if (generateBodies) {
visitFieldInsn(Opcodes.GETSTATIC, staticInitClassType.internalName, CLINIT_SYNC_NAME, "I") visitCode()
visitInsn(Opcodes.RETURN) visitFieldInsn(Opcodes.GETSTATIC, staticInitClassType.internalName, CLINIT_SYNC_NAME, "I")
visitMaxs(1, 0) visitInsn(Opcodes.RETURN)
visitMaxs(1, 0)
}
visitEnd() visitEnd()
} }
newSpecialMethod(packageFragment, "<clinit>").apply { newSpecialMethod(packageFragment, "<clinit>").apply {
visitCode() if (generateBodies) {
visitMethodInsn(Opcodes.INVOKESTATIC, partType.internalName, DEFERRED_PART_CLINIT_NAME, "()V", false) visitCode()
visitInsn(Opcodes.ICONST_0) visitMethodInsn(Opcodes.INVOKESTATIC, partType.internalName, DEFERRED_PART_CLINIT_NAME, "()V", false)
visitFieldInsn(Opcodes.PUTSTATIC, staticInitClassType.internalName, CLINIT_SYNC_NAME, "I") visitInsn(Opcodes.ICONST_0)
visitInsn(Opcodes.RETURN) visitFieldInsn(Opcodes.PUTSTATIC, staticInitClassType.internalName, CLINIT_SYNC_NAME, "I")
visitMaxs(1, 0) visitInsn(Opcodes.RETURN)
visitMaxs(1, 0)
}
visitEnd() visitEnd()
} }