[FIR] Use getAnnotationByClassId instead of getAnnotationByFqName in JVM checkers
This commit is contained in:
committed by
TeamCityServer
parent
9ee7fecdd5
commit
69a13a3269
+2
-2
@@ -120,8 +120,8 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") {
|
||||
val NON_SOURCE_REPEATED_ANNOTATION by error<KtAnnotationEntry>()
|
||||
val REPEATED_ANNOTATION_TARGET6 by error<KtAnnotationEntry>()
|
||||
val REPEATED_ANNOTATION_WITH_CONTAINER by error<KtAnnotationEntry> {
|
||||
parameter<FqName>("name")
|
||||
parameter<FqName>("explicitContainerName")
|
||||
parameter<ClassId>("name")
|
||||
parameter<ClassId>("explicitContainerName")
|
||||
}
|
||||
|
||||
val REPEATABLE_CONTAINER_MUST_HAVE_VALUE_ARRAY by deprecationError<KtAnnotationEntry>(RepeatableAnnotationContainerConstraints) {
|
||||
|
||||
+1
-1
@@ -97,7 +97,7 @@ object FirJvmErrors {
|
||||
// Repeatable Annotations
|
||||
val NON_SOURCE_REPEATED_ANNOTATION by error0<KtAnnotationEntry>()
|
||||
val REPEATED_ANNOTATION_TARGET6 by error0<KtAnnotationEntry>()
|
||||
val REPEATED_ANNOTATION_WITH_CONTAINER by error2<KtAnnotationEntry, FqName, FqName>()
|
||||
val REPEATED_ANNOTATION_WITH_CONTAINER by error2<KtAnnotationEntry, ClassId, ClassId>()
|
||||
val REPEATABLE_CONTAINER_MUST_HAVE_VALUE_ARRAY by deprecationError2<KtAnnotationEntry, ClassId, ClassId>(RepeatableAnnotationContainerConstraints)
|
||||
val REPEATABLE_CONTAINER_HAS_NON_DEFAULT_PARAMETER by deprecationError2<KtAnnotationEntry, ClassId, Name>(RepeatableAnnotationContainerConstraints)
|
||||
val REPEATABLE_CONTAINER_HAS_SHORTER_RETENTION by deprecationError4<KtAnnotationEntry, ClassId, String, ClassId, String>(RepeatableAnnotationContainerConstraints)
|
||||
|
||||
+4
-4
@@ -28,8 +28,8 @@ import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenFunctions
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirClassUseSiteMemberScope
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionCallableSymbol
|
||||
import org.jetbrains.kotlin.name.JvmNames.JVM_DEFAULT_FQ_NAME
|
||||
import org.jetbrains.kotlin.name.JvmNames.JVM_DEFAULT_NO_COMPATIBILITY_FQ_NAME
|
||||
import org.jetbrains.kotlin.name.JvmNames.JVM_DEFAULT_CLASS_ID
|
||||
import org.jetbrains.kotlin.name.JvmNames.JVM_DEFAULT_NO_COMPATIBILITY_CLASS_ID
|
||||
|
||||
object FirJvmDefaultChecker : FirBasicDeclarationChecker() {
|
||||
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
@@ -53,7 +53,7 @@ object FirJvmDefaultChecker : FirBasicDeclarationChecker() {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
val annotation = declaration.getAnnotationByFqName(JVM_DEFAULT_NO_COMPATIBILITY_FQ_NAME)
|
||||
val annotation = declaration.getAnnotationByClassId(JVM_DEFAULT_NO_COMPATIBILITY_CLASS_ID)
|
||||
if (annotation != null) {
|
||||
if (isJvm6) {
|
||||
reporter.reportOn(
|
||||
@@ -140,7 +140,7 @@ object FirJvmDefaultChecker : FirBasicDeclarationChecker() {
|
||||
unsubstitutedScope.processFunctionsByName(member.name) {}
|
||||
val overriddenFunctions = unsubstitutedScope.getDirectOverriddenFunctions(member.symbol)
|
||||
|
||||
if (overriddenFunctions.any { it.getAnnotationByFqName(JVM_DEFAULT_FQ_NAME) != null }) {
|
||||
if (overriddenFunctions.any { it.getAnnotationByClassId(JVM_DEFAULT_CLASS_ID) != null }) {
|
||||
reporter.reportOn(declaration.source, FirJvmErrors.JVM_DEFAULT_REQUIRED_FOR_OVERRIDE, context)
|
||||
} else if (jvmDefaultMode.isEnabled) {
|
||||
for (overriddenFunction in overriddenFunctions) {
|
||||
|
||||
+3
-6
@@ -20,10 +20,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.containingClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByFqName
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||
import org.jetbrains.kotlin.fir.languageVersionSettings
|
||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
@@ -40,7 +37,7 @@ import org.jetbrains.kotlin.psi.stubs.elements.KtParameterElementType
|
||||
|
||||
object FirJvmFieldApplicabilityChecker : FirPropertyChecker() {
|
||||
override fun check(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
val annotation = declaration.getAnnotationByFqName(JVM_FIELD_ANNOTATION_FQ_NAME) ?: return
|
||||
val annotation = declaration.getAnnotationByClassId(JVM_FIELD_ANNOTATION_CLASS_ID) ?: return
|
||||
val session = context.session
|
||||
val containingClass = declaration.containingClass()?.toFirRegularClass(session)
|
||||
|
||||
@@ -126,7 +123,7 @@ object FirJvmFieldApplicabilityChecker : FirPropertyChecker() {
|
||||
}
|
||||
|
||||
private fun FirPropertySymbol.hasJvmFieldAnnotation(): Boolean {
|
||||
return getAnnotationByFqName(JVM_FIELD_ANNOTATION_FQ_NAME) != null
|
||||
return getAnnotationByClassId(JVM_FIELD_ANNOTATION_CLASS_ID) != null
|
||||
}
|
||||
|
||||
private fun isInsideJvmMultifileClassFile(context: CheckerContext): Boolean {
|
||||
|
||||
+3
-6
@@ -16,10 +16,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.declarations.FirField
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByFqName
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||
import org.jetbrains.kotlin.fir.languageVersionSettings
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
@@ -27,7 +24,7 @@ import org.jetbrains.kotlin.fir.types.classId
|
||||
import org.jetbrains.kotlin.fir.types.coneType
|
||||
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.JvmNames.JVM_RECORD_ANNOTATION_FQ_NAME
|
||||
import org.jetbrains.kotlin.name.JvmNames.JVM_RECORD_ANNOTATION_CLASS_ID
|
||||
|
||||
object FirJvmRecordChecker : FirRegularClassChecker() {
|
||||
private val JAVA_RECORD_CLASS_ID = ClassId.fromString("java/lang/Record")
|
||||
@@ -40,7 +37,7 @@ object FirJvmRecordChecker : FirRegularClassChecker() {
|
||||
}
|
||||
}
|
||||
|
||||
val annotationSource = declaration.getAnnotationByFqName(JVM_RECORD_ANNOTATION_FQ_NAME)?.source ?: return
|
||||
val annotationSource = declaration.getAnnotationByClassId(JVM_RECORD_ANNOTATION_CLASS_ID)?.source ?: return
|
||||
|
||||
val languageVersionSettings = context.session.languageVersionSettings
|
||||
if (!languageVersionSettings.supportsFeature(LanguageFeature.JvmRecordSupport)) {
|
||||
|
||||
+3
-3
@@ -12,12 +12,12 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByFqName
|
||||
import org.jetbrains.kotlin.name.JvmNames.JVM_SYNTHETIC_ANNOTATION_FQ_NAME
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
|
||||
import org.jetbrains.kotlin.name.JvmNames.JVM_SYNTHETIC_ANNOTATION_CLASS_ID
|
||||
|
||||
object FirJvmSyntheticApplicabilityChecker : FirPropertyChecker() {
|
||||
override fun check(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
val annotation = declaration.delegateFieldSymbol?.getAnnotationByFqName(JVM_SYNTHETIC_ANNOTATION_FQ_NAME)
|
||||
val annotation = declaration.delegateFieldSymbol?.getAnnotationByClassId(JVM_SYNTHETIC_ANNOTATION_CLASS_ID)
|
||||
if (annotation != null && annotation.useSiteTarget == AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD) {
|
||||
reporter.reportOn(annotation.source, FirJvmErrors.JVM_SYNTHETIC_ON_DELEGATE, context)
|
||||
}
|
||||
|
||||
+3
-4
@@ -17,18 +17,17 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByFqName
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isAbstract
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isActual
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.isLocalClassOrAnonymousObject
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.JvmNames.JVM_OVERLOADS_FQ_NAME
|
||||
import org.jetbrains.kotlin.name.JvmNames.JVM_OVERLOADS_CLASS_ID
|
||||
|
||||
object FirOverloadsChecker : FirFunctionChecker() {
|
||||
override fun check(declaration: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
val annotation = declaration.getAnnotationByFqName(JVM_OVERLOADS_FQ_NAME) ?: return
|
||||
val annotation = declaration.getAnnotationByClassId(JVM_OVERLOADS_CLASS_ID) ?: return
|
||||
//todo need to have expect declaration here to check if it has default values
|
||||
if (declaration.isActual) return
|
||||
|
||||
|
||||
+7
-9
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.languageVersionSettings
|
||||
import org.jetbrains.kotlin.fir.resolve.defaultType
|
||||
import org.jetbrains.kotlin.fir.resolve.fqName
|
||||
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.getSingleClassifier
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
@@ -33,7 +32,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
object FirRepeatableAnnotationChecker : FirAnnotatedDeclarationChecker() {
|
||||
@@ -68,11 +66,11 @@ object FirRepeatableAnnotationChecker : FirAnnotatedDeclarationChecker() {
|
||||
// on the same element.
|
||||
// See https://docs.oracle.com/javase/specs/jls/se16/html/jls-9.html#jls-9.7.5.
|
||||
val explicitContainer = annotationClass.resolveContainerAnnotation()
|
||||
if (explicitContainer != null && annotations.any { it.fqName(session) == explicitContainer }) {
|
||||
if (explicitContainer != null && annotations.any { it.classId == explicitContainer }) {
|
||||
reporter.reportOn(
|
||||
annotation.source,
|
||||
FirJvmErrors.REPEATED_ANNOTATION_WITH_CONTAINER,
|
||||
fqName,
|
||||
classId,
|
||||
explicitContainer,
|
||||
context
|
||||
)
|
||||
@@ -86,13 +84,13 @@ object FirRepeatableAnnotationChecker : FirAnnotatedDeclarationChecker() {
|
||||
}
|
||||
|
||||
if (declaration is FirRegularClass) {
|
||||
val javaRepeatable = annotations.find { it.fqName(session) == JAVA_REPEATABLE_ANNOTATION }
|
||||
val javaRepeatable = annotations.find { it.classId == JAVA_REPEATABLE_ANNOTATION }
|
||||
if (javaRepeatable != null) {
|
||||
withSuppressedDiagnostics(javaRepeatable, context) {
|
||||
checkJavaRepeatableAnnotationDeclaration(javaRepeatable, declaration, context, reporter)
|
||||
}
|
||||
} else {
|
||||
val kotlinRepeatable = annotations.find { it.fqName(session) == StandardNames.FqNames.repeatable }
|
||||
val kotlinRepeatable = annotations.find { it.classId == StandardNames.FqNames.repeatableClassId }
|
||||
if (kotlinRepeatable != null) {
|
||||
withSuppressedDiagnostics(kotlinRepeatable, context) {
|
||||
checkKotlinRepeatableAnnotationDeclaration(kotlinRepeatable, declaration, context, reporter)
|
||||
@@ -102,10 +100,10 @@ object FirRepeatableAnnotationChecker : FirAnnotatedDeclarationChecker() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirClassLikeSymbol<*>.resolveContainerAnnotation(): FqName? {
|
||||
private fun FirClassLikeSymbol<*>.resolveContainerAnnotation(): ClassId? {
|
||||
val repeatableAnnotation =
|
||||
getAnnotationByFqName(StandardNames.FqNames.repeatable) ?: getAnnotationByFqName(JAVA_REPEATABLE_ANNOTATION) ?: return null
|
||||
return repeatableAnnotation.resolveContainerAnnotation()?.asSingleFqName()
|
||||
getAnnotationByClassId(StandardNames.FqNames.repeatableClassId) ?: getAnnotationByClassId(JAVA_REPEATABLE_ANNOTATION) ?: return null
|
||||
return repeatableAnnotation.resolveContainerAnnotation()
|
||||
}
|
||||
|
||||
private fun FirAnnotationCall.resolveContainerAnnotation(): ClassId? {
|
||||
|
||||
+3
-4
@@ -11,13 +11,12 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByFqName
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.JvmNames.STRICTFP_ANNOTATION_FQ_NAME
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
|
||||
import org.jetbrains.kotlin.name.JvmNames.STRICTFP_ANNOTATION_CLASS_ID
|
||||
|
||||
object FirStrictfpApplicabilityChecker : FirClassChecker() {
|
||||
override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
val annotation = declaration.getAnnotationByFqName(STRICTFP_ANNOTATION_FQ_NAME) ?: return
|
||||
val annotation = declaration.getAnnotationByClassId(STRICTFP_ANNOTATION_CLASS_ID) ?: return
|
||||
reporter.reportOn(annotation.source, FirJvmErrors.STRICTFP_ON_CLASS, context)
|
||||
}
|
||||
}
|
||||
+3
-4
@@ -14,15 +14,14 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByFqName
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isAbstract
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isInline
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.JvmNames.SYNCHRONIZED_ANNOTATION_FQ_NAME
|
||||
import org.jetbrains.kotlin.name.JvmNames.SYNCHRONIZED_ANNOTATION_CLASS_ID
|
||||
|
||||
object FirSynchronizedAnnotationChecker : FirFunctionChecker() {
|
||||
override fun check(declaration: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
val annotation = declaration.getAnnotationByFqName(SYNCHRONIZED_ANNOTATION_FQ_NAME) ?: return
|
||||
val annotation = declaration.getAnnotationByClassId(SYNCHRONIZED_ANNOTATION_CLASS_ID) ?: return
|
||||
|
||||
if (declaration.isInline) {
|
||||
reporter.reportOn(annotation.source, FirJvmErrors.SYNCHRONIZED_ON_INLINE, context)
|
||||
|
||||
+4
-4
@@ -12,19 +12,19 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByFqName
|
||||
import org.jetbrains.kotlin.name.JvmNames.VOLATILE_ANNOTATION_FQ_NAME
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
|
||||
import org.jetbrains.kotlin.name.JvmNames.VOLATILE_ANNOTATION_CLASS_ID
|
||||
|
||||
object FirVolatileAnnotationChecker : FirPropertyChecker() {
|
||||
override fun check(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
if (declaration.source?.kind != FirRealSourceElementKind) return
|
||||
|
||||
val fieldAnnotation = declaration.backingFieldSymbol.getAnnotationByFqName(VOLATILE_ANNOTATION_FQ_NAME)
|
||||
val fieldAnnotation = declaration.backingFieldSymbol.getAnnotationByClassId(VOLATILE_ANNOTATION_CLASS_ID)
|
||||
if (fieldAnnotation != null && !declaration.isVar) {
|
||||
reporter.reportOn(fieldAnnotation.source, FirJvmErrors.VOLATILE_ON_VALUE, context)
|
||||
}
|
||||
|
||||
val delegateAnnotation = declaration.delegateFieldSymbol?.getAnnotationByFqName(VOLATILE_ANNOTATION_FQ_NAME)
|
||||
val delegateAnnotation = declaration.delegateFieldSymbol?.getAnnotationByClassId(VOLATILE_ANNOTATION_CLASS_ID)
|
||||
if (delegateAnnotation != null) {
|
||||
reporter.reportOn(delegateAnnotation.source, FirJvmErrors.VOLATILE_ON_DELEGATE, context)
|
||||
}
|
||||
|
||||
+8
-7
@@ -16,23 +16,24 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
|
||||
object FirDeprecatedJavaAnnotationsChecker : FirAnnotationCallChecker() {
|
||||
|
||||
private val javaToKotlinNameMap: Map<FqName, FqName> =
|
||||
private val javaToKotlinNameMap: Map<ClassId, FqName> =
|
||||
mapOf(
|
||||
JvmAnnotationNames.TARGET_ANNOTATION to StandardNames.FqNames.target,
|
||||
JvmAnnotationNames.RETENTION_ANNOTATION to StandardNames.FqNames.retention,
|
||||
JvmAnnotationNames.DEPRECATED_ANNOTATION to StandardNames.FqNames.deprecated,
|
||||
JvmAnnotationNames.DOCUMENTED_ANNOTATION to StandardNames.FqNames.mustBeDocumented
|
||||
ClassId.topLevel(JvmAnnotationNames.TARGET_ANNOTATION) to StandardNames.FqNames.target,
|
||||
ClassId.topLevel(JvmAnnotationNames.RETENTION_ANNOTATION) to StandardNames.FqNames.retention,
|
||||
ClassId.topLevel(JvmAnnotationNames.DEPRECATED_ANNOTATION) to StandardNames.FqNames.deprecated,
|
||||
ClassId.topLevel(JvmAnnotationNames.DOCUMENTED_ANNOTATION) to StandardNames.FqNames.mustBeDocumented
|
||||
)
|
||||
|
||||
override fun check(expression: FirAnnotationCall, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
if (context.containingDeclarations.lastOrNull()?.source?.kind != FirRealSourceElementKind) return
|
||||
|
||||
|
||||
val lookupTag = expression.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag ?: return
|
||||
javaToKotlinNameMap[lookupTag.classId.asSingleFqName()]?.let { betterName ->
|
||||
javaToKotlinNameMap[lookupTag.classId]?.let { betterName ->
|
||||
reporter.reportOn(expression.source, FirJvmErrors.DEPRECATED_JAVA_ANNOTATION, betterName, context)
|
||||
}
|
||||
}
|
||||
|
||||
+4
-10
@@ -81,21 +81,15 @@ fun FirClassLikeSymbol<*>.getAllowedAnnotationTargets(): Set<KotlinTarget> {
|
||||
}
|
||||
|
||||
fun FirAnnotatedDeclaration.getRetentionAnnotation(): FirAnnotationCall? {
|
||||
return getAnnotationByFqName(StandardNames.FqNames.retention)
|
||||
return getAnnotationByClassId(StandardNames.FqNames.retentionClassId)
|
||||
}
|
||||
|
||||
fun FirAnnotatedDeclaration.getTargetAnnotation(): FirAnnotationCall? {
|
||||
return getAnnotationByFqName(StandardNames.FqNames.target)
|
||||
return getAnnotationByClassId(StandardNames.FqNames.targetClassId)
|
||||
}
|
||||
|
||||
fun FirClassLikeSymbol<*>.getTargetAnnotation(): FirAnnotationCall? {
|
||||
return getAnnotationByFqName(StandardNames.FqNames.target)
|
||||
}
|
||||
|
||||
fun FirAnnotationContainer.getAnnotationByClassId(classId: ClassId): FirAnnotationCall? {
|
||||
return annotations.find {
|
||||
(it.annotationTypeRef.coneType as? ConeClassLikeType)?.lookupTag?.classId == classId
|
||||
}
|
||||
return getAnnotationByClassId(StandardNames.FqNames.targetClassId)
|
||||
}
|
||||
|
||||
fun FirExpression.extractClassesFromArgument(): List<FirRegularClassSymbol> {
|
||||
@@ -140,7 +134,7 @@ fun FirClassLikeSymbol<*>.containsRepeatableAnnotation(session: FirSession): Boo
|
||||
}
|
||||
|
||||
fun FirClassLikeSymbol<*>.getAnnotationRetention(): AnnotationRetention {
|
||||
return getAnnotationByFqName(StandardNames.FqNames.retention)?.getRetention() ?: AnnotationRetention.RUNTIME
|
||||
return getAnnotationByClassId(StandardNames.FqNames.retentionClassId)?.getRetention() ?: AnnotationRetention.RUNTIME
|
||||
}
|
||||
|
||||
fun FirAnnotationContainer.getDefaultUseSiteTarget(
|
||||
|
||||
+1
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
|
||||
import org.jetbrains.kotlin.resolve.checkers.Experimentality
|
||||
import org.jetbrains.kotlin.resolve.checkers.OptInNames
|
||||
|
||||
|
||||
+1
-1
@@ -8,12 +8,12 @@ package org.jetbrains.kotlin.fir.analysis.checkers.type
|
||||
import org.jetbrains.kotlin.fir.FirRealSourceElementKind
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirOptInUsageBaseChecker
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.getAnnotationByClassId
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPERIMENTAL_CAN_ONLY_BE_USED_AS_ANNOTATION
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPERIMENTAL_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_USE_EXPERIMENTAL
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
||||
|
||||
-1
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
|
||||
|
||||
+12
-2
@@ -94,14 +94,24 @@ fun FirAnnotatedDeclaration.hasAnnotation(classId: ClassId): Boolean {
|
||||
return annotations.any { it.toAnnotationClassId() == classId }
|
||||
}
|
||||
|
||||
fun <D> FirBasedSymbol<out D>.getAnnotationByFqName(fqName: FqName): FirAnnotationCall? where D : FirAnnotationContainer, D : FirDeclaration {
|
||||
return fir.getAnnotationByFqName(fqName)
|
||||
}
|
||||
|
||||
fun <D> FirBasedSymbol<out D>.getAnnotationByClassId(classId: ClassId): FirAnnotationCall? where D : FirAnnotationContainer, D : FirDeclaration {
|
||||
return fir.getAnnotationByClassId(classId)
|
||||
}
|
||||
|
||||
fun FirAnnotationContainer.getAnnotationByFqName(fqName: FqName): FirAnnotationCall? {
|
||||
return annotations.find {
|
||||
it.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag?.classId?.asSingleFqName() == fqName
|
||||
}
|
||||
}
|
||||
|
||||
fun <D> FirBasedSymbol<out D>.getAnnotationByFqName(fqName: FqName): FirAnnotationCall? where D : FirAnnotationContainer, D : FirDeclaration {
|
||||
return fir.getAnnotationByFqName(fqName)
|
||||
fun FirAnnotationContainer.getAnnotationByClassId(classId: ClassId): FirAnnotationCall? {
|
||||
return annotations.find {
|
||||
it.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag?.classId == classId
|
||||
}
|
||||
}
|
||||
|
||||
fun FirAnnotationContainer.getAnnotationsByFqName(fqName: FqName): List<FirAnnotationCall> = annotations.getAnnotationsByFqName(fqName)
|
||||
|
||||
-1
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.caches.*
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
|
||||
+1
-1
@@ -99,7 +99,7 @@ class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: FirKotli
|
||||
state.fileMap.merge(packageName, listOf(file)) { a, b -> a + b }
|
||||
file.acceptChildren(FirRecorder, FirRecorderData(state, file, session.nameConflictsTracker))
|
||||
}
|
||||
|
||||
|
||||
private class FirRecorderData(
|
||||
val state: State,
|
||||
val file: FirFile,
|
||||
|
||||
-1
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.ThreadSafeMutableState
|
||||
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirOuterClassTypeParameterRef
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.classId
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass
|
||||
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.diagnostics.ConeUnexpectedTypeArgumentsError
|
||||
|
||||
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolvedForCalls
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
|
||||
@@ -16,6 +16,8 @@ object JvmAbi {
|
||||
|
||||
@JvmField
|
||||
val JVM_FIELD_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.JvmField")
|
||||
@JvmField
|
||||
val JVM_FIELD_ANNOTATION_CLASS_ID = ClassId.topLevel(JVM_FIELD_ANNOTATION_FQ_NAME)
|
||||
|
||||
/**
|
||||
* Warning: use DEFAULT_IMPLS_CLASS_NAME and TypeMappingConfiguration.innerClassNameFactory when possible.
|
||||
|
||||
@@ -111,10 +111,13 @@ object StandardNames {
|
||||
@JvmField val parameterName: FqName = fqName("ParameterName")
|
||||
@JvmField val annotation: FqName = fqName("Annotation")
|
||||
@JvmField val target: FqName = annotationName("Target")
|
||||
@JvmField val targetClassId: ClassId = ClassId.topLevel(target)
|
||||
@JvmField val annotationTarget: FqName = annotationName("AnnotationTarget")
|
||||
@JvmField val annotationRetention: FqName = annotationName("AnnotationRetention")
|
||||
@JvmField val retention: FqName = annotationName("Retention")
|
||||
@JvmField val retentionClassId: ClassId = ClassId.topLevel(retention)
|
||||
@JvmField val repeatable: FqName = annotationName("Repeatable")
|
||||
@JvmField val repeatableClassId: ClassId = ClassId.topLevel(repeatable)
|
||||
@JvmField val mustBeDocumented: FqName = annotationName("MustBeDocumented")
|
||||
@JvmField val unsafeVariance: FqName = fqName("UnsafeVariance")
|
||||
@JvmField val publishedApi: FqName = fqName("PublishedApi")
|
||||
|
||||
@@ -16,22 +16,42 @@ object JvmNames {
|
||||
val JVM_PACKAGE_NAME_SHORT = JVM_PACKAGE_NAME.shortName().asString()
|
||||
|
||||
val JVM_DEFAULT_FQ_NAME = FqName("kotlin.jvm.JvmDefault")
|
||||
val JVM_DEFAULT_CLASS_ID = ClassId.topLevel(JVM_DEFAULT_FQ_NAME)
|
||||
val JVM_DEFAULT_NO_COMPATIBILITY_FQ_NAME = FqName("kotlin.jvm.JvmDefaultWithoutCompatibility")
|
||||
val JVM_DEFAULT_NO_COMPATIBILITY_CLASS_ID = ClassId.topLevel(JVM_DEFAULT_NO_COMPATIBILITY_FQ_NAME)
|
||||
val JVM_OVERLOADS_FQ_NAME = FqName("kotlin.jvm.JvmOverloads")
|
||||
val JVM_OVERLOADS_CLASS_ID = ClassId.topLevel(JVM_OVERLOADS_FQ_NAME)
|
||||
|
||||
@JvmField
|
||||
val JVM_SYNTHETIC_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.JvmSynthetic")
|
||||
|
||||
@JvmField
|
||||
val JVM_SYNTHETIC_ANNOTATION_CLASS_ID = ClassId.topLevel(JVM_SYNTHETIC_ANNOTATION_FQ_NAME)
|
||||
|
||||
@JvmField
|
||||
val JVM_RECORD_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.JvmRecord")
|
||||
|
||||
@JvmField
|
||||
val JVM_RECORD_ANNOTATION_CLASS_ID = ClassId.topLevel(JVM_RECORD_ANNOTATION_FQ_NAME)
|
||||
|
||||
@JvmField
|
||||
val SYNCHRONIZED_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.Synchronized")
|
||||
|
||||
@JvmField
|
||||
val SYNCHRONIZED_ANNOTATION_CLASS_ID = ClassId.topLevel(SYNCHRONIZED_ANNOTATION_FQ_NAME)
|
||||
|
||||
@JvmField
|
||||
val STRICTFP_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.Strictfp")
|
||||
|
||||
@JvmField
|
||||
val STRICTFP_ANNOTATION_CLASS_ID = ClassId.topLevel(STRICTFP_ANNOTATION_FQ_NAME)
|
||||
|
||||
@JvmField
|
||||
val VOLATILE_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.Volatile")
|
||||
|
||||
@JvmField
|
||||
val VOLATILE_ANNOTATION_CLASS_ID = ClassId.topLevel(VOLATILE_ANNOTATION_FQ_NAME)
|
||||
|
||||
@JvmField
|
||||
val TRANSIENT_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.Transient")
|
||||
|
||||
|
||||
-1
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.fir.realPsi
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.InvalidFirElementTypeException
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.throwUnexpectedFirElementError
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.getNonLocalContainingOrThisDeclaration
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder
|
||||
|
||||
+2
-2
@@ -2651,8 +2651,8 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
||||
|
||||
abstract class RepeatedAnnotationWithContainer : KtFirDiagnostic<KtAnnotationEntry>() {
|
||||
override val diagnosticClass get() = RepeatedAnnotationWithContainer::class
|
||||
abstract val name: FqName
|
||||
abstract val explicitContainerName: FqName
|
||||
abstract val name: ClassId
|
||||
abstract val explicitContainerName: ClassId
|
||||
}
|
||||
|
||||
abstract class RepeatableContainerMustHaveValueArrayError : KtFirDiagnostic<KtAnnotationEntry>() {
|
||||
|
||||
+2
-2
@@ -4310,8 +4310,8 @@ internal class RepeatedAnnotationTarget6Impl(
|
||||
}
|
||||
|
||||
internal class RepeatedAnnotationWithContainerImpl(
|
||||
override val name: FqName,
|
||||
override val explicitContainerName: FqName,
|
||||
override val name: ClassId,
|
||||
override val explicitContainerName: ClassId,
|
||||
firDiagnostic: FirPsiDiagnostic,
|
||||
override val token: ValidityToken,
|
||||
) : KtFirDiagnostic.RepeatedAnnotationWithContainer(), KtAbstractFirDiagnostic<KtAnnotationEntry> {
|
||||
|
||||
-4
@@ -6,16 +6,12 @@
|
||||
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
|
||||
Reference in New Issue
Block a user