[JS IR] Control an inheritance of non-external entity from external

Add a special annotation @JsExternalInheritorsOnly for marking
 external interfaces and classes. The marked interface or class
 can’t be a parent for non external interfaces, classes or objects.

^KT-57423 Fixed
This commit is contained in:
Alexander Korepanov
2023-03-21 11:45:04 +01:00
committed by Space Team
parent 6e7b078873
commit 4813b659ab
26 changed files with 677 additions and 1 deletions
@@ -5021,6 +5021,14 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirJsErrors.JS_EXTERNAL_INHERITORS_ONLY) { firDiagnostic ->
JsExternalInheritorsOnlyImpl(
firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a),
firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b),
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirJsErrors.NESTED_JS_EXPORT) { firDiagnostic ->
NestedJsExportImpl(
firDiagnostic as KtPsiDiagnostic,
@@ -3493,6 +3493,12 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = ExternalInterfaceAsClassLiteral::class
}
abstract class JsExternalInheritorsOnly : KtFirDiagnostic<KtDeclaration>() {
override val diagnosticClass get() = JsExternalInheritorsOnly::class
abstract val parent: KtClassLikeSymbol
abstract val kid: KtClassLikeSymbol
}
abstract class NestedJsExport : KtFirDiagnostic<KtElement>() {
override val diagnosticClass get() = NestedJsExport::class
}
@@ -4226,6 +4226,13 @@ internal class ExternalInterfaceAsClassLiteralImpl(
override val token: KtLifetimeToken,
) : KtFirDiagnostic.ExternalInterfaceAsClassLiteral(), KtAbstractFirDiagnostic<KtElement>
internal class JsExternalInheritorsOnlyImpl(
override val parent: KtClassLikeSymbol,
override val kid: KtClassLikeSymbol,
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,
) : KtFirDiagnostic.JsExternalInheritorsOnly(), KtAbstractFirDiagnostic<KtDeclaration>
internal class NestedJsExportImpl(
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,