From 61f825fbd41b32a002985f735e0ac67415c8d0eb Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Tue, 5 Dec 2023 11:04:00 +0100 Subject: [PATCH] [FIR] FirExpectActualDeclarationChecker: add assertions that sources are not null We don't have "expect as libraries" feature yet. But once we have the feature, the code in question might start silently behave incorrectly. Add assertions to make sure that the code will fail --- .../FirExpectActualDeclarationChecker.kt | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt index ac7651bcc4d..2cca1a943dc 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt @@ -104,7 +104,11 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { context: CheckerContext, reporter: DiagnosticReporter, ) { - fun FirPropertyAccessor.isDefault() = source?.kind == KtFakeSourceElementKind.DefaultAccessor + fun FirPropertyAccessor.isDefault(): Boolean { + val source = source + check(source != null) { "expect-actual matching is only possible for code with sources" } + return source.kind == KtFakeSourceElementKind.DefaultAccessor + } if (!accessor.isDefault()) { checkExpectDeclarationHasNoExternalModifier(accessor, context, reporter) @@ -336,7 +340,9 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { actualContainingClass: FirRegularClassSymbol, platformSession: FirSession ): Boolean { - return declaration.source?.kind != KtFakeSourceElementKind.ImplicitConstructor && + val source = declaration.source + check(source != null) { "expect-actual matching is only possible for code with sources" } + return source.kind != KtFakeSourceElementKind.ImplicitConstructor && declaration.origin != FirDeclarationOrigin.Synthetic.DataClassMember && !declaration.isAnnotationConstructor(platformSession) && !declaration.isPrimaryConstructorOfInlineOrValueClass(platformSession) && @@ -344,11 +350,15 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { } // Ideally, this function shouldn't exist KT-63751 - private fun FirElement.hasActualModifier(): Boolean = when (source?.kind) { - KtFakeSourceElementKind.DataClassGeneratedMembers -> false - KtFakeSourceElementKind.EnumGeneratedDeclaration -> false - KtFakeSourceElementKind.ImplicitConstructor -> false - else -> hasModifier(KtTokens.ACTUAL_KEYWORD) || hasModifier(KtTokens.IMPL_KEYWORD) + private fun FirElement.hasActualModifier(): Boolean { + val source = source + check(source != null) { "expect-actual matching is only possible for code with sources" } + return when (source.kind) { + KtFakeSourceElementKind.DataClassGeneratedMembers -> false + KtFakeSourceElementKind.EnumGeneratedDeclaration -> false + KtFakeSourceElementKind.ImplicitConstructor -> false + else -> hasModifier(KtTokens.ACTUAL_KEYWORD) || hasModifier(KtTokens.IMPL_KEYWORD) + } } private fun isUnderlyingPropertyOfInlineClass(