diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AbstractClassBuilder.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AbstractClassBuilder.java index efc0106db6b..c16dfe7ac0b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AbstractClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AbstractClassBuilder.java @@ -26,13 +26,13 @@ import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin; import org.jetbrains.org.objectweb.asm.*; -import java.util.ArrayList; import java.util.List; import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtilsKt.GENERATE_SMAP; public abstract class AbstractClassBuilder implements ClassBuilder { protected static final MethodVisitor EMPTY_METHOD_VISITOR = new MethodVisitor(Opcodes.API_VERSION) {}; + public static final RecordComponentVisitor EMPTY_RECORD_VISITOR = new RecordComponentVisitor(Opcodes.API_VERSION) {}; protected static final FieldVisitor EMPTY_FIELD_VISITOR = new FieldVisitor(Opcodes.API_VERSION) {}; private String thisName; @@ -91,6 +91,16 @@ public abstract class AbstractClassBuilder implements ClassBuilder { return visitor; } + @NotNull + @Override + public RecordComponentVisitor newRecordComponent(@NotNull String name, @NotNull String desc, @Nullable String signature) { + RecordComponentVisitor visitor = getVisitor().visitRecordComponent(name, desc, signature); + if (visitor == null) { + return EMPTY_RECORD_VISITOR; + } + return visitor; + } + @Override @NotNull public JvmSerializationBindings getSerializationBindings() { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilder.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilder.java index 13f242d32c3..d015313eeb1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilder.java @@ -19,14 +19,10 @@ package org.jetbrains.kotlin.codegen; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.codegen.inline.FileMapping; import org.jetbrains.kotlin.codegen.inline.SourceMapper; import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin; -import org.jetbrains.org.objectweb.asm.AnnotationVisitor; -import org.jetbrains.org.objectweb.asm.ClassVisitor; -import org.jetbrains.org.objectweb.asm.FieldVisitor; -import org.jetbrains.org.objectweb.asm.MethodVisitor; +import org.jetbrains.org.objectweb.asm.*; public interface ClassBuilder { @NotNull @@ -49,6 +45,12 @@ public interface ClassBuilder { @Nullable String[] exceptions ); + @NotNull RecordComponentVisitor newRecordComponent( + @NotNull String name, + @NotNull String desc, + @Nullable String signature + ); + @NotNull JvmSerializationBindings getSerializationBindings(); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DelegatingClassBuilder.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/DelegatingClassBuilder.java index 362422dbd8c..a9b403949f4 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DelegatingClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DelegatingClassBuilder.java @@ -19,14 +19,10 @@ package org.jetbrains.kotlin.codegen; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.codegen.inline.FileMapping; import org.jetbrains.kotlin.codegen.inline.SourceMapper; import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin; -import org.jetbrains.org.objectweb.asm.AnnotationVisitor; -import org.jetbrains.org.objectweb.asm.ClassVisitor; -import org.jetbrains.org.objectweb.asm.FieldVisitor; -import org.jetbrains.org.objectweb.asm.MethodVisitor; +import org.jetbrains.org.objectweb.asm.*; public abstract class DelegatingClassBuilder implements ClassBuilder { @NotNull @@ -58,6 +54,14 @@ public abstract class DelegatingClassBuilder implements ClassBuilder { return getDelegate().newMethod(origin, access, name, desc, signature, exceptions); } + @NotNull + @Override + public RecordComponentVisitor newRecordComponent( + @NotNull String name, @NotNull String desc, @Nullable String signature + ) { + return getDelegate().newRecordComponent(name, desc, signature); + } + @NotNull @Override public JvmSerializationBindings getSerializationBindings() { diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt index 07a524d9197..ddd2a19e38a 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.android.synthetic.codegen import com.intellij.psi.PsiElement import org.jetbrains.kotlin.android.parcel.isParcelize +import org.jetbrains.kotlin.codegen.AbstractClassBuilder import org.jetbrains.kotlin.codegen.ClassBuilder import org.jetbrains.kotlin.codegen.ClassBuilderFactory import org.jetbrains.kotlin.codegen.DelegatingClassBuilder @@ -26,8 +27,11 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin -import org.jetbrains.org.objectweb.asm.* -import org.jetbrains.org.objectweb.asm.Opcodes.* +import org.jetbrains.org.objectweb.asm.MethodVisitor +import org.jetbrains.org.objectweb.asm.Opcodes +import org.jetbrains.org.objectweb.asm.Opcodes.ACC_STATIC +import org.jetbrains.org.objectweb.asm.RecordComponentVisitor +import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptorExtension { @@ -132,6 +136,10 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor return super.newMethod(origin, access, name, desc, signature, exceptions) } + + override fun newRecordComponent(name: String, desc: String, signature: String?): RecordComponentVisitor { + return AbstractClassBuilder.EMPTY_RECORD_VISITOR + } } private class ClinitAwareMethodVisitor(val parcelableName: String, mv: MethodVisitor) : MethodVisitor(Opcodes.API_VERSION, mv) { @@ -150,4 +158,4 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor super.visitInsn(opcode) } } -} \ No newline at end of file +} diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AndroidOnDestroyClassBuilderInterceptorExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AndroidOnDestroyClassBuilderInterceptorExtension.kt index 021d9751eba..e25a3d840b5 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AndroidOnDestroyClassBuilderInterceptorExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AndroidOnDestroyClassBuilderInterceptorExtension.kt @@ -18,26 +18,30 @@ package org.jetbrains.kotlin.android.synthetic.codegen import com.intellij.psi.PsiElement import kotlinx.android.extensions.CacheImplementation +import org.jetbrains.kotlin.android.synthetic.codegen.AbstractAndroidExtensionsExpressionCodegenExtension.Companion.CLEAR_CACHE_METHOD_NAME import org.jetbrains.kotlin.android.synthetic.codegen.AbstractAndroidExtensionsExpressionCodegenExtension.Companion.ON_DESTROY_METHOD_NAME import org.jetbrains.kotlin.android.synthetic.descriptors.ContainerOptionsProxy +import org.jetbrains.kotlin.codegen.AbstractClassBuilder import org.jetbrains.kotlin.codegen.ClassBuilder import org.jetbrains.kotlin.codegen.ClassBuilderFactory import org.jetbrains.kotlin.codegen.DelegatingClassBuilder import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.psi.KtClass +import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin -import org.jetbrains.org.objectweb.asm.* +import org.jetbrains.org.objectweb.asm.MethodVisitor +import org.jetbrains.org.objectweb.asm.Opcodes +import org.jetbrains.org.objectweb.asm.RecordComponentVisitor +import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter -import org.jetbrains.kotlin.android.synthetic.codegen.AbstractAndroidExtensionsExpressionCodegenExtension.Companion.CLEAR_CACHE_METHOD_NAME -import org.jetbrains.kotlin.psi.KtElement abstract class AbstractAndroidOnDestroyClassBuilderInterceptorExtension : ClassBuilderInterceptorExtension { override fun interceptClassBuilderFactory( - interceptedFactory: ClassBuilderFactory, - bindingContext: BindingContext, - diagnostics: DiagnosticSink + interceptedFactory: ClassBuilderFactory, + bindingContext: BindingContext, + diagnostics: DiagnosticSink ): ClassBuilderFactory { return AndroidOnDestroyClassBuilderFactory(interceptedFactory, bindingContext) } @@ -45,8 +49,8 @@ abstract class AbstractAndroidOnDestroyClassBuilderInterceptorExtension : ClassB abstract fun getGlobalCacheImpl(element: KtElement): CacheImplementation private inner class AndroidOnDestroyClassBuilderFactory( - private val delegateFactory: ClassBuilderFactory, - val bindingContext: BindingContext + private val delegateFactory: ClassBuilderFactory, + val bindingContext: BindingContext ) : ClassBuilderFactory { override fun newClassBuilder(origin: JvmDeclarationOrigin): ClassBuilder { @@ -69,8 +73,8 @@ abstract class AbstractAndroidOnDestroyClassBuilderInterceptorExtension : ClassB } private inner class AndroidOnDestroyCollectorClassBuilder( - internal val delegateClassBuilder: ClassBuilder, - val bindingContext: BindingContext + internal val delegateClassBuilder: ClassBuilder, + val bindingContext: BindingContext ) : DelegatingClassBuilder() { private var currentClass: KtClass? = null private var currentClassName: String? = null @@ -78,13 +82,13 @@ abstract class AbstractAndroidOnDestroyClassBuilderInterceptorExtension : ClassB override fun getDelegate() = delegateClassBuilder override fun defineClass( - origin: PsiElement?, - version: Int, - access: Int, - name: String, - signature: String?, - superName: String, - interfaces: Array + origin: PsiElement?, + version: Int, + access: Int, + name: String, + signature: String?, + superName: String, + interfaces: Array ) { if (origin is KtClass) { currentClass = origin @@ -94,12 +98,12 @@ abstract class AbstractAndroidOnDestroyClassBuilderInterceptorExtension : ClassB } override fun newMethod( - origin: JvmDeclarationOrigin, - access: Int, - name: String, - desc: String, - signature: String?, - exceptions: Array? + origin: JvmDeclarationOrigin, + access: Int, + name: String, + desc: String, + signature: String?, + exceptions: Array? ): MethodVisitor { return object : MethodVisitor(Opcodes.API_VERSION, super.newMethod(origin, access, name, desc, signature, exceptions)) { override fun visitInsn(opcode: Int) { @@ -128,6 +132,10 @@ abstract class AbstractAndroidOnDestroyClassBuilderInterceptorExtension : ClassB } } } + + override fun newRecordComponent(name: String, desc: String, signature: String?): RecordComponentVisitor { + return AbstractClassBuilder.EMPTY_RECORD_VISITOR + } } -} \ No newline at end of file +} diff --git a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ParcelizeClinitClassBuilderInterceptorExtension.kt b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ParcelizeClinitClassBuilderInterceptorExtension.kt index da91f94c9c6..9f88df0de00 100644 --- a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ParcelizeClinitClassBuilderInterceptorExtension.kt +++ b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ParcelizeClinitClassBuilderInterceptorExtension.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.parcelize import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.codegen.AbstractClassBuilder import org.jetbrains.kotlin.codegen.ClassBuilder import org.jetbrains.kotlin.codegen.ClassBuilderFactory import org.jetbrains.kotlin.codegen.DelegatingClassBuilder @@ -27,6 +28,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.org.objectweb.asm.MethodVisitor import org.jetbrains.org.objectweb.asm.Opcodes +import org.jetbrains.org.objectweb.asm.RecordComponentVisitor import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter @@ -128,6 +130,10 @@ class ParcelizeClinitClassBuilderInterceptorExtension : ClassBuilderInterceptorE return super.newMethod(origin, access, name, desc, signature, exceptions) } + + override fun newRecordComponent(name: String, desc: String, signature: String?): RecordComponentVisitor { + return AbstractClassBuilder.EMPTY_RECORD_VISITOR + } } private class ClinitAwareMethodVisitor(val parcelableName: String, mv: MethodVisitor) : MethodVisitor(Opcodes.API_VERSION, mv) { @@ -146,4 +152,4 @@ class ParcelizeClinitClassBuilderInterceptorExtension : ClassBuilderInterceptorE super.visitInsn(opcode) } } -} \ No newline at end of file +}