From 816e8f487cbb9aa1914675dee1c7f59b171d7e8a Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Sat, 28 Aug 2021 00:36:57 +0300 Subject: [PATCH] [FIR] Add JVM diagnostics about external declaration --- .../diagnostics/FirJvmDiagnosticsList.kt | 7 +++ .../analysis/diagnostics/jvm/FirJvmErrors.kt | 6 +++ .../FirJvmExternalDeclarationChecker.kt | 47 +++++++++++++++++-- .../diagnostics/FirJvmDefaultErrorMessages.kt | 9 ++++ .../tests/ExternalAndAbstract.fir.kt | 9 ---- .../diagnostics/tests/ExternalAndAbstract.kt | 1 + .../testsWithStdLib/native/abstract.fir.kt | 11 ----- .../testsWithStdLib/native/abstract.kt | 1 + .../testsWithStdLib/native/body.fir.kt | 25 ---------- .../testsWithStdLib/native/body.kt | 1 + .../testsWithStdLib/native/inline.fir.kt | 11 ----- .../testsWithStdLib/native/inline.kt | 1 + .../testsWithStdLib/native/reified.fir.kt | 4 -- .../testsWithStdLib/native/reified.kt | 1 + .../testsWithStdLib/native/trait.fir.kt | 11 ----- .../testsWithStdLib/native/trait.kt | 1 + .../diagnostics/KtFirDataClassConverters.kt | 24 ++++++++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 16 +++++++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 28 +++++++++++ 19 files changed, 138 insertions(+), 76 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/ExternalAndAbstract.fir.kt delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/native/abstract.fir.kt delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/native/body.fir.kt delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/native/inline.fir.kt delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/native/reified.fir.kt delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/native/trait.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 498ad6c839e..7d385c23c52 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 @@ -103,4 +103,11 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { val USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL by error() val NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT by warning(PositioningStrategy.DECLARATION_SIGNATURE) } + + val EXTERNAL_DECLARATION by object : DiagnosticGroup("External Declaration") { + val EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT by error(PositioningStrategy.ABSTRACT_MODIFIER) + val EXTERNAL_DECLARATION_CANNOT_HAVE_BODY by error(PositioningStrategy.DECLARATION_SIGNATURE) + val EXTERNAL_DECLARATION_IN_INTERFACE by error(PositioningStrategy.DECLARATION_SIGNATURE) + val EXTERNAL_DECLARATION_CANNOT_BE_INLINED by error(PositioningStrategy.DECLARATION_SIGNATURE) + } } 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 2982fe32a26..c4898b9fced 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 @@ -83,4 +83,10 @@ object FirJvmErrors { val USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL by error0() val NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT by warning0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) + // External Declaration + val EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT by error0(SourceElementPositioningStrategies.ABSTRACT_MODIFIER) + val EXTERNAL_DECLARATION_CANNOT_HAVE_BODY by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) + val EXTERNAL_DECLARATION_IN_INTERFACE by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) + val EXTERNAL_DECLARATION_CANNOT_BE_INLINED by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) + } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmExternalDeclarationChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmExternalDeclarationChecker.kt index c006e56e6af..fd9a66730cc 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmExternalDeclarationChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmExternalDeclarationChecker.kt @@ -5,20 +5,45 @@ package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.FirFakeSourceElementKind +import org.jetbrains.kotlin.fir.FirSourceElement 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.getModifier import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn +import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isExternal +import org.jetbrains.kotlin.fir.declarations.utils.isInline +import org.jetbrains.kotlin.fir.declarations.utils.isInterface +import org.jetbrains.kotlin.fir.declarations.utils.modality +import org.jetbrains.kotlin.fir.resolve.toFirRegularClass import org.jetbrains.kotlin.lexer.KtTokens object FirJvmExternalDeclarationChecker : FirBasicDeclarationChecker() { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { + checkInternal(declaration, null, null, context, reporter) + } + + private fun checkInternal( + declaration: FirDeclaration, + reportSource: FirSourceElement?, + modality: Modality?, + context: CheckerContext, + reporter: DiagnosticReporter + ) { if (declaration !is FirMemberDeclaration) return + + if (declaration is FirProperty) { + declaration.getter?.let { + checkInternal(it, declaration.source, declaration.modality, context, reporter) + } + } + if (!declaration.isExternal) return val source = declaration.source ?: return if (source.kind is FirFakeSourceElementKind) return @@ -34,12 +59,24 @@ object FirJvmExternalDeclarationChecker : FirBasicDeclarationChecker() { externalModifier?.let { reporter.reportOn(it.source, FirErrors.WRONG_MODIFIER_TARGET, it.token, target, context) } + return } - // TODO: Implement checkers for these JVM-specific errors (see ExternalFunChecker in FE1.0): - // - EXTERNAL_DECLARATION_IN_INTERFACE - // - EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT - // - EXTERNAL_DECLARATION_CANNOT_HAVE_BODY - // - EXTERNAL_DECLARATION_CANNOT_BE_INLINED + val containingClassSymbol = declaration.symbol.containingClass()?.toFirRegularClass(context.session) + if (containingClassSymbol != null) { + if (containingClassSymbol.isInterface) { + reporter.reportOn(declaration.source, FirJvmErrors.EXTERNAL_DECLARATION_IN_INTERFACE, context) + } else if ((modality ?: declaration.modality) == Modality.ABSTRACT) { + reporter.reportOn(reportSource ?: declaration.source, FirJvmErrors.EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT, context) + } + } + + if (declaration !is FirConstructor && declaration.body != null) { + reporter.reportOn(declaration.source, FirJvmErrors.EXTERNAL_DECLARATION_CANNOT_HAVE_BODY, context) + } + + if (declaration.isInline) { + reporter.reportOn(declaration.source, FirJvmErrors.EXTERNAL_DECLARATION_CANNOT_BE_INLINED, context) + } } } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/diagnostics/FirJvmDefaultErrorMessages.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/diagnostics/FirJvmDefaultErrorMessages.kt index 94a3e0aa50a..f2299cfc2de 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/diagnostics/FirJvmDefaultErrorMessages.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/diagnostics/FirJvmDefaultErrorMessages.kt @@ -13,6 +13,10 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.CONFLICTIN import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.DELEGATION_BY_IN_JVM_RECORD import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.DEPRECATED_JAVA_ANNOTATION import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.ENUM_JVM_RECORD +import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT +import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.EXTERNAL_DECLARATION_CANNOT_BE_INLINED +import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.EXTERNAL_DECLARATION_CANNOT_HAVE_BODY +import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.EXTERNAL_DECLARATION_IN_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.FIELD_IN_JVM_RECORD import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.ILLEGAL_JVM_NAME @@ -155,6 +159,11 @@ object FirJvmDefaultErrorMessages { NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT, "Non-@JvmDefault interface method cannot override default Java method. Please annotate this method with @JvmDefault or enable `-Xjvm-default=all|all-compatibility`" ) + + map.put(EXTERNAL_DECLARATION_IN_INTERFACE, "Members of interfaces can not be external") + map.put(EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT, "External declaration can not be abstract") + map.put(EXTERNAL_DECLARATION_CANNOT_HAVE_BODY, "External declaration can not have a body") + map.put(EXTERNAL_DECLARATION_CANNOT_BE_INLINED, "Inline functions can not be external") } } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/ExternalAndAbstract.fir.kt b/compiler/testData/diagnostics/tests/ExternalAndAbstract.fir.kt deleted file mode 100644 index fa3f698fe67..00000000000 --- a/compiler/testData/diagnostics/tests/ExternalAndAbstract.fir.kt +++ /dev/null @@ -1,9 +0,0 @@ -abstract class A { - abstract val x : Int - external get -} - -interface B { - val x: Int - external get -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/ExternalAndAbstract.kt b/compiler/testData/diagnostics/tests/ExternalAndAbstract.kt index ab14f27ecc1..758ad5e8175 100644 --- a/compiler/testData/diagnostics/tests/ExternalAndAbstract.kt +++ b/compiler/testData/diagnostics/tests/ExternalAndAbstract.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL abstract class A { abstract val x : Int external get diff --git a/compiler/testData/diagnostics/testsWithStdLib/native/abstract.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/native/abstract.fir.kt deleted file mode 100644 index aaab812e231..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/native/abstract.fir.kt +++ /dev/null @@ -1,11 +0,0 @@ -import kotlin.jvm.* - -abstract class C { - abstract external fun foo() -} - -fun test() { - abstract class Local { - abstract external fun foo() - } -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/native/abstract.kt b/compiler/testData/diagnostics/testsWithStdLib/native/abstract.kt index bcf7943202d..dc994bf63f0 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/native/abstract.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/native/abstract.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL import kotlin.jvm.* abstract class C { diff --git a/compiler/testData/diagnostics/testsWithStdLib/native/body.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/native/body.fir.kt deleted file mode 100644 index 47810841b9e..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/native/body.fir.kt +++ /dev/null @@ -1,25 +0,0 @@ -import kotlin.jvm.* - -external fun foo() {} - -class C { - external fun foo() {} - - companion object { - external fun foo() {} - } -} - -object O { - external fun foo() {} -} - -fun test() { - class Local { - external fun foo() {} - } - - object { - external fun foo() {} - } -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/native/body.kt b/compiler/testData/diagnostics/testsWithStdLib/native/body.kt index df1d978cf5d..06289af6763 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/native/body.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/native/body.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL import kotlin.jvm.* external fun foo() {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/native/inline.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/native/inline.fir.kt deleted file mode 100644 index fdde1b6acd9..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/native/inline.fir.kt +++ /dev/null @@ -1,11 +0,0 @@ -import kotlin.jvm.* - -abstract class C { - inline external fun foo() -} - -fun test() { - abstract class Local { - inline external fun foo() - } -} diff --git a/compiler/testData/diagnostics/testsWithStdLib/native/inline.kt b/compiler/testData/diagnostics/testsWithStdLib/native/inline.kt index c5568c62db6..11d664d45cb 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/native/inline.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/native/inline.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL import kotlin.jvm.* abstract class C { diff --git a/compiler/testData/diagnostics/testsWithStdLib/native/reified.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/native/reified.fir.kt deleted file mode 100644 index c398f496c97..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/native/reified.fir.kt +++ /dev/null @@ -1,4 +0,0 @@ -import kotlin.jvm.* - -external fun <reified T> foo() -inline external fun bar() diff --git a/compiler/testData/diagnostics/testsWithStdLib/native/reified.kt b/compiler/testData/diagnostics/testsWithStdLib/native/reified.kt index 3950079bee9..35d588bf10c 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/native/reified.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/native/reified.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL import kotlin.jvm.* external fun <reified T> foo() diff --git a/compiler/testData/diagnostics/testsWithStdLib/native/trait.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/native/trait.fir.kt deleted file mode 100644 index b05f86c1f69..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/native/trait.fir.kt +++ /dev/null @@ -1,11 +0,0 @@ -import kotlin.jvm.* - -interface Tr { - external fun foo() - external fun bar() {} - - companion object { - external fun foo() - external fun bar() {} - } -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/native/trait.kt b/compiler/testData/diagnostics/testsWithStdLib/native/trait.kt index 608f7ccb47e..58d5c683392 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/native/trait.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/native/trait.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL import kotlin.jvm.* interface Tr { 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 64006ef53b5..28fc7176cb2 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 @@ -3756,4 +3756,28 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT) { firDiagnostic -> + ExternalDeclarationCannotBeAbstractImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } + add(FirJvmErrors.EXTERNAL_DECLARATION_CANNOT_HAVE_BODY) { firDiagnostic -> + ExternalDeclarationCannotHaveBodyImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } + add(FirJvmErrors.EXTERNAL_DECLARATION_IN_INTERFACE) { firDiagnostic -> + ExternalDeclarationInInterfaceImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } + add(FirJvmErrors.EXTERNAL_DECLARATION_CANNOT_BE_INLINED) { firDiagnostic -> + ExternalDeclarationCannotBeInlinedImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } } 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 0bf7f17b687..52214d3e8af 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 @@ -2612,4 +2612,20 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = NonJvmDefaultOverridesJavaDefault::class } + abstract class ExternalDeclarationCannotBeAbstract : KtFirDiagnostic() { + override val diagnosticClass get() = ExternalDeclarationCannotBeAbstract::class + } + + abstract class ExternalDeclarationCannotHaveBody : KtFirDiagnostic() { + override val diagnosticClass get() = ExternalDeclarationCannotHaveBody::class + } + + abstract class ExternalDeclarationInInterface : KtFirDiagnostic() { + override val diagnosticClass get() = ExternalDeclarationInInterface::class + } + + abstract class ExternalDeclarationCannotBeInlined : KtFirDiagnostic() { + override val diagnosticClass get() = ExternalDeclarationCannotBeInlined::class + } + } 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 3fc1cacf285..9874ea76e89 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 @@ -4245,3 +4245,31 @@ internal class NonJvmDefaultOverridesJavaDefaultImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class ExternalDeclarationCannotBeAbstractImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.ExternalDeclarationCannotBeAbstract(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + +internal class ExternalDeclarationCannotHaveBodyImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.ExternalDeclarationCannotHaveBody(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + +internal class ExternalDeclarationInInterfaceImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.ExternalDeclarationInInterface(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + +internal class ExternalDeclarationCannotBeInlinedImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.ExternalDeclarationCannotBeInlined(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} +