[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
This commit is contained in:
Nikita Bobko
2023-12-05 11:04:00 +01:00
committed by Space Team
parent 209dbae893
commit 61f825fbd4
@@ -104,7 +104,11 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() {
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter, 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()) { if (!accessor.isDefault()) {
checkExpectDeclarationHasNoExternalModifier(accessor, context, reporter) checkExpectDeclarationHasNoExternalModifier(accessor, context, reporter)
@@ -336,7 +340,9 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() {
actualContainingClass: FirRegularClassSymbol, actualContainingClass: FirRegularClassSymbol,
platformSession: FirSession platformSession: FirSession
): Boolean { ): 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.origin != FirDeclarationOrigin.Synthetic.DataClassMember &&
!declaration.isAnnotationConstructor(platformSession) && !declaration.isAnnotationConstructor(platformSession) &&
!declaration.isPrimaryConstructorOfInlineOrValueClass(platformSession) && !declaration.isPrimaryConstructorOfInlineOrValueClass(platformSession) &&
@@ -344,11 +350,15 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() {
} }
// Ideally, this function shouldn't exist KT-63751 // Ideally, this function shouldn't exist KT-63751
private fun FirElement.hasActualModifier(): Boolean = when (source?.kind) { private fun FirElement.hasActualModifier(): Boolean {
KtFakeSourceElementKind.DataClassGeneratedMembers -> false val source = source
KtFakeSourceElementKind.EnumGeneratedDeclaration -> false check(source != null) { "expect-actual matching is only possible for code with sources" }
KtFakeSourceElementKind.ImplicitConstructor -> false return when (source.kind) {
else -> hasModifier(KtTokens.ACTUAL_KEYWORD) || hasModifier(KtTokens.IMPL_KEYWORD) KtFakeSourceElementKind.DataClassGeneratedMembers -> false
KtFakeSourceElementKind.EnumGeneratedDeclaration -> false
KtFakeSourceElementKind.ImplicitConstructor -> false
else -> hasModifier(KtTokens.ACTUAL_KEYWORD) || hasModifier(KtTokens.IMPL_KEYWORD)
}
} }
private fun isUnderlyingPropertyOfInlineClass( private fun isUnderlyingPropertyOfInlineClass(