[FIR] Fix false negative JVM_STATIC_ON_CONST_OR_JVM_FIELD
... in presence of typealias. #KT-61921
This commit is contained in:
committed by
Space Team
parent
7a65c36bfc
commit
0d279dd652
+8
-7
@@ -13,9 +13,11 @@ import org.jetbrains.kotlin.descriptors.Visibility
|
|||||||
import org.jetbrains.kotlin.descriptors.isInterface
|
import org.jetbrains.kotlin.descriptors.isInterface
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.classKind
|
import org.jetbrains.kotlin.fir.analysis.checkers.classKind
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker
|
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.fullyExpandedClassId
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||||
@@ -24,7 +26,6 @@ import org.jetbrains.kotlin.fir.languageVersionSettings
|
|||||||
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.classId
|
|
||||||
import org.jetbrains.kotlin.fir.types.coneType
|
import org.jetbrains.kotlin.fir.types.coneType
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.SpecialNames
|
import org.jetbrains.kotlin.name.SpecialNames
|
||||||
@@ -41,7 +42,7 @@ object FirJvmStaticChecker : FirBasicDeclarationChecker() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val declarationAnnotation = declaration.findAnnotation(StandardClassIds.Annotations.JvmStatic)
|
val declarationAnnotation = declaration.findAnnotation(StandardClassIds.Annotations.JvmStatic, context.session)
|
||||||
|
|
||||||
if (declarationAnnotation != null) {
|
if (declarationAnnotation != null) {
|
||||||
checkAnnotated(declaration, context, reporter, declaration.source)
|
checkAnnotated(declaration, context, reporter, declaration.source)
|
||||||
@@ -200,7 +201,7 @@ object FirJvmStaticChecker : FirBasicDeclarationChecker() {
|
|||||||
targetSource: KtSourceElement?,
|
targetSource: KtSourceElement?,
|
||||||
) {
|
) {
|
||||||
if (declaration !is FirProperty) return
|
if (declaration !is FirProperty) return
|
||||||
if (declaration.isConst || declaration.backingField?.hasAnnotationNamedAs(StandardClassIds.Annotations.JvmField) == true) {
|
if (declaration.isConst || declaration.backingField?.hasAnnotationNamedAs(StandardClassIds.Annotations.JvmField, context.session) == true) {
|
||||||
reporter.reportOn(targetSource, FirJvmErrors.JVM_STATIC_ON_CONST_OR_JVM_FIELD, context)
|
reporter.reportOn(targetSource, FirJvmErrors.JVM_STATIC_ON_CONST_OR_JVM_FIELD, context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -236,13 +237,13 @@ object FirJvmStaticChecker : FirBasicDeclarationChecker() {
|
|||||||
|
|
||||||
private fun FirClassLikeSymbol<*>.isCompanion() = (this as? FirRegularClassSymbol)?.isCompanion == true
|
private fun FirClassLikeSymbol<*>.isCompanion() = (this as? FirRegularClassSymbol)?.isCompanion == true
|
||||||
|
|
||||||
private fun FirDeclaration.hasAnnotationNamedAs(classId: ClassId): Boolean {
|
private fun FirDeclaration.hasAnnotationNamedAs(classId: ClassId, session: FirSession): Boolean {
|
||||||
return findAnnotation(classId) != null
|
return findAnnotation(classId, session) != null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FirDeclaration.findAnnotation(classId: ClassId): FirAnnotation? {
|
private fun FirDeclaration.findAnnotation(classId: ClassId, session: FirSession): FirAnnotation? {
|
||||||
return annotations.firstOrNull {
|
return annotations.firstOrNull {
|
||||||
it.annotationTypeRef.coneType.classId == classId
|
it.annotationTypeRef.coneType.fullyExpandedClassId(session) == classId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+8
@@ -17,3 +17,11 @@ object B {
|
|||||||
|
|
||||||
<!JVM_STATIC_ON_CONST_OR_JVM_FIELD!>@JvmStatic @JvmField val x<!> = 1;
|
<!JVM_STATIC_ON_CONST_OR_JVM_FIELD!>@JvmStatic @JvmField val x<!> = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typealias TAStatic = JvmStatic
|
||||||
|
|
||||||
|
object C {
|
||||||
|
<!JVM_STATIC_ON_CONST_OR_JVM_FIELD!>@TAStatic const val z<!> = 1;
|
||||||
|
|
||||||
|
<!JVM_STATIC_ON_CONST_OR_JVM_FIELD!>@TAStatic @JvmField val x<!> = 1;
|
||||||
|
}
|
||||||
|
|||||||
Vendored
-26
@@ -1,26 +0,0 @@
|
|||||||
package
|
|
||||||
|
|
||||||
public final class A {
|
|
||||||
public constructor A()
|
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
|
||||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
|
||||||
|
|
||||||
public companion object Companion {
|
|
||||||
private constructor Companion()
|
|
||||||
@kotlin.jvm.JvmStatic @field:kotlin.jvm.JvmField public final val x: kotlin.Int = 1
|
|
||||||
@kotlin.jvm.JvmStatic public const final val z: kotlin.Int = 1
|
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
|
||||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public object B {
|
|
||||||
private constructor B()
|
|
||||||
@kotlin.jvm.JvmStatic @field:kotlin.jvm.JvmField public final val x: kotlin.Int = 1
|
|
||||||
@kotlin.jvm.JvmStatic public const final val z: kotlin.Int = 1
|
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
|
||||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user