From 624162dc07f909e4ed2268cd385c8260d2c41dce Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Thu, 26 Jan 2023 13:41:01 +0200 Subject: [PATCH] [FIR JS] Report NESTED_JS_EXPORT --- .../diagnostics/KtFirDataClassConverters.kt | 6 +++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 4 +++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 5 ++++ .../diagnostics/FirJsDiagnosticsList.kt | 4 +++ .../analysis/diagnostics/js/FirJsErrors.kt | 3 +++ .../js/FirJsErrorsDefaultMessages.kt | 2 ++ .../js/checkers/JsDeclarationCheckers.kt | 1 + .../FirJsExportAnnotationChecker.kt | 27 +++++++++++++++++++ .../jsExportOnNestedDeclarations.fir.kt | 22 --------------- .../export/jsExportOnNestedDeclarations.kt | 1 + 10 files changed, 53 insertions(+), 22 deletions(-) create mode 100644 compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsExportAnnotationChecker.kt delete mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/export/jsExportOnNestedDeclarations.fir.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 9080fa9882f..dca1ef4efc2 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -4981,6 +4981,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJsErrors.NESTED_JS_EXPORT) { firDiagnostic -> + NestedJsExportImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirJsErrors.DELEGATION_BY_DYNAMIC) { firDiagnostic -> DelegationByDynamicImpl( firDiagnostic as KtPsiDiagnostic, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index f4e0c57832d..eab55ec01a8 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -3462,6 +3462,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = ExternalInterfaceAsClassLiteral::class } + abstract class NestedJsExport : KtFirDiagnostic() { + override val diagnosticClass get() = NestedJsExport::class + } + abstract class DelegationByDynamic : KtFirDiagnostic() { override val diagnosticClass get() = DelegationByDynamic::class } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index f540ec97528..a944490be86 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -4190,6 +4190,11 @@ internal class ExternalInterfaceAsClassLiteralImpl( override val token: KtLifetimeToken, ) : KtFirDiagnostic.ExternalInterfaceAsClassLiteral(), KtAbstractFirDiagnostic +internal class NestedJsExportImpl( + override val firDiagnostic: KtPsiDiagnostic, + override val token: KtLifetimeToken, +) : KtFirDiagnostic.NestedJsExport(), KtAbstractFirDiagnostic + internal class DelegationByDynamicImpl( override val firDiagnostic: KtPsiDiagnostic, override val token: KtLifetimeToken, diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt index 20b6f60f007..52e2cd0927a 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt @@ -96,6 +96,10 @@ object JS_DIAGNOSTICS_LIST : DiagnosticList("FirJsErrors") { val EXTERNAL_INTERFACE_AS_CLASS_LITERAL by error() } + val EXPORT by object : DiagnosticGroup("Export") { + val NESTED_JS_EXPORT by error() + } + val DYNAMICS by object : DiagnosticGroup("Dynamics") { val DELEGATION_BY_DYNAMIC by error() } diff --git a/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt b/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt index 0a4f6236291..cbc6c353e90 100644 --- a/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt +++ b/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt @@ -79,6 +79,9 @@ object FirJsErrors { val UNCHECKED_CAST_TO_EXTERNAL_INTERFACE by warning2() val EXTERNAL_INTERFACE_AS_CLASS_LITERAL by error0() + // Export + val NESTED_JS_EXPORT by error0() + // Dynamics val DELEGATION_BY_DYNAMIC by error0() diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrorsDefaultMessages.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrorsDefaultMessages.kt index 8869eed9f81..632a9214459 100644 --- a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrorsDefaultMessages.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.NATIVE_INDEX import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.NATIVE_SETTER_WRONG_RETURN_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.NESTED_CLASS_IN_EXTERNAL_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.NESTED_EXTERNAL_DECLARATION +import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.NESTED_JS_EXPORT import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.NON_ABSTRACT_MEMBER_OF_EXTERNAL_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.NON_EXTERNAL_DECLARATION_IN_INAPPROPRIATE_FILE import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS @@ -167,6 +168,7 @@ object FirJsErrorsDefaultMessages : BaseDiagnosticRendererFactory() { FirDiagnosticRenderers.RENDER_TYPE, ) map.put(EXTERNAL_INTERFACE_AS_CLASS_LITERAL, "Can't refer to external interface from class literal") + map.put(NESTED_JS_EXPORT, "@JsExport is only allowed on files and top-level declarations") map.checkMissingMessages(FirJsErrors) } diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsDeclarationCheckers.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsDeclarationCheckers.kt index ecbe931ac88..8234af156a1 100644 --- a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsDeclarationCheckers.kt +++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsDeclarationCheckers.kt @@ -27,6 +27,7 @@ object JsDeclarationCheckers : DeclarationCheckers() { FirJsExternalChecker, FirJsExternalFileChecker, FirJsNameChecker, + FirJsExportAnnotationChecker, ) override val classCheckers: Set diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsExportAnnotationChecker.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsExportAnnotationChecker.kt new file mode 100644 index 00000000000..2ff03e1e42f --- /dev/null +++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsExportAnnotationChecker.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2023 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.js.checkers.declaration + +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +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.isTopLevel +import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors +import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirFile +import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId +import org.jetbrains.kotlin.name.JsStandardClassIds + +object FirJsExportAnnotationChecker : FirBasicDeclarationChecker() { + override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { + val jsExport = declaration.getAnnotationByClassId(JsStandardClassIds.Annotations.JsExport, context.session) ?: return + + if (declaration !is FirFile && !context.isTopLevel) { + reporter.reportOn(jsExport.source, FirJsErrors.NESTED_JS_EXPORT, context) + } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/export/jsExportOnNestedDeclarations.fir.kt b/compiler/testData/diagnostics/testsWithJsStdLib/export/jsExportOnNestedDeclarations.fir.kt deleted file mode 100644 index 5d98e1659c0..00000000000 --- a/compiler/testData/diagnostics/testsWithJsStdLib/export/jsExportOnNestedDeclarations.fir.kt +++ /dev/null @@ -1,22 +0,0 @@ -// !OPT_IN: kotlin.js.ExperimentalJsExport - -package foo - -class C1 { - @JsExport - fun f1() {} - - @JsExport - val p: Int = 10 - - @JsExport - object O -} - -fun f2() { - @JsExport - fun f3() {} - - @JsExport - class C2 -} diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/export/jsExportOnNestedDeclarations.kt b/compiler/testData/diagnostics/testsWithJsStdLib/export/jsExportOnNestedDeclarations.kt index 1168d4eeef1..b4965b5eca2 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/export/jsExportOnNestedDeclarations.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/export/jsExportOnNestedDeclarations.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !OPT_IN: kotlin.js.ExperimentalJsExport package foo