diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/symbolAnnotationsUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/symbolAnnotationsUtils.kt index d1a62e88762..6db06abf13f 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/symbolAnnotationsUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/symbolAnnotationsUtils.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.annotations.* import org.jetbrains.kotlin.analysis.api.annotations.KtKClassAnnotationValue.KtNonLocalKClassAnnotationValue import org.jetbrains.kotlin.analysis.api.components.buildClassType -import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol @@ -25,17 +24,14 @@ import org.jetbrains.kotlin.light.classes.symbol.NullabilityType import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethod import org.jetbrains.kotlin.load.java.JvmAbi -import org.jetbrains.kotlin.load.java.JvmAbi.JVM_FIELD_ANNOTATION_CLASS_ID import org.jetbrains.kotlin.load.java.JvmAnnotationNames -import org.jetbrains.kotlin.name.* -import org.jetbrains.kotlin.name.JvmNames.JVM_MULTIFILE_CLASS_ID -import org.jetbrains.kotlin.name.JvmNames.JVM_NAME_CLASS_ID +import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.JvmNames.JVM_OVERLOADS_CLASS_ID import org.jetbrains.kotlin.name.JvmNames.JVM_SYNTHETIC_ANNOTATION_CLASS_ID -import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_CLASS_ID -import org.jetbrains.kotlin.resolve.annotations.JVM_THROWS_ANNOTATION_FQ_NAME +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue -import org.jetbrains.kotlin.resolve.inline.INLINE_ONLY_ANNOTATION_FQ_NAME import java.lang.annotation.ElementType internal fun KtAnnotatedSymbol.hasJvmSyntheticAnnotation( @@ -43,16 +39,8 @@ internal fun KtAnnotatedSymbol.hasJvmSyntheticAnnotation( strictUseSite: Boolean = true, ): Boolean = hasAnnotation(JVM_SYNTHETIC_ANNOTATION_CLASS_ID, annotationUseSiteTarget, strictUseSite) -internal fun KtFileSymbol.hasJvmMultifileClassAnnotation(): Boolean = - hasAnnotation(JVM_MULTIFILE_CLASS_ID, AnnotationUseSiteTarget.FILE) - internal fun KtAnnotatedSymbol.getJvmNameFromAnnotation(annotationUseSiteTarget: AnnotationUseSiteTarget? = null): String? { - val annotation = annotations.firstOrNull { - val siteTarget = it.useSiteTarget - (siteTarget == null || siteTarget == annotationUseSiteTarget) && - it.classId == JVM_NAME_CLASS_ID - } - + val annotation = findAnnotation(StandardClassIds.Annotations.JvmName, annotationUseSiteTarget, strictUseSite = false) return annotation?.let { (it.arguments.firstOrNull()?.expression as? KtConstantAnnotationValue)?.constantValue?.value as? String } @@ -62,9 +50,7 @@ context(KtAnalysisSession) internal fun isHiddenByDeprecation( symbol: KtAnnotatedSymbol, annotationUseSiteTarget: AnnotationUseSiteTarget? = null, -): Boolean { - return symbol.getDeprecationStatus(annotationUseSiteTarget)?.deprecationLevel == DeprecationLevelValue.HIDDEN -} +): Boolean = symbol.getDeprecationStatus(annotationUseSiteTarget)?.deprecationLevel == DeprecationLevelValue.HIDDEN context(KtAnalysisSession) internal fun KtAnnotatedSymbol.isHiddenOrSynthetic( @@ -72,8 +58,7 @@ internal fun KtAnnotatedSymbol.isHiddenOrSynthetic( strictUseSite: Boolean = true, ) = isHiddenByDeprecation(this, annotationUseSiteTarget) || hasJvmSyntheticAnnotation(annotationUseSiteTarget, strictUseSite) -internal fun KtAnnotatedSymbol.hasJvmFieldAnnotation(): Boolean = - hasAnnotation(JVM_FIELD_ANNOTATION_CLASS_ID, null) +internal fun KtAnnotatedSymbol.hasJvmFieldAnnotation(): Boolean = hasAnnotation(StandardClassIds.Annotations.JvmField) internal fun KtAnnotatedSymbol.hasPublishedApiAnnotation(annotationUseSiteTarget: AnnotationUseSiteTarget? = null): Boolean = hasAnnotation(StandardClassIds.Annotations.PublishedApi, annotationUseSiteTarget) @@ -83,56 +68,34 @@ internal fun KtAnnotatedSymbol.hasDeprecatedAnnotation( strictUseSite: Boolean = true, ): Boolean = hasAnnotation(StandardClassIds.Annotations.Deprecated, annotationUseSiteTarget, strictUseSite) -internal fun KtAnnotatedSymbol.hasJvmOverloadsAnnotation(): Boolean = hasAnnotation(JVM_OVERLOADS_CLASS_ID, null) +internal fun KtAnnotatedSymbol.hasJvmOverloadsAnnotation(): Boolean = hasAnnotation(JVM_OVERLOADS_CLASS_ID) internal fun KtAnnotatedSymbol.hasJvmStaticAnnotation( annotationUseSiteTarget: AnnotationUseSiteTarget? = null, strictUseSite: Boolean = true, -): Boolean = hasAnnotation(JVM_STATIC_ANNOTATION_CLASS_ID, annotationUseSiteTarget, strictUseSite) +): Boolean = hasAnnotation(StandardClassIds.Annotations.JvmStatic, annotationUseSiteTarget, strictUseSite) -internal fun KtAnnotatedSymbol.hasInlineOnlyAnnotation(): Boolean = - hasAnnotation(INLINE_ONLY_ANNOTATION_FQ_NAME, null) - -internal fun KtAnnotatedSymbol.hasAnnotation( - classId: ClassId, - annotationUseSiteTarget: AnnotationUseSiteTarget?, - strictUseSite: Boolean = true, -): Boolean = findAnnotation(classId, annotationUseSiteTarget, strictUseSite) != null +internal fun KtAnnotatedSymbol.hasInlineOnlyAnnotation(): Boolean = hasAnnotation(StandardClassIds.Annotations.InlineOnly) internal fun KtAnnotatedSymbol.findAnnotation( classId: ClassId, annotationUseSiteTarget: AnnotationUseSiteTarget?, strictUseSite: Boolean = true, -): KtAnnotationApplication? = - annotations.find { +): KtAnnotationApplication? { + if (!hasAnnotation(classId, annotationUseSiteTarget, strictUseSite)) return null + + return annotations.find { val useSiteTarget = it.useSiteTarget (useSiteTarget == annotationUseSiteTarget || !strictUseSite && useSiteTarget == null) && it.classId == classId } +} -internal fun KtAnnotatedSymbol.hasAnnotation( - fqName: FqName, - annotationUseSiteTarget: AnnotationUseSiteTarget?, - strictUseSite: Boolean = true, -): Boolean = findAnnotation(fqName, annotationUseSiteTarget, strictUseSite) != null - -internal fun KtAnnotatedSymbol.findAnnotation( - fqName: FqName, - annotationUseSiteTarget: AnnotationUseSiteTarget?, - strictUseSite: Boolean = true, -): KtAnnotationApplication? = - annotations.find { - val useSiteTarget = it.useSiteTarget - (useSiteTarget == annotationUseSiteTarget || !strictUseSite && useSiteTarget == null) && it.classId?.asSingleFqName() == fqName - } - -internal fun NullabilityType.computeNullabilityAnnotation(parent: PsiModifierList): SymbolLightSimpleAnnotation? { - return when (this) { - NullabilityType.NotNull -> NotNull::class.java - NullabilityType.Nullable -> Nullable::class.java - else -> null - }?.let { - SymbolLightSimpleAnnotation(it.name, parent) - } +internal fun NullabilityType.computeNullabilityAnnotation(parent: PsiModifierList): SymbolLightSimpleAnnotation? = when (this) { + NullabilityType.NotNull -> NotNull::class.java + NullabilityType.Nullable -> Nullable::class.java + else -> null +}?.let { + SymbolLightSimpleAnnotation(it.name, parent) } context(KtAnalysisSession) @@ -335,7 +298,7 @@ internal fun KtAnnotatedSymbol.computeThrowsList( builder.addReference(java.lang.NullPointerException::class.qualifiedName) } - val annoApp = findAnnotation(JVM_THROWS_ANNOTATION_FQ_NAME, annotationUseSiteTarget, strictUseSite) ?: return + val annoApp = findAnnotation(StandardClassIds.Annotations.Throws, annotationUseSiteTarget, strictUseSite) ?: return fun handleAnnotationValue(annotationValue: KtAnnotationValue) = when (annotationValue) { is KtArrayAnnotationValue -> { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt index c913e6aa688..3a94af75f52 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -10,6 +10,7 @@ import com.intellij.psi.PsiManager import com.intellij.psi.PsiModifier import com.intellij.psi.PsiReferenceList import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.annotations.hasAnnotation import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithTypeParameters @@ -27,13 +28,15 @@ import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.hasInterfaceDefaultImpls import org.jetbrains.kotlin.asJava.toLightClass -import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.config.JvmAnalysisFlags import org.jetbrains.kotlin.config.JvmDefaultMode import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.lexer.KtTokens.* -import org.jetbrains.kotlin.light.classes.symbol.annotations.* +import org.jetbrains.kotlin.light.classes.symbol.annotations.hasJvmFieldAnnotation +import org.jetbrains.kotlin.light.classes.symbol.annotations.hasJvmOverloadsAnnotation +import org.jetbrains.kotlin.light.classes.symbol.annotations.hasJvmStaticAnnotation +import org.jetbrains.kotlin.light.classes.symbol.annotations.isHiddenOrSynthetic import org.jetbrains.kotlin.light.classes.symbol.copy import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightField import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightFieldForEnumEntry @@ -46,7 +49,6 @@ import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightConstructor import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightNoArgConstructor import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightSimpleMethod import org.jetbrains.kotlin.load.java.JvmAbi -import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClass @@ -496,8 +498,8 @@ internal fun KtSymbolWithMembers.createInnerClasses( if (containingClass is SymbolLightClassForAnnotationClass && this is KtNamedClassOrObjectSymbol && - hasAnnotation(StandardNames.FqNames.repeatable, annotationUseSiteTarget = null) && - !hasAnnotation(JvmAnnotationNames.REPEATABLE_ANNOTATION, annotationUseSiteTarget = null) + hasAnnotation(StandardClassIds.Annotations.Repeatable) && + !hasAnnotation(StandardClassIds.Annotations.Java.Repeatable) ) { result.add(SymbolLightClassForRepeatableAnnotationContainer(containingClass)) } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt index bfeb2aa0e84..d41865ff95f 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -11,6 +11,7 @@ import com.intellij.psi.PsiModifierList import com.intellij.psi.PsiType import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue +import org.jetbrains.kotlin.analysis.api.annotations.hasAnnotation import org.jetbrains.kotlin.analysis.api.base.KtConstantValue import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol @@ -22,7 +23,6 @@ import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.light.classes.symbol.* import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations -import org.jetbrains.kotlin.light.classes.symbol.annotations.hasAnnotation import org.jetbrains.kotlin.light.classes.symbol.annotations.hasDeprecatedAnnotation import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase import org.jetbrains.kotlin.light.classes.symbol.modifierLists.LazyModifiersBox @@ -115,12 +115,12 @@ internal class SymbolLightFieldForProperty private constructor( } PsiModifier.VOLATILE -> withPropertySymbol { propertySymbol -> - val hasAnnotation = propertySymbol.hasAnnotation(VOLATILE_ANNOTATION_CLASS_ID, null) + val hasAnnotation = propertySymbol.hasAnnotation(VOLATILE_ANNOTATION_CLASS_ID) mapOf(modifier to hasAnnotation) } PsiModifier.TRANSIENT -> withPropertySymbol { propertySymbol -> - val hasAnnotation = propertySymbol.hasAnnotation(TRANSIENT_ANNOTATION_CLASS_ID, null) + val hasAnnotation = propertySymbol.hasAnnotation(TRANSIENT_ANNOTATION_CLASS_ID) mapOf(modifier to hasAnnotation) } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt index 986d866d179..09a7ed41d7d 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -9,6 +9,7 @@ import com.intellij.psi.* import kotlinx.collections.immutable.PersistentMap import kotlinx.collections.immutable.mutate import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.annotations.hasAnnotation import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode @@ -17,7 +18,6 @@ import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.light.classes.symbol.* import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations -import org.jetbrains.kotlin.light.classes.symbol.annotations.hasAnnotation import org.jetbrains.kotlin.light.classes.symbol.annotations.hasInlineOnlyAnnotation import org.jetbrains.kotlin.light.classes.symbol.annotations.hasJvmStaticAnnotation import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase @@ -128,13 +128,13 @@ internal class SymbolLightSimpleMethod( PsiModifier.STRICTFP -> { ifInlineOnly { return null } - val hasAnnotation = withFunctionSymbol { it.hasAnnotation(STRICTFP_ANNOTATION_CLASS_ID, null) } + val hasAnnotation = withFunctionSymbol { it.hasAnnotation(STRICTFP_ANNOTATION_CLASS_ID) } mapOf(modifier to hasAnnotation) } PsiModifier.SYNCHRONIZED -> { ifInlineOnly { return null } - val hasAnnotation = withFunctionSymbol { it.hasAnnotation(SYNCHRONIZED_ANNOTATION_CLASS_ID, null) } + val hasAnnotation = withFunctionSymbol { it.hasAnnotation(SYNCHRONIZED_ANNOTATION_CLASS_ID) } mapOf(modifier to hasAnnotation) } diff --git a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt index 880f6727df7..67d0b4df278 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -160,11 +160,14 @@ object StandardClassIds { val JvmDefault = "JvmDefault".jvmId() val JvmRepeatable = "JvmRepeatable".jvmId() val JvmRecord = "JvmRecord".jvmId() + val Throws = "Throws".jvmId() val RawTypeAnnotation = "RawType".internalIrId() val FlexibleNullability = "FlexibleNullability".internalIrId() val EnhancedNullability = "EnhancedNullability".jvmInternalId() + val InlineOnly = "InlineOnly".internalId() + val OnlyInputTypes = "OnlyInputTypes".internalId() val RestrictsSuspension = "RestrictsSuspension".coroutinesId()