[FIR JS] Generate diagnostic componentss for JS FIR FE checks

Generate components for JS_NAME_CLASH and JS_FAKE_NAME_CLASH

^KT-59425 Related
^KT-59370 Related
This commit is contained in:
Alexander Korepanov
2023-09-04 20:36:39 +02:00
committed by Space Team
parent f5307173b5
commit 5ac277d058
7 changed files with 77 additions and 0 deletions
@@ -1326,6 +1326,27 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token, 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 -> add(FirErrors.OPT_IN_USAGE) { firDiagnostic ->
OptInUsageImpl( OptInUsageImpl(
firDiagnostic.a, firDiagnostic.a,
@@ -956,6 +956,19 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = NameContainsIllegalChars::class override val diagnosticClass get() = NameContainsIllegalChars::class
} }
interface JsNameClash : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = JsNameClash::class
val name: String
val existing: List<KtSymbol>
}
interface JsFakeNameClash : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = JsFakeNameClash::class
val name: String
val override: KtSymbol
val existing: List<KtSymbol>
}
interface OptInUsage : KtFirDiagnostic<PsiElement> { interface OptInUsage : KtFirDiagnostic<PsiElement> {
override val diagnosticClass get() = OptInUsage::class override val diagnosticClass get() = OptInUsage::class
val optInMarkerFqName: FqName val optInMarkerFqName: FqName
@@ -1148,6 +1148,21 @@ internal class NameContainsIllegalCharsImpl(
token: KtLifetimeToken, token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.NameContainsIllegalChars ) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.NameContainsIllegalChars
internal class JsNameClashImpl(
override val name: String,
override val existing: List<KtSymbol>,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsNameClash
internal class JsFakeNameClashImpl(
override val name: String,
override val override: KtSymbol,
override val existing: List<KtSymbol>,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsFakeNameClash
internal class OptInUsageImpl( internal class OptInUsageImpl(
override val optInMarkerFqName: FqName, override val optInMarkerFqName: FqName,
override val message: String, override val message: String,
@@ -58,6 +58,15 @@ object JS_DIAGNOSTICS_LIST : DiagnosticList("FirJsErrors") {
parameter<String>("name") parameter<String>("name")
} }
val NAME_CONTAINS_ILLEGAL_CHARS by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) val NAME_CONTAINS_ILLEGAL_CHARS by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
val JS_NAME_CLASH by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) {
parameter<String>("name")
parameter<Collection<FirBasedSymbol<*>>>("existing")
}
val JS_FAKE_NAME_CLASH by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) {
parameter<String>("name")
parameter<FirBasedSymbol<*>>("override")
parameter<Collection<FirBasedSymbol<*>>>("existing")
}
} }
val SUPERTYPES by object : DiagnosticGroup("Supertypes") { val SUPERTYPES by object : DiagnosticGroup("Supertypes") {
@@ -52,6 +52,8 @@ object FirJsErrors {
val JS_NAME_PROHIBITED_FOR_EXTENSION_PROPERTY by error0<KtElement>() val JS_NAME_PROHIBITED_FOR_EXTENSION_PROPERTY by error0<KtElement>()
val JS_BUILTIN_NAME_CLASH by error1<KtElement, String>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val JS_BUILTIN_NAME_CLASH by error1<KtElement, String>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
val NAME_CONTAINS_ILLEGAL_CHARS by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val NAME_CONTAINS_ILLEGAL_CHARS by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
val JS_NAME_CLASH by error2<KtElement, String, Collection<FirBasedSymbol<*>>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
val JS_FAKE_NAME_CLASH by error3<KtElement, String, FirBasedSymbol<*>, Collection<FirBasedSymbol<*>>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
// Supertypes // Supertypes
val WRONG_MULTIPLE_INHERITANCE by error1<KtElement, FirCallableSymbol<*>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val WRONG_MULTIPLE_INHERITANCE by error1<KtElement, FirCallableSymbol<*>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
@@ -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_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.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.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_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_ACCESSOR_AND_PROPERTY
import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.JS_NAME_ON_PRIMARY_CONSTRUCTOR_PROHIBITED import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.JS_NAME_ON_PRIMARY_CONSTRUCTOR_PROHIBITED
@@ -201,6 +203,19 @@ object FirJsErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
CommonRenderers.STRING CommonRenderers.STRING
) )
map.put(NAME_CONTAINS_ILLEGAL_CHARS, "Name contains illegal chars that cannot appear in JavaScript identifier.") 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_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.") map.put(JS_NAME_PROHIBITED_FOR_NAMED_NATIVE, "'@JsName' is prohibited for external declaration with explicit name.")
@@ -179,6 +179,8 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set<String> = setOf(
"JS_NAME_PROHIBITED_FOR_EXTENSION_PROPERTY", "JS_NAME_PROHIBITED_FOR_EXTENSION_PROPERTY",
"JS_BUILTIN_NAME_CLASH", "JS_BUILTIN_NAME_CLASH",
"NAME_CONTAINS_ILLEGAL_CHARS", "NAME_CONTAINS_ILLEGAL_CHARS",
"JS_NAME_CLASH",
"JS_FAKE_NAME_CLASH",
"OPT_IN_USAGE_ERROR", "OPT_IN_USAGE_ERROR",
"OPT_IN_OVERRIDE_ERROR", "OPT_IN_OVERRIDE_ERROR",
"OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION", "OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION",