Exclude private members from ABI classes

This commit is contained in:
Alexey Tsvetkov
2018-11-29 19:46:16 +03:00
parent 33faa00184
commit 903f6bc79b
17 changed files with 291 additions and 12 deletions
@@ -40,7 +40,16 @@ public class ClassBuilderMode {
* Full function bodies
*/
public final static ClassBuilderMode FULL = new ClassBuilderMode(
/* bodies = */ true,
/* bodies = */ true,
/* metadata = */ true,
/* sourceRetention = */ false,
/* generateMultiFileFacadePartClasses = */ true);
/**
* ABI for compilation (non-private signatures + inline function bodies)
*/
public final static ClassBuilderMode ABI = new ClassBuilderMode(
/* bodies = */ true,
/* metadata = */ true,
/* sourceRetention = */ false,
/* generateMultiFileFacadePartClasses = */ true);
@@ -245,7 +245,9 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
DescriptorSerializer serializer =
DescriptorSerializer.createForLambda(new JvmSerializerExtension(v.getSerializationBindings(), state));
ProtoBuf.Function functionProto = serializer.functionProto(freeLambdaDescriptor).build();
ProtoBuf.Function.Builder builder = serializer.functionProto(freeLambdaDescriptor);
if (builder == null) return;
ProtoBuf.Function functionProto = builder.build();
WriteAnnotationUtilKt.writeKotlinMetadata(v, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, 0, av -> {
writeAnnotationData(av, serializer, functionProto);
@@ -652,7 +652,8 @@ class CoroutineCodegenForNamedFunction private constructor(
override fun generateKotlinMetadataAnnotation() {
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, 0) { av ->
val serializer = DescriptorSerializer.createForLambda(JvmSerializerExtension(v.serializationBindings, state))
val functionProto = serializer.functionProto(createFreeFakeLambdaDescriptor(suspendFunctionJvmView)).build()
val functionProto =
serializer.functionProto(createFreeFakeLambdaDescriptor(suspendFunctionJvmView))?.build() ?: return@writeKotlinMetadata
AsmUtil.writeAnnotationData(av, serializer, functionProto)
}
}
@@ -47,6 +47,13 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta
override val metadataVersion = state.metadataVersion
override fun shouldUseTypeTable(): Boolean = useTypeTable
override fun shouldSerializeFunction(descriptor: FunctionDescriptor): Boolean {
return classBuilderMode != ClassBuilderMode.ABI || descriptor.visibility != Visibilities.PRIVATE
}
override fun shouldSerializeProperty(descriptor: PropertyDescriptor): Boolean {
return classBuilderMode != ClassBuilderMode.ABI || descriptor.visibility != Visibilities.PRIVATE
}
override fun serializeClass(
descriptor: ClassDescriptor,
@@ -103,7 +110,7 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta
for (localVariable in localVariables) {
val propertyDescriptor = createFreeFakeLocalPropertyDescriptor(localVariable)
val serializer = DescriptorSerializer.createForLambda(this)
proto.addExtension(extension, serializer.propertyProto(propertyDescriptor).build())
proto.addExtension(extension, serializer.propertyProto(propertyDescriptor)?.build() ?: continue)
}
}