diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt index fd445d350da..c105c8c27c3 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.load.kotlin import org.jetbrains.kotlin.builtins.UnsignedTypes import org.jetbrains.kotlin.descriptors.SourceElement -import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.metadata.ProtoBuf @@ -38,10 +37,10 @@ import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.KotlinType import java.util.* -abstract class AbstractBinaryClassAnnotationAndConstantLoader( +abstract class AbstractBinaryClassAnnotationAndConstantLoader( storageManager: StorageManager, private val kotlinClassFinder: KotlinClassFinder -) : AnnotationAndConstantLoader { +) : AnnotationAndConstantLoader { private val storage = storageManager.createMemoizedFunction> { kotlinClass -> loadAnnotationsAndInitializers(kotlinClass) @@ -91,48 +90,50 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader { + override fun loadCallableAnnotations(container: ProtoContainer, proto: MessageLite, kind: AnnotatedCallableKind): List { if (kind == AnnotatedCallableKind.PROPERTY) { - proto as ProtoBuf.Property - - val syntheticFunctionSignature = getPropertySignature(proto, container.nameResolver, container.typeTable, synthetic = true) - val fieldSignature = getPropertySignature(proto, container.nameResolver, container.typeTable, field = true) - - val isConst = Flags.IS_CONST.get(proto.flags) - val isMovedFromInterfaceCompanion = JvmProtoBufUtil.isMovedFromInterfaceCompanion(proto) - val propertyAnnotations = syntheticFunctionSignature?.let { sig -> - findClassAndLoadMemberAnnotations( - container, - sig, - property = true, - isConst = isConst, - isMovedFromInterfaceCompanion = isMovedFromInterfaceCompanion - ) - }.orEmpty() - - val fieldAnnotations = fieldSignature?.let { sig -> - findClassAndLoadMemberAnnotations( - container, - sig, - property = true, - field = true, - isConst = isConst, - isMovedFromInterfaceCompanion = isMovedFromInterfaceCompanion - ) - }.orEmpty() - - // TODO: check delegate presence in some other way - return loadPropertyAnnotations(propertyAnnotations, fieldAnnotations, - if (fieldSignature?.signature?.contains(JvmAbi.DELEGATED_PROPERTY_NAME_SUFFIX) ?: false) { - AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD - } - else { - AnnotationUseSiteTarget.FIELD - }) + return loadPropertyAnnotations(container, proto as ProtoBuf.Property, PropertyRelatedElement.PROPERTY) } val signature = getCallableSignature(proto, container.nameResolver, container.typeTable, kind) ?: return emptyList() - return transformAnnotations(findClassAndLoadMemberAnnotations(container, signature)) + return findClassAndLoadMemberAnnotations(container, signature) + } + + override fun loadPropertyBackingFieldAnnotations(container: ProtoContainer, proto: ProtoBuf.Property): List = + loadPropertyAnnotations(container, proto, PropertyRelatedElement.BACKING_FIELD) + + override fun loadPropertyDelegateFieldAnnotations(container: ProtoContainer, proto: ProtoBuf.Property): List = + loadPropertyAnnotations(container, proto, PropertyRelatedElement.DELEGATE_FIELD) + + private enum class PropertyRelatedElement { + PROPERTY, + BACKING_FIELD, + DELEGATE_FIELD, + } + + private fun loadPropertyAnnotations(container: ProtoContainer, proto: ProtoBuf.Property, element: PropertyRelatedElement): List { + val isConst = Flags.IS_CONST.get(proto.flags) + val isMovedFromInterfaceCompanion = JvmProtoBufUtil.isMovedFromInterfaceCompanion(proto) + if (element == PropertyRelatedElement.PROPERTY) { + val syntheticFunctionSignature = + getPropertySignature(proto, container.nameResolver, container.typeTable, synthetic = true) ?: return emptyList() + return findClassAndLoadMemberAnnotations( + container, syntheticFunctionSignature, property = true, isConst = isConst, + isMovedFromInterfaceCompanion = isMovedFromInterfaceCompanion + ) + } + + val fieldSignature = + getPropertySignature(proto, container.nameResolver, container.typeTable, field = true) ?: return emptyList() + + // TODO: check delegate presence in some other way + val isDelegated = JvmAbi.DELEGATED_PROPERTY_NAME_SUFFIX in fieldSignature.signature + if (isDelegated != (element == PropertyRelatedElement.DELEGATE_FIELD)) return emptyList() + + return findClassAndLoadMemberAnnotations( + container, fieldSignature, property = true, field = true, isConst = isConst, + isMovedFromInterfaceCompanion = isMovedFromInterfaceCompanion + ) } override fun loadEnumEntryAnnotations(container: ProtoContainer, proto: ProtoBuf.EnumEntry): List { @@ -143,11 +144,6 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader, fieldAnnotations: List, - fieldUseSiteTarget: AnnotationUseSiteTarget): List - - protected abstract fun transformAnnotations(annotations: List): List - private fun findClassAndLoadMemberAnnotations( container: ProtoContainer, signature: MemberSignature, diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt index c5b35c3c17f..875bc02113b 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt @@ -18,7 +18,9 @@ package org.jetbrains.kotlin.load.kotlin import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.annotations.* +import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl +import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.load.java.components.DescriptorResolverUtils import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass.AnnotationArrayArgumentVisitor import org.jetbrains.kotlin.metadata.ProtoBuf @@ -39,7 +41,7 @@ class BinaryClassAnnotationAndConstantLoaderImpl( private val notFoundClasses: NotFoundClasses, storageManager: StorageManager, kotlinClassFinder: KotlinClassFinder -) : AbstractBinaryClassAnnotationAndConstantLoader, AnnotationWithTarget>( +) : AbstractBinaryClassAnnotationAndConstantLoader>( storageManager, kotlinClassFinder ) { private val annotationDeserializer = AnnotationDeserializer(module, notFoundClasses) @@ -75,19 +77,6 @@ class BinaryClassAnnotationAndConstantLoaderImpl( } } - override fun loadPropertyAnnotations( - propertyAnnotations: List, - fieldAnnotations: List, - fieldUseSiteTarget: AnnotationUseSiteTarget - ): List { - return propertyAnnotations.map { AnnotationWithTarget(it, null) } + - fieldAnnotations.map { AnnotationWithTarget(it, fieldUseSiteTarget) } - } - - override fun transformAnnotations(annotations: List): List { - return annotations.map { AnnotationWithTarget(it, null) } - } - override fun loadAnnotation( annotationClassId: ClassId, source: SourceElement, diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoader.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoader.kt index d3fbbe53e65..04df924de52 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoader.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoader.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.types.KotlinType // The MessageLite instance everywhere should be Constructor, Function or Property // TODO: simplify this interface -interface AnnotationAndConstantLoader { +interface AnnotationAndConstantLoader { fun loadClassAnnotations( container: ProtoContainer.Class ): List @@ -32,7 +32,17 @@ interface AnnotationAndConstantLoader { container: ProtoContainer, proto: MessageLite, kind: AnnotatedCallableKind - ): List + ): List + + fun loadPropertyBackingFieldAnnotations( + container: ProtoContainer, + proto: ProtoBuf.Property + ): List + + fun loadPropertyDelegateFieldAnnotations( + container: ProtoContainer, + proto: ProtoBuf.Property + ): List fun loadEnumEntryAnnotations( container: ProtoContainer, diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoaderImpl.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoaderImpl.kt index 18eae62bc01..69b7f4b5fbe 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoaderImpl.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoaderImpl.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.serialization.deserialization import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.NotFoundClasses import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor -import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull @@ -32,7 +31,7 @@ class AnnotationAndConstantLoaderImpl( module: ModuleDescriptor, notFoundClasses: NotFoundClasses, private val protocol: SerializerExtensionProtocol -) : AnnotationAndConstantLoader, AnnotationWithTarget> { +) : AnnotationAndConstantLoader> { private val deserializer = AnnotationDeserializer(module, notFoundClasses) override fun loadClassAnnotations(container: ProtoContainer.Class): List { @@ -44,7 +43,7 @@ class AnnotationAndConstantLoaderImpl( container: ProtoContainer, proto: MessageLite, kind: AnnotatedCallableKind - ): List { + ): List { val annotations = when (proto) { is ProtoBuf.Constructor -> proto.getExtension(protocol.constructorAnnotation) is ProtoBuf.Function -> proto.getExtension(protocol.functionAnnotation) @@ -52,10 +51,16 @@ class AnnotationAndConstantLoaderImpl( else -> error("Unknown message: $proto") }.orEmpty() return annotations.map { annotationProto -> - AnnotationWithTarget(deserializer.deserializeAnnotation(annotationProto, container.nameResolver), null) + deserializer.deserializeAnnotation(annotationProto, container.nameResolver) } } + override fun loadPropertyBackingFieldAnnotations(container: ProtoContainer, proto: ProtoBuf.Property): List = + emptyList() + + override fun loadPropertyDelegateFieldAnnotations(container: ProtoContainer, proto: ProtoBuf.Property): List = + emptyList() + override fun loadEnumEntryAnnotations(container: ProtoContainer, proto: ProtoBuf.EnumEntry): List { val annotations = proto.getExtension(protocol.enumEntryAnnotation).orEmpty() return annotations.map { annotationProto -> diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt index 8acb23ffa68..e7a26d476a1 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.serialization.deserialization import org.jetbrains.kotlin.builtins.isSuspendFunctionType import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl import org.jetbrains.kotlin.descriptors.impl.FieldDescriptorImpl @@ -31,11 +30,9 @@ class MemberDeserializer(private val c: DeserializationContext) { fun loadProperty(proto: ProtoBuf.Property): PropertyDescriptor { val flags = if (proto.hasFlags()) proto.flags else loadOldFlags(proto.oldFlags) - val propertyAnnotations = getAnnotations(proto, flags, AnnotatedCallableKind.PROPERTY) - val property = DeserializedPropertyDescriptor( c.containingDeclaration, null, - propertyAnnotations, + getAnnotations(proto, flags, AnnotatedCallableKind.PROPERTY), ProtoEnumFlags.modality(Flags.MODALITY.get(flags)), ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)), Flags.IS_VAR.get(flags), @@ -138,17 +135,10 @@ class MemberDeserializer(private val c: DeserializationContext) { ) } - // TODO: add needed methods to AnnotationAndConstantLoader - val fieldAnnotations = DeserializedAnnotations(c.storageManager) { - propertyAnnotations.getUseSiteTargetedAnnotations() - .filter { it.target == AnnotationUseSiteTarget.FIELD }.map { it.annotation } - } - val delegateAnnotations = DeserializedAnnotations(c.storageManager) { - propertyAnnotations.getUseSiteTargetedAnnotations() - .filter { it.target == AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD }.map { it.annotation } - } property.initialize( - getter, setter, FieldDescriptorImpl(fieldAnnotations, property), FieldDescriptorImpl(delegateAnnotations, property), + getter, setter, + FieldDescriptorImpl(getPropertyFieldAnnotations(proto, isDelegate = false), property), + FieldDescriptorImpl(getPropertyFieldAnnotations(proto, isDelegate = true), property), property.checkExperimentalCoroutine(local.typeDeserializer) ) @@ -358,13 +348,28 @@ class MemberDeserializer(private val c: DeserializationContext) { if (!Flags.HAS_ANNOTATIONS.get(flags)) { return Annotations.EMPTY } - return NonEmptyDeserializedAnnotationsWithPossibleTargets(c.storageManager) { + return NonEmptyDeserializedAnnotations(c.storageManager) { c.containingDeclaration.asProtoContainer()?.let { c.components.annotationAndConstantLoader.loadCallableAnnotations(it, proto, kind).toList() }.orEmpty() } } + private fun getPropertyFieldAnnotations(proto: ProtoBuf.Property, isDelegate: Boolean): Annotations { + if (!Flags.HAS_ANNOTATIONS.get(proto.flags)) { + return Annotations.EMPTY + } + return NonEmptyDeserializedAnnotations(c.storageManager) { + c.containingDeclaration.asProtoContainer()?.let { + if (isDelegate) { + c.components.annotationAndConstantLoader.loadPropertyDelegateFieldAnnotations(it, proto).toList() + } else { + c.components.annotationAndConstantLoader.loadPropertyBackingFieldAnnotations(it, proto).toList() + } + }.orEmpty() + } + } + private fun getReceiverParameterAnnotations(proto: MessageLite, kind: AnnotatedCallableKind): Annotations = DeserializedAnnotations(c.storageManager) { c.containingDeclaration.asProtoContainer()?.let { diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt index b75722b2983..15cfd6eeead 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.serialization.deserialization import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor -import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider import org.jetbrains.kotlin.descriptors.deserialization.ClassDescriptorFactory import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentDeclarationFilter @@ -36,7 +35,7 @@ class DeserializationComponents( val moduleDescriptor: ModuleDescriptor, val configuration: DeserializationConfiguration, val classDataFinder: ClassDataFinder, - val annotationAndConstantLoader: AnnotationAndConstantLoader, AnnotationWithTarget>, + val annotationAndConstantLoader: AnnotationAndConstantLoader>, val packageFragmentProvider: PackageFragmentProvider, val localClassifierTypeSettings: LocalClassifierTypeSettings, val errorReporter: ErrorReporter, diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedAnnotations.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedAnnotations.kt index 865ffe8231c..d634e26a1b0 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedAnnotations.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedAnnotations.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.serialization.deserialization.descriptors import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.getValue @@ -42,28 +41,3 @@ class NonEmptyDeserializedAnnotations( ) : DeserializedAnnotations(storageManager, compute) { override fun isEmpty(): Boolean = false } - -open class DeserializedAnnotationsWithPossibleTargets( - storageManager: StorageManager, - compute: () -> List -) : Annotations { - private val annotations by storageManager.createLazyValue(compute) - - override fun isEmpty(): Boolean = annotations.isEmpty() - - override fun findAnnotation(fqName: FqName): AnnotationDescriptor? = - annotations.firstOrNull { (annotation, target) -> target == null && annotation.fqName == fqName }?.annotation - - override fun getUseSiteTargetedAnnotations(): List = annotations.filter { it.target != null } - - override fun iterator(): Iterator { - return annotations.asSequence().filter { it.target == null }.map { it.annotation }.iterator() - } -} - -class NonEmptyDeserializedAnnotationsWithPossibleTargets( - storageManager: StorageManager, - compute: () -> List -) : DeserializedAnnotationsWithPossibleTargets(storageManager, compute) { - override fun isEmpty(): Boolean = false -} diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClsStubBuilder.kt index bb2513f23e7..e723213483e 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClsStubBuilder.kt @@ -23,7 +23,6 @@ import com.intellij.psi.impl.compiled.ClassFileStubBuilder import com.intellij.psi.stubs.PsiFileStub import com.intellij.util.indexing.FileContent import org.jetbrains.kotlin.descriptors.SourceElement -import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.idea.caches.IDEKotlinBinaryClassCache import org.jetbrains.kotlin.idea.decompiler.stubBuilder.* import org.jetbrains.kotlin.load.kotlin.* @@ -125,7 +124,7 @@ class AnnotationLoaderForClassFileStubBuilder( kotlinClassFinder: KotlinClassFinder, private val cachedFile: VirtualFile, private val cachedFileContent: ByteArray -) : AbstractBinaryClassAnnotationAndConstantLoader(LockBasedStorageManager.NO_LOCKS, kotlinClassFinder) { +) : AbstractBinaryClassAnnotationAndConstantLoader(LockBasedStorageManager.NO_LOCKS, kotlinClassFinder) { override fun getCachedFileContent(kotlinClass: KotlinJvmBinaryClass): ByteArray? { if ((kotlinClass as? VirtualFileKotlinClass)?.file == cachedFile) { @@ -147,13 +146,4 @@ class AnnotationLoaderForClassFileStubBuilder( result.add(annotationClassId) return null } - - override fun loadPropertyAnnotations( - propertyAnnotations: List, fieldAnnotations: List, fieldUseSiteTarget: AnnotationUseSiteTarget - ): List { - return propertyAnnotations.map { ClassIdWithTarget(it, null) } + - fieldAnnotations.map { ClassIdWithTarget(it, fieldUseSiteTarget ) } - } - - override fun transformAnnotations(annotations: List) = annotations.map { ClassIdWithTarget(it, null) } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/AnnotationLoaderForStubBuilderImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/AnnotationLoaderForStubBuilderImpl.kt index 7fcdd45cbe8..00e5f8871ef 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/AnnotationLoaderForStubBuilderImpl.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/AnnotationLoaderForStubBuilderImpl.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.idea.decompiler.common -import org.jetbrains.kotlin.idea.decompiler.stubBuilder.ClassIdWithTarget import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.name.ClassId @@ -30,7 +29,7 @@ import org.jetbrains.kotlin.types.KotlinType class AnnotationLoaderForStubBuilderImpl( private val protocol: SerializerExtensionProtocol -) : AnnotationAndConstantLoader { +) : AnnotationAndConstantLoader { override fun loadClassAnnotations(container: ProtoContainer.Class): List = container.classProto.getExtension(protocol.classAnnotation).orEmpty().map { container.nameResolver.getClassId(it.id) } @@ -39,18 +38,22 @@ class AnnotationLoaderForStubBuilderImpl( container: ProtoContainer, proto: MessageLite, kind: AnnotatedCallableKind - ): List { + ): List { val annotations = when (proto) { is ProtoBuf.Constructor -> proto.getExtension(protocol.constructorAnnotation) is ProtoBuf.Function -> proto.getExtension(protocol.functionAnnotation) is ProtoBuf.Property -> proto.getExtension(protocol.propertyAnnotation) else -> error("Unknown message: $proto") }.orEmpty() - return annotations.map { - ClassIdWithTarget(container.nameResolver.getClassId(it.id), null) - } + return annotations.map { container.nameResolver.getClassId(it.id) } } + override fun loadPropertyBackingFieldAnnotations(container: ProtoContainer, proto: ProtoBuf.Property): List = + emptyList() + + override fun loadPropertyDelegateFieldAnnotations(container: ProtoContainer, proto: ProtoBuf.Property): List = + emptyList() + override fun loadEnumEntryAnnotations(container: ProtoContainer, proto: ProtoBuf.EnumEntry): List = proto.getExtension(protocol.enumEntryAnnotation).orEmpty().map { container.nameResolver.getClassId(it.id) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt index 6a7643d17b0..b3d41763fc4 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt @@ -166,7 +166,7 @@ private class FunctionClsStubBuilder( val annotationIds = c.components.annotationLoader.loadCallableAnnotations( protoContainer, functionProto, AnnotatedCallableKind.FUNCTION ) - createTargetedAnnotationStubs(annotationIds, modifierListStubImpl) + createAnnotationStubs(annotationIds, modifierListStubImpl) } override fun doCreateCallableStub(parent: StubElement): StubElement { @@ -219,10 +219,17 @@ private class PropertyClsStubBuilder( listOf(VISIBILITY, LATEINIT, EXTERNAL_PROPERTY) + constModifier + modalityModifier ) - val annotationIds = c.components.annotationLoader.loadCallableAnnotations( - protoContainer, propertyProto, AnnotatedCallableKind.PROPERTY - ) - createTargetedAnnotationStubs(annotationIds, modifierListStubImpl) + val propertyAnnotations = + c.components.annotationLoader.loadCallableAnnotations(protoContainer, propertyProto, AnnotatedCallableKind.PROPERTY) + val backingFieldAnnotations = + c.components.annotationLoader.loadPropertyBackingFieldAnnotations(protoContainer, propertyProto) + val delegateFieldAnnotations = + c.components.annotationLoader.loadPropertyDelegateFieldAnnotations(protoContainer, propertyProto) + val allAnnotations = + propertyAnnotations.map { ClassIdWithTarget(it, null) } + + backingFieldAnnotations.map { ClassIdWithTarget(it, AnnotationUseSiteTarget.FIELD) } + + delegateFieldAnnotations.map { ClassIdWithTarget(it, AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD) } + createTargetedAnnotationStubs(allAnnotations, modifierListStubImpl) } override fun doCreateCallableStub(parent: StubElement): StubElement { @@ -268,7 +275,7 @@ private class ConstructorClsStubBuilder( val annotationIds = c.components.annotationLoader.loadCallableAnnotations( protoContainer, constructorProto, AnnotatedCallableKind.FUNCTION ) - createTargetedAnnotationStubs(annotationIds, modifierListStubImpl) + createAnnotationStubs(annotationIds, modifierListStubImpl) } override fun doCreateCallableStub(parent: StubElement): StubElement { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderContext.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderContext.kt index 40d822bb18e..3db6ffcd5a1 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderContext.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderContext.kt @@ -33,7 +33,7 @@ data class ClassIdWithTarget(val classId: ClassId, val target: AnnotationUseSite class ClsStubBuilderComponents( val classDataFinder: ClassDataFinder, - val annotationLoader: AnnotationAndConstantLoader, + val annotationLoader: AnnotationAndConstantLoader, val virtualFileForDebug: VirtualFile ) { fun createContext(