[FIR] Add support for JVM_STATIC_ON_CONST_OR_JVM_FIELD diagnostic
This commit is contained in:
+1
@@ -25,6 +25,7 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") {
|
||||
val JVM_STATIC_NOT_IN_OBJECT_OR_CLASS_COMPANION by error<PsiElement>(PositioningStrategy.DECLARATION_SIGNATURE)
|
||||
val JVM_STATIC_NOT_IN_OBJECT_OR_COMPANION by error<PsiElement>(PositioningStrategy.DECLARATION_SIGNATURE)
|
||||
val JVM_STATIC_ON_NON_PUBLIC_MEMBER by error<PsiElement>(PositioningStrategy.DECLARATION_SIGNATURE)
|
||||
val JVM_STATIC_ON_CONST_OR_JVM_FIELD by error<PsiElement>(PositioningStrategy.DECLARATION_SIGNATURE)
|
||||
|
||||
val INAPPLICABLE_JVM_NAME by error<PsiElement>()
|
||||
val ILLEGAL_JVM_NAME by error<PsiElement>()
|
||||
|
||||
+1
@@ -26,6 +26,7 @@ object FirJvmErrors {
|
||||
val JVM_STATIC_NOT_IN_OBJECT_OR_CLASS_COMPANION by error0<PsiElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
||||
val JVM_STATIC_NOT_IN_OBJECT_OR_COMPANION by error0<PsiElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
||||
val JVM_STATIC_ON_NON_PUBLIC_MEMBER by error0<PsiElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
||||
val JVM_STATIC_ON_CONST_OR_JVM_FIELD by error0<PsiElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
||||
val INAPPLICABLE_JVM_NAME by error0<PsiElement>()
|
||||
val ILLEGAL_JVM_NAME by error0<PsiElement>()
|
||||
|
||||
|
||||
+17
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isConst
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isOverride
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
@@ -51,6 +52,22 @@ object FirJvmStaticChecker : FirBasicDeclarationChecker() {
|
||||
checkOverrideCannotBeStatic(declaration, context, reporter, annotatedParts)
|
||||
checkStaticNotInProperObject(context, reporter, annotatedParts)
|
||||
checkStaticNonPublic(declaration, context, reporter, annotatedParts)
|
||||
checkStaticOnConstOrJvmField(context, reporter, annotatedParts)
|
||||
}
|
||||
|
||||
private fun checkStaticOnConstOrJvmField(
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter,
|
||||
annotatedParts: List<FirAnnotatedDeclaration>,
|
||||
) {
|
||||
annotatedParts.forEach {
|
||||
if (
|
||||
it is FirProperty && it.isConst ||
|
||||
it.hasAnnotationNamedAs(StandardClassIds.JvmField)
|
||||
) {
|
||||
reporter.reportOn(it.source, FirJvmErrors.JVM_STATIC_ON_CONST_OR_JVM_FIELD, context)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkStaticNonPublic(
|
||||
|
||||
+5
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_RECORD
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_STATIC_NOT_IN_OBJECT_OR_CLASS_COMPANION
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_STATIC_NOT_IN_OBJECT_OR_COMPANION
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_STATIC_ON_CONST_OR_JVM_FIELD
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_STATIC_ON_NON_PUBLIC_MEMBER
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.LOCAL_JVM_RECORD
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.NON_DATA_CLASS_JVM_RECORD
|
||||
@@ -113,6 +114,10 @@ object FirJvmDefaultErrorMessages {
|
||||
JVM_STATIC_ON_NON_PUBLIC_MEMBER,
|
||||
"Only public members in interface companion objects can be annotated with '@JvmStatic'"
|
||||
)
|
||||
map.put(
|
||||
JVM_STATIC_ON_CONST_OR_JVM_FIELD,
|
||||
"'@JvmStatic' annotation is useless for const or '@JvmField' properties",
|
||||
)
|
||||
|
||||
map.put(INAPPLICABLE_JVM_NAME, "'@JvmName' annotation is not applicable to this declaration")
|
||||
map.put(ILLEGAL_JVM_NAME, "Illegal JVM name")
|
||||
|
||||
Vendored
-18
@@ -1,18 +0,0 @@
|
||||
class A {
|
||||
|
||||
companion object {
|
||||
|
||||
@JvmStatic const val z = 1;
|
||||
|
||||
@JvmStatic @JvmField val x = 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
object B {
|
||||
|
||||
@JvmStatic const val z = 1;
|
||||
|
||||
@JvmStatic @JvmField val x = 1;
|
||||
}
|
||||
Vendored
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
class A {
|
||||
|
||||
companion object {
|
||||
|
||||
@@ -119,6 +119,7 @@ object StandardClassIds {
|
||||
|
||||
val JvmStatic = "JvmStatic".jvmId()
|
||||
val JvmName = "JvmName".jvmId()
|
||||
val JvmField = "JvmField".jvmId()
|
||||
|
||||
val Result = "Result".baseId()
|
||||
}
|
||||
|
||||
+6
@@ -3688,6 +3688,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
||||
token,
|
||||
)
|
||||
}
|
||||
add(FirJvmErrors.JVM_STATIC_ON_CONST_OR_JVM_FIELD) { firDiagnostic ->
|
||||
JvmStaticOnConstOrJvmFieldImpl(
|
||||
firDiagnostic as FirPsiDiagnostic,
|
||||
token,
|
||||
)
|
||||
}
|
||||
add(FirJvmErrors.INAPPLICABLE_JVM_NAME) { firDiagnostic ->
|
||||
InapplicableJvmNameImpl(
|
||||
firDiagnostic as FirPsiDiagnostic,
|
||||
|
||||
+4
@@ -2566,6 +2566,10 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
||||
override val diagnosticClass get() = JvmStaticOnNonPublicMember::class
|
||||
}
|
||||
|
||||
abstract class JvmStaticOnConstOrJvmField : KtFirDiagnostic<PsiElement>() {
|
||||
override val diagnosticClass get() = JvmStaticOnConstOrJvmField::class
|
||||
}
|
||||
|
||||
abstract class InapplicableJvmName : KtFirDiagnostic<PsiElement>() {
|
||||
override val diagnosticClass get() = InapplicableJvmName::class
|
||||
}
|
||||
|
||||
+7
@@ -4166,6 +4166,13 @@ internal class JvmStaticOnNonPublicMemberImpl(
|
||||
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
internal class JvmStaticOnConstOrJvmFieldImpl(
|
||||
firDiagnostic: FirPsiDiagnostic,
|
||||
override val token: ValidityToken,
|
||||
) : KtFirDiagnostic.JvmStaticOnConstOrJvmField(), KtAbstractFirDiagnostic<PsiElement> {
|
||||
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
internal class InapplicableJvmNameImpl(
|
||||
firDiagnostic: FirPsiDiagnostic,
|
||||
override val token: ValidityToken,
|
||||
|
||||
Reference in New Issue
Block a user