Change FirQualifiedAccess source to KtQualifiedExpression (if any)

This commit is contained in:
Mikhail Glukhikh
2021-02-17 16:25:49 +03:00
parent 742f1e0069
commit 5892646a27
6 changed files with 14 additions and 7 deletions
@@ -18,15 +18,20 @@ import org.jetbrains.kotlin.fir.expressions.isExhaustive
object FirExhaustiveWhenChecker : FirWhenExpressionChecker() {
override fun check(expression: FirWhenExpression, context: CheckerContext, reporter: DiagnosticReporter) {
if (expression.usedAsExpression && !expression.isExhaustive) {
if (expression.source?.isIfExpression == true) {
reporter.reportOn(expression.source, FirErrors.INVALID_IF_AS_EXPRESSION, context)
} else {
val source = expression.source ?: return
if (source.isIfExpression) {
reporter.reportOn(source, FirErrors.INVALID_IF_AS_EXPRESSION, context)
return
} else if (source.isWhenExpression) {
val missingCases = (expression.exhaustivenessStatus as ExhaustivenessStatus.NotExhaustive).reasons
reporter.reportOn(expression.source, FirErrors.NO_ELSE_IN_WHEN, missingCases, context)
reporter.reportOn(source, FirErrors.NO_ELSE_IN_WHEN, missingCases, context)
}
}
}
private val FirSourceElement.isIfExpression: Boolean
get() = elementType == KtNodeTypes.IF
private val FirSourceElement.isWhenExpression: Boolean
get() = elementType == KtNodeTypes.WHEN
}
@@ -499,6 +499,7 @@ class ExpressionsConverter(
it.replaceExplicitReceiver(firReceiver)
}
firSelector.replaceSource(dotQualifiedExpression.toFirSourceElement())
return firSelector
}
@@ -1985,6 +1985,7 @@ class RawFirBuilder(
firSelector.replaceExplicitReceiver(receiver)
}
firSelector.replaceSource(expression.toFirSourceElement())
return firSelector
}
+1 -1
View File
@@ -1,5 +1,5 @@
// NI_EXPECTED_FILE
interface T {
val a = <!UNRESOLVED_REFERENCE!>Foo<!>.<!PROPERTY_INITIALIZER_IN_INTERFACE!><!UNRESOLVED_REFERENCE!>bar<!>()<!>
val a = <!PROPERTY_INITIALIZER_IN_INTERFACE!><!UNRESOLVED_REFERENCE!>Foo<!>.<!UNRESOLVED_REFERENCE!>bar<!>()<!>
}
@@ -72,7 +72,7 @@ fun main1() {
1."sdf"
1.{}
1.<!INVALID_IF_AS_EXPRESSION!>if<!> (true) {}
1.if (true) {}
}
fun test() {
@@ -26,6 +26,6 @@ class C {
val C.foo : C.D = <!EXTENSION_PROPERTY_WITH_BACKING_FIELD!><!UNRESOLVED_REFERENCE!>D<!>()<!>
val C.bar : C.D = C().<!EXTENSION_PROPERTY_WITH_BACKING_FIELD!>D()<!>
val C.bar : C.D = <!EXTENSION_PROPERTY_WITH_BACKING_FIELD!>C().D()<!>
val C.foo1 : C.D get() = D()