From f90b534c4c75d8428d811e7dc7c7df2f1c207d3e Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Tue, 17 Aug 2021 12:40:08 +0300 Subject: [PATCH] [FIR] Add STRICTFP_ON_CLASS diagnostic --- .../diagnostics/FirJvmDiagnosticsList.kt | 3 +++ .../analysis/diagnostics/jvm/FirJvmErrors.kt | 2 ++ .../jvm/checkers/JvmDeclarationCheckers.kt | 7 ++++++ .../FirStrictfpApplicabilityChecker.kt | 24 +++++++++++++++++++ .../annotations/strictfpOnClass.fir.kt | 17 ------------- .../annotations/strictfpOnClass.kt | 1 + .../diagnostics/KtFirDataClassConverters.kt | 6 +++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 7 ++++++ 9 files changed, 54 insertions(+), 17 deletions(-) create mode 100644 compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirStrictfpApplicabilityChecker.kt delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/strictfpOnClass.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 b67c0f37616..b88bb43c823 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 @@ -10,12 +10,15 @@ import org.jetbrains.kotlin.fir.PrivateForInline import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.DiagnosticList import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.* +import org.jetbrains.kotlin.psi.KtAnnotationEntry @Suppress("UNUSED_VARIABLE", "LocalVariableName", "ClassName", "unused") @OptIn(PrivateForInline::class) object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { val DECLARATIONS by object : DiagnosticGroup("Declarations") { val CONFLICTING_JVM_DECLARATIONS by error() + val STRICTFP_ON_CLASS by error() } val TYPES by object : DiagnosticGroup("Types") { 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 bee4bf3b72e..add4a584fcc 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 @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.analysis.diagnostics.jvm import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.analysis.diagnostics.* import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtExpression /* @@ -18,6 +19,7 @@ import org.jetbrains.kotlin.psi.KtExpression object FirJvmErrors { // Declarations val CONFLICTING_JVM_DECLARATIONS by error0() + val STRICTFP_ON_CLASS by error0() // Types val JAVA_TYPE_MISMATCH by error2() diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmDeclarationCheckers.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmDeclarationCheckers.kt index 1d666f2c9ce..ea4b9327506 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmDeclarationCheckers.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmDeclarationCheckers.kt @@ -7,11 +7,18 @@ package org.jetbrains.kotlin.fir.analysis.jvm.checkers import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirClassChecker import org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration.FirJvmExternalDeclarationChecker +import org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration.FirStrictfpApplicabilityChecker object JvmDeclarationCheckers : DeclarationCheckers() { override val basicDeclarationCheckers: Set get() = setOf( FirJvmExternalDeclarationChecker, ) + + override val classCheckers: Set + get() = setOf( + FirStrictfpApplicabilityChecker + ) } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirStrictfpApplicabilityChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirStrictfpApplicabilityChecker.kt new file mode 100644 index 00000000000..c539c9d723e --- /dev/null +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirStrictfpApplicabilityChecker.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2021 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. + */ + +package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration + +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirClassChecker +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 + +object FirStrictfpApplicabilityChecker : FirClassChecker() { + private val STRICTFP_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.Strictfp") + + override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) { + val annotation = declaration.getAnnotationByFqName(STRICTFP_ANNOTATION_FQ_NAME) ?: return + reporter.reportOn(annotation.source, FirJvmErrors.STRICTFP_ON_CLASS, context) + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/strictfpOnClass.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/strictfpOnClass.fir.kt deleted file mode 100644 index 8d3aa87090d..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/strictfpOnClass.fir.kt +++ /dev/null @@ -1,17 +0,0 @@ -@kotlin.jvm.Strictfp class A { - -} - -@kotlin.jvm.Strictfp object B { - -} - -@kotlin.jvm.Strictfp interface C { - -} - -fun foo() { - @kotlin.jvm.Strictfp class D - - @kotlin.jvm.Strictfp object: Any() {} -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/strictfpOnClass.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/strictfpOnClass.kt index a6c7381b7de..5e0da1b80bc 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/strictfpOnClass.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/strictfpOnClass.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL @kotlin.jvm.Strictfp class A { } 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 96c7ac16452..9d0a98f7bfe 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 @@ -3439,6 +3439,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.STRICTFP_ON_CLASS) { firDiagnostic -> + StrictfpOnClassImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } add(FirJvmErrors.JAVA_TYPE_MISMATCH) { firDiagnostic -> JavaTypeMismatchImpl( firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a), 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 1c7acec00a9..ffb4f06af40 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 @@ -2398,6 +2398,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = ConflictingJvmDeclarations::class } + abstract class StrictfpOnClass : KtFirDiagnostic() { + override val diagnosticClass get() = StrictfpOnClass::class + } + abstract class JavaTypeMismatch : KtFirDiagnostic() { override val diagnosticClass get() = JavaTypeMismatch::class abstract val expectedType: KtType 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 a01ae61c23f..14afebe7414 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 @@ -3878,6 +3878,13 @@ internal class ConflictingJvmDeclarationsImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class StrictfpOnClassImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.StrictfpOnClass(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class JavaTypeMismatchImpl( override val expectedType: KtType, override val actualType: KtType,