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 04d972f4253..8d51ba18087 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 @@ -1326,6 +1326,27 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJsErrors.JS_NAME_CLASH) { firDiagnostic -> + JsNameClashImpl( + firDiagnostic.a, + firDiagnostic.b.map { firBasedSymbol -> + firSymbolBuilder.buildSymbol(firBasedSymbol) + }, + firDiagnostic as KtPsiDiagnostic, + token, + ) + } + add(FirJsErrors.JS_FAKE_NAME_CLASH) { firDiagnostic -> + JsFakeNameClashImpl( + firDiagnostic.a, + firSymbolBuilder.buildSymbol(firDiagnostic.b), + firDiagnostic.c.map { firBasedSymbol -> + firSymbolBuilder.buildSymbol(firBasedSymbol) + }, + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.OPT_IN_USAGE) { firDiagnostic -> OptInUsageImpl( firDiagnostic.a, 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 a2aaa3c6477..ec4a905e8dc 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 @@ -956,6 +956,19 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = NameContainsIllegalChars::class } + interface JsNameClash : KtFirDiagnostic { + override val diagnosticClass get() = JsNameClash::class + val name: String + val existing: List + } + + interface JsFakeNameClash : KtFirDiagnostic { + override val diagnosticClass get() = JsFakeNameClash::class + val name: String + val override: KtSymbol + val existing: List + } + interface OptInUsage : KtFirDiagnostic { override val diagnosticClass get() = OptInUsage::class val optInMarkerFqName: FqName 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 2a9e382cf80..70eea3d3c34 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 @@ -1148,6 +1148,21 @@ internal class NameContainsIllegalCharsImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.NameContainsIllegalChars +internal class JsNameClashImpl( + override val name: String, + override val existing: List, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.JsNameClash + +internal class JsFakeNameClashImpl( + override val name: String, + override val override: KtSymbol, + override val existing: List, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.JsFakeNameClash + internal class OptInUsageImpl( override val optInMarkerFqName: FqName, override val message: String, 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 2c63c36582c..3124809348b 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 @@ -58,6 +58,15 @@ object JS_DIAGNOSTICS_LIST : DiagnosticList("FirJsErrors") { parameter("name") } val NAME_CONTAINS_ILLEGAL_CHARS by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) + val JS_NAME_CLASH by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { + parameter("name") + parameter>>("existing") + } + val JS_FAKE_NAME_CLASH by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { + parameter("name") + parameter>("override") + parameter>>("existing") + } } val SUPERTYPES by object : DiagnosticGroup("Supertypes") { 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 3b22f8831d1..96d32404a08 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 @@ -52,6 +52,8 @@ object FirJsErrors { val JS_NAME_PROHIBITED_FOR_EXTENSION_PROPERTY by error0() val JS_BUILTIN_NAME_CLASH by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val NAME_CONTAINS_ILLEGAL_CHARS by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) + val JS_NAME_CLASH by error2>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) + val JS_FAKE_NAME_CLASH by error3, Collection>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) // Supertypes val WRONG_MULTIPLE_INHERITANCE by error1>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) 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 7ff702ae436..4974a97ab8f 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 @@ -37,6 +37,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.JS_EXTERNAL_ import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.JS_MODULE_PROHIBITED_ON_NON_NATIVE import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.JS_MODULE_PROHIBITED_ON_VAR import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.NESTED_JS_MODULE_PROHIBITED +import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.JS_FAKE_NAME_CLASH +import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.JS_NAME_CLASH import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.JS_NAME_IS_NOT_ON_ALL_ACCESSORS import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.JS_NAME_ON_ACCESSOR_AND_PROPERTY import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.JS_NAME_ON_PRIMARY_CONSTRUCTOR_PROHIBITED @@ -201,6 +203,19 @@ object FirJsErrorsDefaultMessages : BaseDiagnosticRendererFactory() { CommonRenderers.STRING ) map.put(NAME_CONTAINS_ILLEGAL_CHARS, "Name contains illegal chars that cannot appear in JavaScript identifier.") + map.put( + JS_NAME_CLASH, + "JavaScript name ({0}) generated for this declaration clashes with another declarations: {1}", + CommonRenderers.STRING, + FirDiagnosticRenderers.SYMBOLS + ) + map.put( + JS_FAKE_NAME_CLASH, + "JavaScript name {0} is generated for different inherited members: {1} and {2}", + CommonRenderers.STRING, + FirDiagnosticRenderers.SYMBOL, + FirDiagnosticRenderers.SYMBOLS + ) map.put(JS_NAME_IS_NOT_ON_ALL_ACCESSORS, "'@JsName' should be on all the property accessors.") map.put(JS_NAME_PROHIBITED_FOR_NAMED_NATIVE, "'@JsName' is prohibited for external declaration with explicit name.") diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt index 04a14dad1d7..1f75219f46b 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt @@ -179,6 +179,8 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set = setOf( "JS_NAME_PROHIBITED_FOR_EXTENSION_PROPERTY", "JS_BUILTIN_NAME_CLASH", "NAME_CONTAINS_ILLEGAL_CHARS", + "JS_NAME_CLASH", + "JS_FAKE_NAME_CLASH", "OPT_IN_USAGE_ERROR", "OPT_IN_OVERRIDE_ERROR", "OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION",