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() { object FirExhaustiveWhenChecker : FirWhenExpressionChecker() {
override fun check(expression: FirWhenExpression, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(expression: FirWhenExpression, context: CheckerContext, reporter: DiagnosticReporter) {
if (expression.usedAsExpression && !expression.isExhaustive) { if (expression.usedAsExpression && !expression.isExhaustive) {
if (expression.source?.isIfExpression == true) { val source = expression.source ?: return
reporter.reportOn(expression.source, FirErrors.INVALID_IF_AS_EXPRESSION, context) if (source.isIfExpression) {
} else { reporter.reportOn(source, FirErrors.INVALID_IF_AS_EXPRESSION, context)
return
} else if (source.isWhenExpression) {
val missingCases = (expression.exhaustivenessStatus as ExhaustivenessStatus.NotExhaustive).reasons 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 private val FirSourceElement.isIfExpression: Boolean
get() = elementType == KtNodeTypes.IF get() = elementType == KtNodeTypes.IF
private val FirSourceElement.isWhenExpression: Boolean
get() = elementType == KtNodeTypes.WHEN
} }
@@ -499,6 +499,7 @@ class ExpressionsConverter(
it.replaceExplicitReceiver(firReceiver) it.replaceExplicitReceiver(firReceiver)
} }
firSelector.replaceSource(dotQualifiedExpression.toFirSourceElement())
return firSelector return firSelector
} }
@@ -1985,6 +1985,7 @@ class RawFirBuilder(
firSelector.replaceExplicitReceiver(receiver) firSelector.replaceExplicitReceiver(receiver)
} }
firSelector.replaceSource(expression.toFirSourceElement())
return firSelector return firSelector
} }
+1 -1
View File
@@ -1,5 +1,5 @@
// NI_EXPECTED_FILE // NI_EXPECTED_FILE
interface T { 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."sdf"
1.{} 1.{}
1.<!INVALID_IF_AS_EXPRESSION!>if<!> (true) {} 1.if (true) {}
} }
fun test() { fun test() {
@@ -26,6 +26,6 @@ class C {
val C.foo : C.D = <!EXTENSION_PROPERTY_WITH_BACKING_FIELD!><!UNRESOLVED_REFERENCE!>D<!>()<!> 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() val C.foo1 : C.D get() = D()