From c2e55837807b43673f5ae0b1f364e440a55a8a1c Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Thu, 29 Jul 2021 16:03:03 +0300 Subject: [PATCH] [FIR] Add support for JVM_STATIC_NOT_IN_OBJECT_OR_COMPANION diagnostic --- .../diagnostics/FirJvmDiagnosticsList.kt | 2 + .../analysis/diagnostics/jvm/FirJvmErrors.kt | 2 + .../declaration/FirJvmStaticChecker.kt | 94 ++++++++++++++----- .../diagnostics/FirJvmDefaultErrorMessages.kt | 10 ++ .../annotationsOnUseSiteTargets.fir.kt | 4 +- .../jvmStatic/constructorProperty.fir.kt | 4 - .../jvmStatic/constructorProperty.kt | 1 + .../jvmStatic/constructorProperty_LL13.fir.kt | 4 - .../jvmStatic/constructorProperty_LL13.kt | 1 + .../annotations/jvmStatic/functions.fir.kt | 6 +- .../jvmStatic/functions_LL13.fir.kt | 6 +- .../annotations/jvmStatic/property.fir.kt | 4 +- .../jvmStatic/property_LL13.fir.kt | 4 +- .../jetbrains/kotlin/name/StandardClassIds.kt | 1 + gradle.properties | 1 - .../diagnostics/KtFirDataClassConverters.kt | 12 +++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 8 ++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 14 +++ .../resolve/KSerializerDescriptorResolver.kt | 8 +- 19 files changed, 138 insertions(+), 48 deletions(-) delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty.fir.kt delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty_LL13.fir.kt diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt index 790bb4ea130..150913eaa19 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt @@ -22,6 +22,8 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { val CONFLICTING_JVM_DECLARATIONS by error() val OVERRIDE_CANNOT_BE_STATIC by error() + val JVM_STATIC_NOT_IN_OBJECT_OR_CLASS_COMPANION by error(PositioningStrategy.DECLARATION_SIGNATURE) + val JVM_STATIC_NOT_IN_OBJECT_OR_COMPANION by error(PositioningStrategy.DECLARATION_SIGNATURE) val INAPPLICABLE_JVM_NAME by error() val ILLEGAL_JVM_NAME by error() diff --git a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt index 3a3e61e0063..78cb3842148 100644 --- a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt +++ b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt @@ -23,6 +23,8 @@ object FirJvmErrors { // Declarations val CONFLICTING_JVM_DECLARATIONS by error0() val OVERRIDE_CANNOT_BE_STATIC by error0() + val JVM_STATIC_NOT_IN_OBJECT_OR_CLASS_COMPANION by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) + val JVM_STATIC_NOT_IN_OBJECT_OR_COMPANION by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val INAPPLICABLE_JVM_NAME by error0() val ILLEGAL_JVM_NAME by error0() diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmStaticChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmStaticChecker.kt index a864d50d3ba..a81d503690f 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmStaticChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmStaticChecker.kt @@ -5,7 +5,10 @@ package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.isInterface +import org.jetbrains.kotlin.fir.analysis.checkers.classKind 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.getContainingClassSymbol @@ -13,41 +16,90 @@ 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.* -import org.jetbrains.kotlin.fir.declarations.utils.* +import org.jetbrains.kotlin.fir.declarations.utils.isCompanion +import org.jetbrains.kotlin.fir.declarations.utils.isOverride import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.symbols.SymbolInternals +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.utils.addToStdlib.safeAs object FirJvmStaticChecker : FirBasicDeclarationChecker() { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { + if (declaration is FirConstructor) { + // WRONG_DECLARATION_TARGET + return + } + + checkOverrideCannotBeStatic(declaration, context, reporter) + checkStaticNotInProperObject(declaration, context, reporter) + } + + private fun checkStaticNotInProperObject(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { if (declaration !is FirCallableDeclaration) { return } - if (!declaration.isOverride || !declaration.isContainerNotCompanionObject(context)) { + val containingClassSymbol = declaration.getContainingClassSymbol(context.session) ?: return + val supportJvmStaticInInterface = context.session.languageVersionSettings.supportsFeature(LanguageFeature.JvmStaticInInterface) + + val properDiagnostic = if (supportJvmStaticInInterface) { + FirJvmErrors.JVM_STATIC_NOT_IN_OBJECT_OR_COMPANION + } else { + FirJvmErrors.JVM_STATIC_NOT_IN_OBJECT_OR_CLASS_COMPANION + } + + var shouldReport = false + + if (containingClassSymbol.classKind != ClassKind.OBJECT) { + shouldReport = true + } else { + val declaringClassSymbol = containingClassSymbol.getContainingClassSymbol(context.session) ?: return + + if (declaringClassSymbol.classKind?.isInterface == true && !supportJvmStaticInInterface) { + shouldReport = true + } + } + + if (!shouldReport) { return } - if (declaration is FirProperty) { - declaration.getter?.let { - reportIfHasJvmStatic(it, context, reporter) + declaration.reportOnProperParts { + if (it.hasAnnotationNamedAs(StandardClassIds.JvmStatic)) { + reporter.reportOn(it.source, properDiagnostic, context) } - declaration.setter?.let { - reportIfHasJvmStatic(it, context, reporter) - } - } - - reportIfHasJvmStatic(declaration, context, reporter) - } - - private fun reportIfHasJvmStatic(declaration: FirAnnotatedDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { - if (declaration.hasJvmStaticAnnotation()) { - reporter.reportOn(declaration.source, FirJvmErrors.OVERRIDE_CANNOT_BE_STATIC, context) } } - private fun FirDeclaration.isContainerNotCompanionObject(context: CheckerContext): Boolean { + private fun checkOverrideCannotBeStatic(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { + if (declaration !is FirCallableDeclaration) { + return + } + + if (!declaration.isOverride || !declaration.isContainerNonCompanionObject(context)) { + return + } + + declaration.reportOnProperParts { + if (it.hasAnnotationNamedAs(StandardClassIds.JvmStatic)) { + reporter.reportOn(it.source, FirJvmErrors.OVERRIDE_CANNOT_BE_STATIC, context) + } + } + } + + private fun FirAnnotatedDeclaration.reportOnProperParts(report: (FirAnnotatedDeclaration) -> Unit) { + if (this is FirProperty) { + // the setter is visited separately + this.getter?.let(report) + } + report(this) + } + + private fun FirDeclaration.isContainerNonCompanionObject(context: CheckerContext): Boolean { val containingClassSymbol = this.getContainingClassSymbol(context.session) ?: return false @OptIn(SymbolInternals::class) @@ -56,13 +108,13 @@ object FirJvmStaticChecker : FirBasicDeclarationChecker() { return containingClass.classKind == ClassKind.OBJECT && !containingClass.isCompanion } - private fun FirAnnotatedDeclaration.hasJvmStaticAnnotation(): Boolean { - return findJvmStaticAnnotation() != null + private fun FirAnnotatedDeclaration.hasAnnotationNamedAs(classId: ClassId): Boolean { + return findAnnotation(classId.shortClassName) != null } - private fun FirAnnotatedDeclaration.findJvmStaticAnnotation(): FirAnnotationCall? { + private fun FirAnnotatedDeclaration.findAnnotation(name: Name): FirAnnotationCall? { return annotations.firstOrNull { - it.calleeReference.safeAs()?.name?.toString() == "JvmStatic" + it.calleeReference.safeAs()?.name == name } } } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/diagnostics/FirJvmDefaultErrorMessages.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/diagnostics/FirJvmDefaultErrorMessages.kt index f75c45b245c..bf3cd7b7493 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/diagnostics/FirJvmDefaultErrorMessages.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/diagnostics/FirJvmDefaultErrorMessages.kt @@ -25,6 +25,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_RECORD import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_RECORD_NOT_LAST_VARARG_PARAMETER import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_RECORD_NOT_VAL_PARAMETER 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.LOCAL_JVM_RECORD import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.NON_DATA_CLASS_JVM_RECORD import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.NON_FINAL_JVM_RECORD @@ -98,6 +100,14 @@ object FirJvmDefaultErrorMessages { map.put(ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE, "Classes cannot have explicit 'java.lang.Record' supertype") map.put(OVERRIDE_CANNOT_BE_STATIC, "Override member cannot be '@JvmStatic' in object") + map.put( + JVM_STATIC_NOT_IN_OBJECT_OR_CLASS_COMPANION, + "Only members in named objects and companion objects of classes can be annotated with '@JvmStatic'" + ) + map.put( + JVM_STATIC_NOT_IN_OBJECT_OR_COMPANION, + "Only members in named objects and companion objects can be annotated with '@JvmStatic'" + ) map.put(INAPPLICABLE_JVM_NAME, "'@JvmName' annotation is not applicable to this declaration") map.put(ILLEGAL_JVM_NAME, "Illegal JVM name") diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/annotationsOnUseSiteTargets.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/annotationsOnUseSiteTargets.fir.kt index 9221bd6262a..d1c2b203b04 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/annotationsOnUseSiteTargets.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/annotationsOnUseSiteTargets.fir.kt @@ -1,6 +1,6 @@ interface Test { - @get:JvmStatic - val a: Int + @get:JvmStatic + val a: Int @get:JvmName("1") val b: Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty.fir.kt deleted file mode 100644 index 38faac870eb..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty.fir.kt +++ /dev/null @@ -1,4 +0,0 @@ -// !LANGUAGE: -JvmStaticInInterface -class A(@JvmStatic val z: Int) { - -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty.kt index 473550c1eb8..d2a30f99c92 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: -JvmStaticInInterface class A(@JvmStatic val z: Int) { diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty_LL13.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty_LL13.fir.kt deleted file mode 100644 index 5de49892b9a..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty_LL13.fir.kt +++ /dev/null @@ -1,4 +0,0 @@ -// !LANGUAGE: +JvmStaticInInterface -class A(@JvmStatic val z: Int) { - -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty_LL13.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty_LL13.kt index c869dd54273..b7303ce9db7 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty_LL13.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constructorProperty_LL13.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: +JvmStaticInInterface class A(@JvmStatic val z: Int) { diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/functions.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/functions.fir.kt index d638e96691d..84b915523f3 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/functions.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/functions.fir.kt @@ -21,7 +21,7 @@ class A { } } - @JvmStatic fun a4() { + @JvmStatic fun a4() { } } @@ -47,7 +47,7 @@ interface B { } } - @JvmStatic fun a4() { + @JvmStatic fun a4() { } -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/functions_LL13.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/functions_LL13.fir.kt index 9ae6708cd09..fca77383441 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/functions_LL13.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/functions_LL13.fir.kt @@ -21,7 +21,7 @@ class A { } } - @JvmStatic fun a4() { + @JvmStatic fun a4() { } } @@ -47,7 +47,7 @@ interface B { } } - @JvmStatic fun a4() { + @JvmStatic fun a4() { } -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/property.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/property.fir.kt index e7fe53e0582..745ac77c89b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/property.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/property.fir.kt @@ -37,9 +37,9 @@ class A { } var p:Int = 1 - @JvmStatic set(p1: Int) { + @JvmStatic set(p1: Int) { p = 1 } - @JvmStatic val z2 = 1; + @JvmStatic val z2 = 1; } diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/property_LL13.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/property_LL13.fir.kt index 4d91f405565..6b5075cac5b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/property_LL13.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/property_LL13.fir.kt @@ -37,9 +37,9 @@ class A { } var p:Int = 1 - @JvmStatic set(p1: Int) { + @JvmStatic set(p1: Int) { p = 1 } - @JvmStatic val z2 = 1; + @JvmStatic val z2 = 1; } 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 710f0cfe44d..c2b14439226 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt @@ -117,6 +117,7 @@ object StandardClassIds { val coroutineContext = CallableId(StandardNames.COROUTINES_PACKAGE_FQ_NAME, Name.identifier("coroutineContext")) val suspend = CallableId(BASE_KOTLIN_PACKAGE, Name.identifier("suspend")) + val JvmStatic = "JvmStatic".jvmId() val JvmName = "JvmName".jvmId() val Result = "Result".baseId() diff --git a/gradle.properties b/gradle.properties index 4d25917505a..286ae711f2c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -65,4 +65,3 @@ org.gradle.vfs.watch=true #kotlin.fir.modularized.testdata.kotlin=/path/to/kotlin/project/testdata #kotlin.fir.modularized.testdata.intellij=/path/to/intellij/project/testdata #kotlin.fir.modularized.testdata.youtrack=/path/to/youtrack/project/testdata - diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index d7029e30beb..03c660c7e35 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -3670,6 +3670,18 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.JVM_STATIC_NOT_IN_OBJECT_OR_CLASS_COMPANION) { firDiagnostic -> + JvmStaticNotInObjectOrClassCompanionImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } + add(FirJvmErrors.JVM_STATIC_NOT_IN_OBJECT_OR_COMPANION) { firDiagnostic -> + JvmStaticNotInObjectOrCompanionImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } add(FirJvmErrors.INAPPLICABLE_JVM_NAME) { firDiagnostic -> InapplicableJvmNameImpl( firDiagnostic as FirPsiDiagnostic, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 8ff6c095094..21a5cc8836c 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2554,6 +2554,14 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = OverrideCannotBeStatic::class } + abstract class JvmStaticNotInObjectOrClassCompanion : KtFirDiagnostic() { + override val diagnosticClass get() = JvmStaticNotInObjectOrClassCompanion::class + } + + abstract class JvmStaticNotInObjectOrCompanion : KtFirDiagnostic() { + override val diagnosticClass get() = JvmStaticNotInObjectOrCompanion::class + } + abstract class InapplicableJvmName : KtFirDiagnostic() { override val diagnosticClass get() = InapplicableJvmName::class } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 65f9be90629..4fb65631ae5 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -4145,6 +4145,20 @@ internal class OverrideCannotBeStaticImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class JvmStaticNotInObjectOrClassCompanionImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.JvmStaticNotInObjectOrClassCompanion(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + +internal class JvmStaticNotInObjectOrCompanionImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.JvmStaticNotInObjectOrCompanion(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class InapplicableJvmNameImpl( firDiagnostic: FirPsiDiagnostic, override val token: ValidityToken, diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt index 0aec7de2f50..d5dda53adf7 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.psi.synthetics.SyntheticClassOrObjectDescriptor import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.components.isVararg @@ -529,12 +530,7 @@ object KSerializerDescriptorResolver { else this.makeNullable() fun createWriteSelfFunctionDescriptor(thisClass: ClassDescriptor): SimpleFunctionDescriptor { - val jvmStaticClass = thisClass.module.findClassAcrossModuleDependencies( - ClassId( - FqName("kotlin.jvm"), - Name.identifier("JvmStatic") - ) - )!! + val jvmStaticClass = thisClass.module.findClassAcrossModuleDependencies(StandardClassIds.JvmStatic)!! val jvmStaticAnnotation = AnnotationDescriptorImpl(jvmStaticClass.defaultType, mapOf(), jvmStaticClass.source) val annotations = Annotations.create(listOf(jvmStaticAnnotation))