JVM SamWrapperClassesAreSynthetic language feature

KT-44278 KT-26060 KT-42621
This commit is contained in:
Dmitry Petrov
2021-02-08 18:11:59 +03:00
parent 052f6929c9
commit 7564c9bb8c
19 changed files with 39 additions and 25 deletions
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.codegen.context.CodegenContext;
import org.jetbrains.kotlin.codegen.context.FieldOwnerContext;
import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper;
import org.jetbrains.kotlin.config.LanguageFeature;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl;
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil;
@@ -79,7 +80,8 @@ public class SamWrapperCodegen {
this.samType = samType;
this.parentCodegen = parentCodegen;
visibility = isInsideInline ? ACC_PUBLIC : NO_FLAG_PACKAGE_PRIVATE;
classFlags = visibility | ACC_FINAL | ACC_SUPER;
int synth = state.getLanguageVersionSettings().supportsFeature(LanguageFeature.SamWrapperClassesAreSynthetic) ? ACC_SYNTHETIC : 0;
classFlags = visibility | ACC_FINAL | ACC_SUPER | synth;
}
@NotNull
@@ -211,10 +211,10 @@ class GenerationState private constructor(
val fromConfig = configuration.get(JVMConfigurationKeys.SAM_CONVERSIONS)
if (fromConfig != null && target >= fromConfig.minJvmTarget)
fromConfig
else if (target < JvmTarget.JVM_1_8)
JvmClosureGenerationScheme.CLASS
else
else if (target >= JvmTarget.JVM_1_8 && languageVersionSettings.supportsFeature(LanguageFeature.SamWrapperClassesAreSynthetic))
JvmClosureGenerationScheme.INDY
else
JvmClosureGenerationScheme.CLASS
}
val lambdasScheme = run {
@@ -81,7 +81,7 @@ class ClassCodegen private constructor(
defineClass(
irClass.psiElement,
state.classFileVersion,
irClass.flags,
irClass.getFlags(context.state.languageVersionSettings),
signature.name,
signature.javaGenericSignature,
signature.superclassName,
@@ -473,10 +473,11 @@ class ClassCodegen private constructor(
}
}
private val IrClass.flags: Int
get() = origin.flags or getVisibilityAccessFlagForClass() or
private fun IrClass.getFlags(languageVersionSettings: LanguageVersionSettings): Int =
origin.flags or
getVisibilityAccessFlagForClass() or
(if (isAnnotatedWithDeprecated) Opcodes.ACC_DEPRECATED else 0) or
(if (hasAnnotation(JVM_SYNTHETIC_ANNOTATION_FQ_NAME)) Opcodes.ACC_SYNTHETIC else 0) or
getSynthAccessFlag(languageVersionSettings) or
when {
isAnnotationClass -> Opcodes.ACC_ANNOTATION or Opcodes.ACC_INTERFACE or Opcodes.ACC_ABSTRACT
isInterface -> Opcodes.ACC_INTERFACE or Opcodes.ACC_ABSTRACT
@@ -485,6 +486,16 @@ private val IrClass.flags: Int
else -> Opcodes.ACC_SUPER or modality.flags
}
private fun IrClass.getSynthAccessFlag(languageVersionSettings: LanguageVersionSettings): Int {
if (hasAnnotation(JVM_SYNTHETIC_ANNOTATION_FQ_NAME))
return Opcodes.ACC_SYNTHETIC
if (origin == IrDeclarationOrigin.GENERATED_SAM_IMPLEMENTATION &&
languageVersionSettings.supportsFeature(LanguageFeature.SamWrapperClassesAreSynthetic)
)
return Opcodes.ACC_SYNTHETIC
return 0
}
private fun IrField.computeFieldFlags(context: JvmBackendContext, languageVersionSettings: LanguageVersionSettings): Int =
origin.flags or visibility.flags or
(if (isDeprecatedCallable(context) ||
@@ -16,7 +16,7 @@ synthetic final class<Lkotlin/jvm/internal/FunctionReferenceImpl;Lkotlin/jvm/fun
}
@kotlin.Metadata
final class<null> TKt$sam$Sam$0 {
synthetic final class<null> TKt$sam$Sam$0 {
// source: 't.kt'
<null> method <init>(p0: kotlin.jvm.functions.Function0): void
public <null> method equals(p0: java.lang.Object): boolean
@@ -10,7 +10,7 @@ synthetic final class<Lkotlin/jvm/internal/FunctionReferenceImpl;Lkotlin/jvm/fun
}
@kotlin.Metadata
final class<null> TKt$sam$Sam$0 {
synthetic final class<null> TKt$sam$Sam$0 {
// source: 't.kt'
<null> method <init>(p0: kotlin.jvm.functions.Function0): void
public synthetic final <null> method get(): java.lang.Object
@@ -5,7 +5,7 @@ public interface<<T:Ljava/lang/Object;>Ljava/lang/Object;> Sam {
}
@kotlin.Metadata
final class<null> TKt$sam$Sam$0 {
synthetic final class<null> TKt$sam$Sam$0 {
// source: 't.kt'
<null> method <init>(p0: kotlin.jvm.functions.Function0): void
public <null> method equals(p0: java.lang.Object): boolean
@@ -1,5 +1,5 @@
@kotlin.Metadata
final class<null> TKt$sam$Sam$0 {
synthetic final class<null> TKt$sam$Sam$0 {
// source: 't.kt'
<null> method <init>(p0: kotlin.jvm.functions.Function0): void
public synthetic final <null> method get(): java.lang.Object
@@ -5,7 +5,7 @@ public interface<<T:Ljava/lang/Object;>Ljava/lang/Object;> Sam {
}
@kotlin.Metadata
final class<null> TKt$sam$Sam$0 {
synthetic final class<null> TKt$sam$Sam$0 {
// source: 't.kt'
<null> method <init>(p0: kotlin.jvm.functions.Function0): void
public <null> method equals(p0: java.lang.Object): boolean
@@ -5,7 +5,7 @@ public interface<<T:Ljava/lang/Object;>Ljava/lang/Object;> Sam {
}
@kotlin.Metadata
final class<null> TKt$sam$Sam$0 {
synthetic final class<null> TKt$sam$Sam$0 {
// source: 't.kt'
public final @org.jetbrains.annotations.NotNull <()Lkotlin/Function<*>;> method getFunctionDelegate(): kotlin.Function
<null> method <init>(p0: kotlin.jvm.functions.Function0): void
@@ -1,5 +1,5 @@
@kotlin.Metadata
final class<null> TKt$sam$Sam$0 {
synthetic final class<null> TKt$sam$Sam$0 {
// source: 't.kt'
<null> method <init>(p0: kotlin.jvm.functions.Function0): void
public synthetic final <null> method get(): java.lang.Object
@@ -1,5 +1,5 @@
@kotlin.Metadata
final class A$sam$java_lang_Runnable$0 {
synthetic final class A$sam$java_lang_Runnable$0 {
// source: 'reusedSamWrapperClasses.kt'
enclosing class A
private synthetic final field function: kotlin.jvm.functions.Function0
@@ -1,5 +1,5 @@
@kotlin.Metadata
public final class<null> test/SamAdapterAndInlinedOneKt$sam$i$java_lang_Runnable$0 {
public synthetic final class<null> test/SamAdapterAndInlinedOneKt$sam$i$java_lang_Runnable$0 {
// source: 'samAdapterAndInlinedOne.kt'
public <null> method <init>(p0: kotlin.jvm.functions.Function0): void
public synthetic final <null> method run(): void
@@ -9,7 +9,7 @@ public final class<null> test/SamAdapterAndInlinedOneKt$sam$i$java_lang_Runnabl
}
@kotlin.Metadata
final class<null> test/SamAdapterAndInlinedOneKt$sam$java_lang_Runnable$0 {
synthetic final class<null> test/SamAdapterAndInlinedOneKt$sam$java_lang_Runnable$0 {
// source: 'samAdapterAndInlinedOne.kt'
<null> method <init>(p0: kotlin.jvm.functions.Function0): void
public synthetic final <null> method run(): void
@@ -1,5 +1,5 @@
@kotlin.Metadata
public final class<null> test/SamAdapterAndInlinedOneKt$sam$i$java_lang_Runnable$0 {
public synthetic final class<null> test/SamAdapterAndInlinedOneKt$sam$i$java_lang_Runnable$0 {
// source: 'samAdapterAndInlinedOne.kt'
public <null> method <init>(p0: kotlin.jvm.functions.Function0): void
public synthetic final <null> method run(): void
@@ -9,7 +9,7 @@ public final class<null> test/SamAdapterAndInlinedOneKt$sam$i$java_lang_Runnabl
}
@kotlin.Metadata
final class<null> test/SamAdapterAndInlinedOneKt$sam$java_lang_Runnable$0 {
synthetic final class<null> test/SamAdapterAndInlinedOneKt$sam$java_lang_Runnable$0 {
// source: 'samAdapterAndInlinedOne.kt'
<null> method <init>(p0: kotlin.jvm.functions.Function0): void
public synthetic final <null> method run(): void
@@ -5,7 +5,7 @@ public interface<<T:Ljava/lang/Object;>Ljava/lang/Object;> Sam {
}
@kotlin.Metadata
final class<null> TKt$sam$Sam$0 {
synthetic final class<null> TKt$sam$Sam$0 {
// source: 't.kt'
<null> method <init>(p0: kotlin.jvm.functions.Function0): void
public <null> method equals(p0: java.lang.Object): boolean
@@ -5,7 +5,7 @@ public interface<<T:Ljava/lang/Object;>Ljava/lang/Object;> Sam {
}
@kotlin.Metadata
final class<null> TKt$sam$Sam$0 {
synthetic final class<null> TKt$sam$Sam$0 {
// source: 't.kt'
public final @org.jetbrains.annotations.NotNull <()Lkotlin/Function<*>;> method getFunctionDelegate(): kotlin.Function
<null> method <init>(p0: kotlin.jvm.functions.Function0): void
@@ -1,5 +1,5 @@
@kotlin.Metadata
final class<null> TKt$sam$Sam$0 {
synthetic final class<null> TKt$sam$Sam$0 {
// source: 't.kt'
<null> method <init>(p0: kotlin.jvm.functions.Function0): void
public synthetic final <null> method get(): java.lang.Object
@@ -59,7 +59,7 @@ public final class B$runnable2$1 {
}
@kotlin.Metadata
public final class B$sam$i$java_lang_Runnable$0 {
public synthetic final class B$sam$i$java_lang_Runnable$0 {
// source: 'wrapperInlinedFromAnotherClass.kt'
enclosing class B
private synthetic final field function: kotlin.jvm.functions.Function0
@@ -59,7 +59,7 @@ public final class B$runnable2$1 {
}
@kotlin.Metadata
public final class B$sam$i$java_lang_Runnable$0 {
public synthetic final class B$sam$i$java_lang_Runnable$0 {
// source: 'wrapperInlinedFromAnotherClass.kt'
enclosing class B
private synthetic final field function: kotlin.jvm.functions.Function0
@@ -199,6 +199,7 @@ enum class LanguageFeature(
InlineClasses(sinceVersion = KOTLIN_1_3, defaultState = State.ENABLED_WITH_WARNING, kind = UNSTABLE_FEATURE),
JvmInlineValueClasses(sinceVersion = KOTLIN_1_5, defaultState = State.ENABLED, kind = OTHER),
SuspendFunctionsInFunInterfaces(sinceVersion = KOTLIN_1_5, defaultState = State.ENABLED, kind = OTHER),
SamWrapperClassesAreSynthetic(sinceVersion = KOTLIN_1_5, defaultState = State.ENABLED, kind = BUG_FIX)
;
val presentableName: String