diff --git a/analysis/analysis-api/testData/components/scopeProvider/memberScope/withTestCompilerPluginEnabled/customSerlializable.txt b/analysis/analysis-api/testData/components/scopeProvider/memberScope/withTestCompilerPluginEnabled/customSerlializable.txt index 708d0e867f7..c08d7b98597 100644 --- a/analysis/analysis-api/testData/components/scopeProvider/memberScope/withTestCompilerPluginEnabled/customSerlializable.txt +++ b/analysis/analysis-api/testData/components/scopeProvider/memberScope/withTestCompilerPluginEnabled/customSerlializable.txt @@ -46,7 +46,7 @@ KtFunctionSymbol: type: test/FirstTarget symbolKind: LOCAL typeParameters: [] - getContainingFileSymbol: null + getContainingFileSymbol: KtFileSymbol(customSerlializable.kt) getContainingJvmClassName: test.Serializer getContainingModule: KtSourceModule "Sources of main" deprecationStatus: null @@ -56,7 +56,7 @@ KtFunctionSymbol: annotationsList: [] ownTypeArguments: [] type: test/Serializer - getContainingFileSymbol: null + getContainingFileSymbol: KtFileSymbol(customSerlializable.kt) getContainingJvmClassName: test.Serializer getContainingModule: KtSourceModule "Sources of main" deprecationStatus: null @@ -109,7 +109,7 @@ KtFunctionSymbol: type: test/SecondTarget symbolKind: LOCAL typeParameters: [] - getContainingFileSymbol: null + getContainingFileSymbol: KtFileSymbol(customSerlializable.kt) getContainingJvmClassName: test.Serializer getContainingModule: KtSourceModule "Sources of main" deprecationStatus: null @@ -119,7 +119,7 @@ KtFunctionSymbol: annotationsList: [] ownTypeArguments: [] type: test/Serializer - getContainingFileSymbol: null + getContainingFileSymbol: KtFileSymbol(customSerlializable.kt) getContainingJvmClassName: test.Serializer getContainingModule: KtSourceModule "Sources of main" deprecationStatus: null diff --git a/analysis/analysis-api/testData/components/scopeProvider/memberScope/withTestCompilerPluginEnabled/generatedCompanionWithFoo.txt b/analysis/analysis-api/testData/components/scopeProvider/memberScope/withTestCompilerPluginEnabled/generatedCompanionWithFoo.txt index 6272186639f..1cc10090d86 100644 --- a/analysis/analysis-api/testData/components/scopeProvider/memberScope/withTestCompilerPluginEnabled/generatedCompanionWithFoo.txt +++ b/analysis/analysis-api/testData/components/scopeProvider/memberScope/withTestCompilerPluginEnabled/generatedCompanionWithFoo.txt @@ -31,7 +31,7 @@ KtFunctionSymbol: annotationsList: [] ownTypeArguments: [] type: test/WithGeneratedCompanion.Companion - getContainingFileSymbol: null + getContainingFileSymbol: KtFileSymbol(generatedCompanionWithFoo.kt) getContainingJvmClassName: test.WithGeneratedCompanion.Companion getContainingModule: KtSourceModule "Sources of main" deprecationStatus: null diff --git a/analysis/analysis-api/testData/components/scopeProvider/memberScope/withTestCompilerPluginEnabled/nestedClassAndMaterializeMember.txt b/analysis/analysis-api/testData/components/scopeProvider/memberScope/withTestCompilerPluginEnabled/nestedClassAndMaterializeMember.txt index 25d87005e48..73d8c3b10a1 100644 --- a/analysis/analysis-api/testData/components/scopeProvider/memberScope/withTestCompilerPluginEnabled/nestedClassAndMaterializeMember.txt +++ b/analysis/analysis-api/testData/components/scopeProvider/memberScope/withTestCompilerPluginEnabled/nestedClassAndMaterializeMember.txt @@ -31,7 +31,7 @@ KtFunctionSymbol: annotationsList: [] ownTypeArguments: [] type: test/MyClass - getContainingFileSymbol: null + getContainingFileSymbol: KtFileSymbol(nestedClassAndMaterializeMember.kt) getContainingJvmClassName: test.MyClass getContainingModule: KtSourceModule "Sources of main" deprecationStatus: null @@ -200,7 +200,7 @@ KtNamedClassOrObjectSymbol: symbolKind: CLASS_MEMBER typeParameters: [] visibility: Public - getContainingFileSymbol: null + getContainingFileSymbol: KtFileSymbol(nestedClassAndMaterializeMember.kt) getContainingModule: KtSourceModule "Sources of main" annotationApplicableTargets: null deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/withTestCompilerPluginEnabled/generatedCompanionWorksAsValue.txt b/analysis/analysis-api/testData/symbols/symbolByReference/withTestCompilerPluginEnabled/generatedCompanionWorksAsValue.txt index 0247ec46434..9a05c65b628 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/withTestCompilerPluginEnabled/generatedCompanionWorksAsValue.txt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/withTestCompilerPluginEnabled/generatedCompanionWorksAsValue.txt @@ -23,7 +23,7 @@ KtNamedClassOrObjectSymbol: symbolKind: CLASS_MEMBER typeParameters: [] visibility: Public - getContainingFileSymbol: null + getContainingFileSymbol: KtFileSymbol(generatedCompanionWorksAsValue.kt) getContainingModule: KtSourceModule "Sources of main" annotationApplicableTargets: null deprecationStatus: null diff --git a/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/ClassBuildingContext.kt b/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/ClassBuildingContext.kt index 085b56f35b1..2bfa95cb63c 100644 --- a/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/ClassBuildingContext.kt +++ b/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/ClassBuildingContext.kt @@ -6,8 +6,10 @@ package org.jetbrains.kotlin.fir.plugin import org.jetbrains.kotlin.GeneratedDeclarationKey +import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.fakeElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.containingClassForLocalAttr import org.jetbrains.kotlin.fir.declarations.FirRegularClass @@ -68,6 +70,7 @@ public class ClassBuildingContext( classKind = this@ClassBuildingContext.classKind scopeProvider = session.kotlinScopeProvider status = generateStatus() + source = owner?.source?.fakeElement(KtFakeSourceElementKind.PluginGenerated) name = classId.shortClassName symbol = FirRegularClassSymbol(classId) diff --git a/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/PropertyBuildingContext.kt b/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/PropertyBuildingContext.kt index 82e43dc015a..f9d07f73f7a 100644 --- a/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/PropertyBuildingContext.kt +++ b/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/PropertyBuildingContext.kt @@ -6,8 +6,10 @@ package org.jetbrains.kotlin.fir.plugin import org.jetbrains.kotlin.GeneratedDeclarationKey +import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.fakeElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.buildProperty @@ -69,6 +71,8 @@ public class PropertyBuildingContext( moduleData = session.moduleData origin = key.origin + source = owner?.source?.fakeElement(KtFakeSourceElementKind.PluginGenerated) + symbol = FirPropertySymbol(callableId) name = callableId.callableName diff --git a/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/SimpleFunctionBuildingContext.kt b/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/SimpleFunctionBuildingContext.kt index fbe8fd3927f..b8dbd28aa09 100644 --- a/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/SimpleFunctionBuildingContext.kt +++ b/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/SimpleFunctionBuildingContext.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.fir.plugin import org.jetbrains.kotlin.GeneratedDeclarationKey +import org.jetbrains.kotlin.KtFakeSourceElementKind +import org.jetbrains.kotlin.fakeElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction @@ -57,6 +59,8 @@ public class SimpleFunctionBuildingContext( moduleData = session.moduleData origin = key.origin + source = owner?.source?.fakeElement(KtFakeSourceElementKind.PluginGenerated) + symbol = FirNamedFunctionSymbol(callableId) name = callableId.callableName diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt index 31d6389d31c..a1506226c02 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt @@ -309,6 +309,9 @@ sealed class KtFakeSourceElementKind(final override val shouldSkipErrorTypeRepor // For it.functionFromAny() calls on a stub type object CastToAnyForStubTypes : KtFakeSourceElementKind() + + // For plugin-generated things + object PluginGenerated : KtFakeSourceElementKind() } sealed class AbstractKtSourceElement { diff --git a/plugins/kotlinx-serialization/testData/codegen/Basic.asm.fir.txt b/plugins/kotlinx-serialization/testData/codegen/Basic.asm.fir.txt index cf3e680eb2b..acd7fc18771 100644 --- a/plugins/kotlinx-serialization/testData/codegen/Basic.asm.fir.txt +++ b/plugins/kotlinx-serialization/testData/codegen/Basic.asm.fir.txt @@ -8,6 +8,8 @@ public final class ListOfUsers$$serializer : java/lang/Object, kotlinx/serializa DUP INVOKESPECIAL (ListOfUsers$$serializer, , ()V) PUTSTATIC (ListOfUsers$$serializer, INSTANCE, LListOfUsers$$serializer;) + LABEL (L0) + LINENUMBER (12) NEW (kotlinx/serialization/internal/PluginGeneratedSerialDescriptor) DUP LDC (ListOfUsers) @@ -23,6 +25,8 @@ public final class ListOfUsers$$serializer : java/lang/Object, kotlinx/serializa ALOAD (0) CHECKCAST (kotlinx/serialization/descriptors/SerialDescriptor) PUTSTATIC (ListOfUsers$$serializer, descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) + LABEL (L1) + LINENUMBER (13) RETURN } @@ -36,6 +40,7 @@ public final class ListOfUsers$$serializer : java/lang/Object, kotlinx/serializa public final kotlinx.serialization.KSerializer[] childSerializers() { LABEL (L0) + LINENUMBER (12) INVOKESTATIC (ListOfUsers, access$get$childSerializers$cp, ()[Lkotlinx/serialization/KSerializer;) ASTORE (1) ICONST_1 @@ -57,6 +62,8 @@ public final class ListOfUsers$$serializer : java/lang/Object, kotlinx/serializa ALOAD (1) LDC (decoder) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (12) GETSTATIC (ListOfUsers$$serializer, descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) ASTORE (2) ICONST_1 @@ -73,7 +80,40 @@ public final class ListOfUsers$$serializer : java/lang/Object, kotlinx/serializa ASTORE (8) ALOAD (7) INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSequentially, ()Z) - IFEQ (L1) + IFEQ (L2) + ALOAD (7) + ALOAD (2) + ICONST_0 + ALOAD (8) + ICONST_0 + AALOAD + CHECKCAST (kotlinx/serialization/DeserializationStrategy) + ALOAD (6) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;) + CHECKCAST (java/util/List) + ASTORE (6) + ILOAD (5) + ICONST_1 + IOR + ISTORE (5) + GOTO (L3) + LABEL (L2) + ILOAD (3) + IFEQ (L3) + ALOAD (7) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) + ISTORE (4) + ILOAD (4) + TABLESWITCH + -1: L4 + 0: L5 + default: L6 + LABEL (L4) + ICONST_0 + ISTORE (3) + GOTO (L2) + LABEL (L5) ALOAD (7) ALOAD (2) ICONST_0 @@ -90,46 +130,13 @@ public final class ListOfUsers$$serializer : java/lang/Object, kotlinx/serializa IOR ISTORE (5) GOTO (L2) - LABEL (L1) - ILOAD (3) - IFEQ (L2) - ALOAD (7) - ALOAD (2) - INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) - ISTORE (4) - ILOAD (4) - TABLESWITCH - -1: L3 - 0: L4 - default: L5 - LABEL (L3) - ICONST_0 - ISTORE (3) - GOTO (L1) - LABEL (L4) - ALOAD (7) - ALOAD (2) - ICONST_0 - ALOAD (8) - ICONST_0 - AALOAD - CHECKCAST (kotlinx/serialization/DeserializationStrategy) - ALOAD (6) - INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;) - CHECKCAST (java/util/List) - ASTORE (6) - ILOAD (5) - ICONST_1 - IOR - ISTORE (5) - GOTO (L1) - LABEL (L5) + LABEL (L6) NEW (kotlinx/serialization/UnknownFieldException) DUP ILOAD (4) INVOKESPECIAL (kotlinx/serialization/UnknownFieldException, , (I)V) ATHROW - LABEL (L2) + LABEL (L3) ALOAD (7) ALOAD (2) INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V) @@ -140,11 +147,12 @@ public final class ListOfUsers$$serializer : java/lang/Object, kotlinx/serializa ACONST_NULL INVOKESPECIAL (ListOfUsers, , (ILjava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V) ARETURN - LABEL (L6) + LABEL (L7) } public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder decoder) { LABEL (L0) + LINENUMBER (12) ALOAD (0) ALOAD (1) INVOKEVIRTUAL (ListOfUsers$$serializer, deserialize, (Lkotlinx/serialization/encoding/Decoder;)LListOfUsers;) @@ -167,6 +175,8 @@ public final class ListOfUsers$$serializer : java/lang/Object, kotlinx/serializa ALOAD (2) LDC (value) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (12) GETSTATIC (ListOfUsers$$serializer, descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) ASTORE (3) ALOAD (1) @@ -180,12 +190,15 @@ public final class ListOfUsers$$serializer : java/lang/Object, kotlinx/serializa ALOAD (4) ALOAD (3) INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V) + LABEL (L2) + LINENUMBER (13) RETURN - LABEL (L1) + LABEL (L3) } public void serialize(kotlinx.serialization.encoding.Encoder encoder, java.lang.Object value) { LABEL (L0) + LINENUMBER (12) ALOAD (0) ALOAD (1) ALOAD (2) @@ -231,6 +244,8 @@ public final class ListOfUsers : java/lang/Object { ACONST_NULL INVOKESPECIAL (ListOfUsers$Companion, , (Lkotlin/jvm/internal/DefaultConstructorMarker;)V) PUTSTATIC (ListOfUsers, Companion, LListOfUsers$Companion;) + LABEL (L0) + LINENUMBER (12) ICONST_1 ANEWARRAY (kotlinx/serialization/KSerializer) ASTORE (0) @@ -320,6 +335,8 @@ public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serializ DUP INVOKESPECIAL (OptionalUser$$serializer, , ()V) PUTSTATIC (OptionalUser$$serializer, INSTANCE, LOptionalUser$$serializer;) + LABEL (L0) + LINENUMBER (9) NEW (kotlinx/serialization/internal/PluginGeneratedSerialDescriptor) DUP LDC (OptionalUser) @@ -335,6 +352,8 @@ public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serializ ALOAD (0) CHECKCAST (kotlinx/serialization/descriptors/SerialDescriptor) PUTSTATIC (OptionalUser$$serializer, descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) + LABEL (L1) + LINENUMBER (10) RETURN } @@ -348,6 +367,7 @@ public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serializ public final kotlinx.serialization.KSerializer[] childSerializers() { LABEL (L0) + LINENUMBER (9) ICONST_1 ANEWARRAY (kotlinx/serialization/KSerializer) ASTORE (1) @@ -365,6 +385,8 @@ public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serializ ALOAD (1) LDC (decoder) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (9) GETSTATIC (OptionalUser$$serializer, descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) ASTORE (2) ICONST_1 @@ -379,7 +401,38 @@ public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serializ ASTORE (7) ALOAD (7) INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSequentially, ()Z) - IFEQ (L1) + IFEQ (L2) + ALOAD (7) + ALOAD (2) + ICONST_0 + GETSTATIC (User$$serializer, INSTANCE, LUser$$serializer;) + CHECKCAST (kotlinx/serialization/DeserializationStrategy) + ALOAD (6) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;) + CHECKCAST (User) + ASTORE (6) + ILOAD (5) + ICONST_1 + IOR + ISTORE (5) + GOTO (L3) + LABEL (L2) + ILOAD (3) + IFEQ (L3) + ALOAD (7) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) + ISTORE (4) + ILOAD (4) + TABLESWITCH + -1: L4 + 0: L5 + default: L6 + LABEL (L4) + ICONST_0 + ISTORE (3) + GOTO (L2) + LABEL (L5) ALOAD (7) ALOAD (2) ICONST_0 @@ -394,44 +447,13 @@ public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serializ IOR ISTORE (5) GOTO (L2) - LABEL (L1) - ILOAD (3) - IFEQ (L2) - ALOAD (7) - ALOAD (2) - INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) - ISTORE (4) - ILOAD (4) - TABLESWITCH - -1: L3 - 0: L4 - default: L5 - LABEL (L3) - ICONST_0 - ISTORE (3) - GOTO (L1) - LABEL (L4) - ALOAD (7) - ALOAD (2) - ICONST_0 - GETSTATIC (User$$serializer, INSTANCE, LUser$$serializer;) - CHECKCAST (kotlinx/serialization/DeserializationStrategy) - ALOAD (6) - INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;) - CHECKCAST (User) - ASTORE (6) - ILOAD (5) - ICONST_1 - IOR - ISTORE (5) - GOTO (L1) - LABEL (L5) + LABEL (L6) NEW (kotlinx/serialization/UnknownFieldException) DUP ILOAD (4) INVOKESPECIAL (kotlinx/serialization/UnknownFieldException, , (I)V) ATHROW - LABEL (L2) + LABEL (L3) ALOAD (7) ALOAD (2) INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V) @@ -442,11 +464,12 @@ public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serializ ACONST_NULL INVOKESPECIAL (OptionalUser, , (ILUser;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V) ARETURN - LABEL (L6) + LABEL (L7) } public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder decoder) { LABEL (L0) + LINENUMBER (9) ALOAD (0) ALOAD (1) INVOKEVIRTUAL (OptionalUser$$serializer, deserialize, (Lkotlinx/serialization/encoding/Decoder;)LOptionalUser;) @@ -469,6 +492,8 @@ public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serializ ALOAD (2) LDC (value) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (9) GETSTATIC (OptionalUser$$serializer, descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) ASTORE (3) ALOAD (1) @@ -482,12 +507,15 @@ public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serializ ALOAD (4) ALOAD (3) INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V) + LABEL (L2) + LINENUMBER (10) RETURN - LABEL (L1) + LABEL (L3) } public void serialize(kotlinx.serialization.encoding.Encoder encoder, java.lang.Object value) { LABEL (L0) + LINENUMBER (9) ALOAD (0) ALOAD (1) ALOAD (2) @@ -677,6 +705,8 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in DUP INVOKESPECIAL (User$$serializer, , ()V) PUTSTATIC (User$$serializer, INSTANCE, LUser$$serializer;) + LABEL (L0) + LINENUMBER (6) NEW (kotlinx/serialization/internal/PluginGeneratedSerialDescriptor) DUP LDC (User) @@ -696,6 +726,8 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in ALOAD (0) CHECKCAST (kotlinx/serialization/descriptors/SerialDescriptor) PUTSTATIC (User$$serializer, descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) + LABEL (L1) + LINENUMBER (7) RETURN } @@ -709,6 +741,7 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in public final kotlinx.serialization.KSerializer[] childSerializers() { LABEL (L0) + LINENUMBER (6) ICONST_2 ANEWARRAY (kotlinx/serialization/KSerializer) ASTORE (1) @@ -730,6 +763,8 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in ALOAD (1) LDC (decoder) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (6) GETSTATIC (User$$serializer, descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) ASTORE (2) ICONST_1 @@ -746,7 +781,7 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in ASTORE (8) ALOAD (8) INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSequentially, ()Z) - IFEQ (L1) + IFEQ (L2) ALOAD (8) ALOAD (2) ICONST_0 @@ -756,6 +791,45 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in ICONST_1 IOR ISTORE (5) + ALOAD (8) + ALOAD (2) + ICONST_1 + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String;) + ASTORE (7) + ILOAD (5) + ICONST_2 + IOR + ISTORE (5) + GOTO (L3) + LABEL (L2) + ILOAD (3) + IFEQ (L3) + ALOAD (8) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) + ISTORE (4) + ILOAD (4) + TABLESWITCH + -1: L4 + 0: L5 + 1: L6 + default: L7 + LABEL (L4) + ICONST_0 + ISTORE (3) + GOTO (L2) + LABEL (L5) + ALOAD (8) + ALOAD (2) + ICONST_0 + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String;) + ASTORE (6) + ILOAD (5) + ICONST_1 + IOR + ISTORE (5) + GOTO (L2) + LABEL (L6) ALOAD (8) ALOAD (2) ICONST_1 @@ -766,52 +840,13 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in IOR ISTORE (5) GOTO (L2) - LABEL (L1) - ILOAD (3) - IFEQ (L2) - ALOAD (8) - ALOAD (2) - INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) - ISTORE (4) - ILOAD (4) - TABLESWITCH - -1: L3 - 0: L4 - 1: L5 - default: L6 - LABEL (L3) - ICONST_0 - ISTORE (3) - GOTO (L1) - LABEL (L4) - ALOAD (8) - ALOAD (2) - ICONST_0 - INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String;) - ASTORE (6) - ILOAD (5) - ICONST_1 - IOR - ISTORE (5) - GOTO (L1) - LABEL (L5) - ALOAD (8) - ALOAD (2) - ICONST_1 - INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String;) - ASTORE (7) - ILOAD (5) - ICONST_2 - IOR - ISTORE (5) - GOTO (L1) - LABEL (L6) + LABEL (L7) NEW (kotlinx/serialization/UnknownFieldException) DUP ILOAD (4) INVOKESPECIAL (kotlinx/serialization/UnknownFieldException, , (I)V) ATHROW - LABEL (L2) + LABEL (L3) ALOAD (8) ALOAD (2) INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V) @@ -823,11 +858,12 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in ACONST_NULL INVOKESPECIAL (User, , (ILjava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V) ARETURN - LABEL (L7) + LABEL (L8) } public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder decoder) { LABEL (L0) + LINENUMBER (6) ALOAD (0) ALOAD (1) INVOKEVIRTUAL (User$$serializer, deserialize, (Lkotlinx/serialization/encoding/Decoder;)LUser;) @@ -850,6 +886,8 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in ALOAD (2) LDC (value) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (6) GETSTATIC (User$$serializer, descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) ASTORE (3) ALOAD (1) @@ -863,12 +901,15 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in ALOAD (4) ALOAD (3) INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V) + LABEL (L2) + LINENUMBER (7) RETURN - LABEL (L1) + LABEL (L3) } public void serialize(kotlinx.serialization.encoding.Encoder encoder, java.lang.Object value) { LABEL (L0) + LINENUMBER (6) ALOAD (0) ALOAD (1) ALOAD (2) diff --git a/plugins/kotlinx-serialization/testData/codegen/Sealed.asm.fir.txt b/plugins/kotlinx-serialization/testData/codegen/Sealed.asm.fir.txt index f131b8cd159..1d6f5cd96ed 100644 --- a/plugins/kotlinx-serialization/testData/codegen/Sealed.asm.fir.txt +++ b/plugins/kotlinx-serialization/testData/codegen/Sealed.asm.fir.txt @@ -8,6 +8,8 @@ public final class Container$$serializer : java/lang/Object, kotlinx/serializati DUP INVOKESPECIAL (Container$$serializer, , ()V) PUTSTATIC (Container$$serializer, INSTANCE, LContainer$$serializer;) + LABEL (L0) + LINENUMBER (18) NEW (kotlinx/serialization/internal/PluginGeneratedSerialDescriptor) DUP LDC (Container) @@ -23,6 +25,8 @@ public final class Container$$serializer : java/lang/Object, kotlinx/serializati ALOAD (0) CHECKCAST (kotlinx/serialization/descriptors/SerialDescriptor) PUTSTATIC (Container$$serializer, descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) + LABEL (L1) + LINENUMBER (19) RETURN } @@ -36,6 +40,7 @@ public final class Container$$serializer : java/lang/Object, kotlinx/serializati public final kotlinx.serialization.KSerializer[] childSerializers() { LABEL (L0) + LINENUMBER (18) INVOKESTATIC (Container, access$get$childSerializers$cp, ()[Lkotlinx/serialization/KSerializer;) ASTORE (1) ICONST_1 @@ -57,6 +62,8 @@ public final class Container$$serializer : java/lang/Object, kotlinx/serializati ALOAD (1) LDC (decoder) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (18) GETSTATIC (Container$$serializer, descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) ASTORE (2) ICONST_1 @@ -73,7 +80,40 @@ public final class Container$$serializer : java/lang/Object, kotlinx/serializati ASTORE (8) ALOAD (7) INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSequentially, ()Z) - IFEQ (L1) + IFEQ (L2) + ALOAD (7) + ALOAD (2) + ICONST_0 + ALOAD (8) + ICONST_0 + AALOAD + CHECKCAST (kotlinx/serialization/DeserializationStrategy) + ALOAD (6) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;) + CHECKCAST (Result) + ASTORE (6) + ILOAD (5) + ICONST_1 + IOR + ISTORE (5) + GOTO (L3) + LABEL (L2) + ILOAD (3) + IFEQ (L3) + ALOAD (7) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) + ISTORE (4) + ILOAD (4) + TABLESWITCH + -1: L4 + 0: L5 + default: L6 + LABEL (L4) + ICONST_0 + ISTORE (3) + GOTO (L2) + LABEL (L5) ALOAD (7) ALOAD (2) ICONST_0 @@ -90,46 +130,13 @@ public final class Container$$serializer : java/lang/Object, kotlinx/serializati IOR ISTORE (5) GOTO (L2) - LABEL (L1) - ILOAD (3) - IFEQ (L2) - ALOAD (7) - ALOAD (2) - INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) - ISTORE (4) - ILOAD (4) - TABLESWITCH - -1: L3 - 0: L4 - default: L5 - LABEL (L3) - ICONST_0 - ISTORE (3) - GOTO (L1) - LABEL (L4) - ALOAD (7) - ALOAD (2) - ICONST_0 - ALOAD (8) - ICONST_0 - AALOAD - CHECKCAST (kotlinx/serialization/DeserializationStrategy) - ALOAD (6) - INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;) - CHECKCAST (Result) - ASTORE (6) - ILOAD (5) - ICONST_1 - IOR - ISTORE (5) - GOTO (L1) - LABEL (L5) + LABEL (L6) NEW (kotlinx/serialization/UnknownFieldException) DUP ILOAD (4) INVOKESPECIAL (kotlinx/serialization/UnknownFieldException, , (I)V) ATHROW - LABEL (L2) + LABEL (L3) ALOAD (7) ALOAD (2) INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V) @@ -140,11 +147,12 @@ public final class Container$$serializer : java/lang/Object, kotlinx/serializati ACONST_NULL INVOKESPECIAL (Container, , (ILResult;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V) ARETURN - LABEL (L6) + LABEL (L7) } public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder decoder) { LABEL (L0) + LINENUMBER (18) ALOAD (0) ALOAD (1) INVOKEVIRTUAL (Container$$serializer, deserialize, (Lkotlinx/serialization/encoding/Decoder;)LContainer;) @@ -180,6 +188,7 @@ public final class Container$Companion : java/lang/Object { public final kotlinx.serialization.KSerializer serializer() { LABEL (L0) + LINENUMBER (18) GETSTATIC (Container$$serializer, INSTANCE, LContainer$$serializer;) CHECKCAST (kotlinx/serialization/KSerializer) ARETURN @@ -200,6 +209,8 @@ public final class Container : java/lang/Object { ACONST_NULL INVOKESPECIAL (Container$Companion, , (Lkotlin/jvm/internal/DefaultConstructorMarker;)V) PUTSTATIC (Container, Companion, LContainer$Companion;) + LABEL (L0) + LINENUMBER (18) ICONST_1 ANEWARRAY (kotlinx/serialization/KSerializer) ASTORE (0) @@ -297,6 +308,7 @@ public final class Result$Companion : java/lang/Object { public final kotlinx.serialization.KSerializer serializer() { LABEL (L0) + LINENUMBER (12) ALOAD (0) INVOKESPECIAL (Result$Companion, get$cachedSerializer, ()Lkotlinx/serialization/KSerializer;) ARETURN @@ -357,6 +369,8 @@ public final class Result$OK$$serializer : java/lang/Object, kotlinx/serializati DUP INVOKESPECIAL (Result$OK$$serializer, , ()V) PUTSTATIC (Result$OK$$serializer, INSTANCE, LResult$OK$$serializer;) + LABEL (L0) + LINENUMBER (14) NEW (kotlinx/serialization/internal/PluginGeneratedSerialDescriptor) DUP LDC (Result.OK) @@ -385,6 +399,7 @@ public final class Result$OK$$serializer : java/lang/Object, kotlinx/serializati public final kotlinx.serialization.KSerializer[] childSerializers() { LABEL (L0) + LINENUMBER (14) ICONST_1 ANEWARRAY (kotlinx/serialization/KSerializer) ASTORE (1) @@ -402,6 +417,8 @@ public final class Result$OK$$serializer : java/lang/Object, kotlinx/serializati ALOAD (1) LDC (decoder) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (14) GETSTATIC (Result$OK$$serializer, descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) ASTORE (2) ICONST_1 @@ -416,7 +433,34 @@ public final class Result$OK$$serializer : java/lang/Object, kotlinx/serializati ASTORE (7) ALOAD (7) INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSequentially, ()Z) - IFEQ (L1) + IFEQ (L2) + ALOAD (7) + ALOAD (2) + ICONST_0 + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String;) + ASTORE (6) + ILOAD (5) + ICONST_1 + IOR + ISTORE (5) + GOTO (L3) + LABEL (L2) + ILOAD (3) + IFEQ (L3) + ALOAD (7) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) + ISTORE (4) + ILOAD (4) + TABLESWITCH + -1: L4 + 0: L5 + default: L6 + LABEL (L4) + ICONST_0 + ISTORE (3) + GOTO (L2) + LABEL (L5) ALOAD (7) ALOAD (2) ICONST_0 @@ -427,40 +471,13 @@ public final class Result$OK$$serializer : java/lang/Object, kotlinx/serializati IOR ISTORE (5) GOTO (L2) - LABEL (L1) - ILOAD (3) - IFEQ (L2) - ALOAD (7) - ALOAD (2) - INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) - ISTORE (4) - ILOAD (4) - TABLESWITCH - -1: L3 - 0: L4 - default: L5 - LABEL (L3) - ICONST_0 - ISTORE (3) - GOTO (L1) - LABEL (L4) - ALOAD (7) - ALOAD (2) - ICONST_0 - INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String;) - ASTORE (6) - ILOAD (5) - ICONST_1 - IOR - ISTORE (5) - GOTO (L1) - LABEL (L5) + LABEL (L6) NEW (kotlinx/serialization/UnknownFieldException) DUP ILOAD (4) INVOKESPECIAL (kotlinx/serialization/UnknownFieldException, , (I)V) ATHROW - LABEL (L2) + LABEL (L3) ALOAD (7) ALOAD (2) INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V) @@ -471,11 +488,12 @@ public final class Result$OK$$serializer : java/lang/Object, kotlinx/serializati ACONST_NULL INVOKESPECIAL (Result$OK, , (ILjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V) ARETURN - LABEL (L6) + LABEL (L7) } public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder decoder) { LABEL (L0) + LINENUMBER (14) ALOAD (0) ALOAD (1) INVOKEVIRTUAL (Result$OK$$serializer, deserialize, (Lkotlinx/serialization/encoding/Decoder;)LResult$OK;) @@ -511,6 +529,7 @@ public final class Result$OK$Companion : java/lang/Object { public final kotlinx.serialization.KSerializer serializer() { LABEL (L0) + LINENUMBER (14) GETSTATIC (Result$OK$$serializer, INSTANCE, LResult$OK$$serializer;) CHECKCAST (kotlinx/serialization/KSerializer) ARETURN @@ -606,10 +625,14 @@ public abstract class Result : java/lang/Object, X { ACONST_NULL INVOKESPECIAL (Result$Companion, , (Lkotlin/jvm/internal/DefaultConstructorMarker;)V) PUTSTATIC (Result, Companion, LResult$Companion;) + LABEL (L0) + LINENUMBER (12) GETSTATIC (kotlin/LazyThreadSafetyMode, PUBLICATION, Lkotlin/LazyThreadSafetyMode;) INVOKEDYNAMIC (invoke, ()Lkotlin/jvm/functions/Function0;, java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (6), ()Ljava/lang/Object;, Result._init_$_anonymous_()Lkotlinx/serialization/KSerializer; (6), ()Lkotlinx/serialization/KSerializer;) INVOKESTATIC (kotlin/LazyKt, lazy, (Lkotlin/LazyThreadSafetyMode;Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy;) PUTSTATIC (Result, $cachedSerializer$delegate, Lkotlin/Lazy;) + LABEL (L1) + LINENUMBER (16) RETURN } @@ -673,6 +696,7 @@ public final class X$Companion : java/lang/Object { public final kotlinx.serialization.KSerializer serializer() { LABEL (L0) + LINENUMBER (6) NEW (kotlinx/serialization/SealedClassSerializer) DUP LDC (X) diff --git a/plugins/parcelize/parcelize-compiler/testData/diagnostics/withoutParcelableSupertype.fir.kt b/plugins/parcelize/parcelize-compiler/testData/diagnostics/withoutParcelableSupertype.fir.kt new file mode 100644 index 00000000000..18a0bea2a6b --- /dev/null +++ b/plugins/parcelize/parcelize-compiler/testData/diagnostics/withoutParcelableSupertype.fir.kt @@ -0,0 +1,20 @@ +package test + +import kotlinx.parcelize.Parcelize +import android.os.Parcelable + +@Parcelize +class Without(val firstName: String, val secondName: String, val age: Int) + +@Parcelize +class With(val firstName: String, val secondName: String, val age: Int) : Parcelable + +interface MyParcelableIntf : Parcelable + +abstract class MyParcelableCl : Parcelable + +@Parcelize +class WithIntfSubtype(val firstName: String, val secondName: String, val age: Int) : MyParcelableIntf + +@Parcelize +class WithClSubtype(val firstName: String, val secondName: String, val age: Int) : MyParcelableCl() diff --git a/plugins/parcelize/parcelize-compiler/testData/diagnostics/withoutParcelableSupertype.kt b/plugins/parcelize/parcelize-compiler/testData/diagnostics/withoutParcelableSupertype.kt index e645a745617..15db9a34601 100644 --- a/plugins/parcelize/parcelize-compiler/testData/diagnostics/withoutParcelableSupertype.kt +++ b/plugins/parcelize/parcelize-compiler/testData/diagnostics/withoutParcelableSupertype.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL package test import kotlinx.parcelize.Parcelize diff --git a/plugins/parcelize/parcelize-compiler/testData/diagnostics/wrongAnnotationTarget.fir.kt b/plugins/parcelize/parcelize-compiler/testData/diagnostics/wrongAnnotationTarget.fir.kt new file mode 100644 index 00000000000..c4378a1b3e1 --- /dev/null +++ b/plugins/parcelize/parcelize-compiler/testData/diagnostics/wrongAnnotationTarget.fir.kt @@ -0,0 +1,25 @@ +package test + +import kotlinx.parcelize.Parcelize +import android.os.Parcelable + +@Parcelize +interface Intf : Parcelable + +@Parcelize +object Obj + +class A { + @Parcelize + companion object { + fun foo() {} + } +} + +@Parcelize +enum class Enum { + WHITE, BLACK +} + +@Parcelize +annotation class Anno diff --git a/plugins/parcelize/parcelize-compiler/testData/diagnostics/wrongAnnotationTarget.kt b/plugins/parcelize/parcelize-compiler/testData/diagnostics/wrongAnnotationTarget.kt index 03c50ceb188..c22022d3865 100644 --- a/plugins/parcelize/parcelize-compiler/testData/diagnostics/wrongAnnotationTarget.kt +++ b/plugins/parcelize/parcelize-compiler/testData/diagnostics/wrongAnnotationTarget.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL package test import kotlinx.parcelize.Parcelize