diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt index 578943d85b6..5a52742cb2f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt @@ -42,3 +42,6 @@ fun AnnotationDescriptor.argumentValue(parameterName: String): ConstantValue<*>? DeprecationLevel.ERROR ) val JVM_FIELD_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.JvmField") + +val KOTLINX_SERIALIZABLE_FQ_NAME = FqName("kotlinx.serialization.Serializable") +val KOTLINX_SERIALIZER_FQ_NAME = FqName("kotlinx.serialization.Serializer") diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IDELightClassContexts.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IDELightClassContexts.kt index 39b07dbee6b..c58bec7e76a 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IDELightClassContexts.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IDELightClassContexts.kt @@ -52,6 +52,8 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext import org.jetbrains.kotlin.resolve.* +import org.jetbrains.kotlin.resolve.annotations.KOTLINX_SERIALIZABLE_FQ_NAME +import org.jetbrains.kotlin.resolve.annotations.KOTLINX_SERIALIZER_FQ_NAME import org.jetbrains.kotlin.resolve.calls.CallResolver import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode @@ -158,7 +160,10 @@ internal object IDELightClassContexts { listOf(classOrObject.containingKtFile) ) - ForceResolveUtil.forceResolveAllContents(resolveSession.resolveToDescriptor(classOrObject)) + val descriptor = resolveSession.resolveToDescriptor(classOrObject) as? ClassDescriptor ?: return null + if (!isDummyResolveApplicableByDescriptor(descriptor)) return null + + ForceResolveUtil.forceResolveAllContents(descriptor) return IDELightClassConstructionContext(resolveSession.bindingContext, resolveSession.moduleDescriptor, classOrObject.languageVersionSettings, LIGHT) } @@ -183,9 +188,30 @@ internal object IDELightClassContexts { if (hasMembersOverridingInternalMembers(classOrObject)) return false + if (hasSerializationLikeAnnotations(classOrObject)) return false + return classOrObject.declarations.filterIsInstance().all { isDummyResolveApplicable(it) } } + private fun hasSerializationLikeAnnotations(classOrObject: KtClassOrObject) = + classOrObject.annotationEntries.any { isSerializableOrSerializerShortName(it.shortName) } + + private fun isDummyResolveApplicableByDescriptor(classDescriptor: ClassDescriptor): Boolean { + if (classDescriptor.annotations.any { isSerializableOrSerializerFqName(it.fqName) }) return false + + return classDescriptor + .unsubstitutedInnerClassesScope + .getContributedDescriptors() + .filterIsInstance() + .all(::isDummyResolveApplicableByDescriptor) + } + + private fun isSerializableOrSerializerShortName(shortName: Name?) = + shortName == KOTLINX_SERIALIZABLE_FQ_NAME.shortName() || shortName == KOTLINX_SERIALIZER_FQ_NAME.shortName() + + private fun isSerializableOrSerializerFqName(fqName: FqName?) = + fqName == KOTLINX_SERIALIZABLE_FQ_NAME || fqName == KOTLINX_SERIALIZER_FQ_NAME + private fun hasDelegatedSupertypes(classOrObject: KtClassOrObject) = classOrObject.superTypeListEntries.any { it is KtDelegatedSuperTypeEntry } @@ -332,7 +358,9 @@ internal object IDELightClassContexts { FqName("kotlin.PublishedApi") + FqName("kotlin.Deprecated") + FqName("kotlin.internal.InlineOnly") + - FqName("kotlinx.android.parcel.Parcelize") + FqName("kotlinx.android.parcel.Parcelize") + + KOTLINX_SERIALIZABLE_FQ_NAME + + KOTLINX_SERIALIZER_FQ_NAME } class AdHocAnnotationResolver( diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt index b488fff0734..f54b836639e 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt @@ -1,7 +1,10 @@ package org.jetbrains.kotlinx.serialization.compiler.resolve +import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.annotations.KOTLINX_SERIALIZABLE_FQ_NAME +import org.jetbrains.kotlin.resolve.annotations.KOTLINX_SERIALIZER_FQ_NAME object SerializationPackages { internal val packageFqName = FqName("kotlinx.serialization") @@ -10,8 +13,8 @@ object SerializationPackages { } object SerializationAnnotations { - internal val serializableAnnotationFqName = FqName("kotlinx.serialization.Serializable") - internal val serializerAnnotationFqName = FqName("kotlinx.serialization.Serializer") + internal val serializableAnnotationFqName = KOTLINX_SERIALIZABLE_FQ_NAME + internal val serializerAnnotationFqName = KOTLINX_SERIALIZER_FQ_NAME internal val serialNameAnnotationFqName = FqName("kotlinx.serialization.SerialName") internal val serialOptionalFqName = FqName("kotlinx.serialization.Optional") internal val serialTransientFqName = FqName("kotlinx.serialization.Transient") @@ -81,4 +84,4 @@ object CallingConventions { const val addElement = "addElement" const val addAnnotation = "pushAnnotation" const val addClassAnnotation = "pushClassAnnotation" -} \ No newline at end of file +}