From a297ee66d48c3e0aa3ef6d02b544707e7d7559df Mon Sep 17 00:00:00 2001 From: Tianyu Geng Date: Thu, 16 Sep 2021 23:02:42 -0700 Subject: [PATCH] FIR: suppress VARIABLE_EXPECTED for error reference --- .../body/resolve/FirExpressionsResolveTransformer.kt | 11 ++++++++--- .../kotlin/fir/expressions/FirExpressionUtil.kt | 6 +++++- .../dataFlowInfoTraversal/AssignmentOperation.fir.kt | 2 +- .../tests/incompleteCode/incompleteAssignment.fir.kt | 2 +- .../tests/resolve/dslMarker/properties.fir.kt | 4 ++-- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 6efea14ed36..daf6d11bc5a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -495,8 +495,8 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform // following `!!` is safe since `operatorIsSuccessful = true` implies `operatorCallReference != null` val operatorReturnTypeMatches = operatorIsSuccessful && operatorReturnTypeMatches(operatorCallReference!!.candidate) - val lhsReference = leftArgument.toResolvedCallableReference() - val lhsSymbol = lhsReference?.resolvedSymbol as? FirVariableSymbol<*> + val lhsReference = leftArgument.toReference() + val lhsSymbol = (lhsReference as? FirResolvedNamedReference)?.resolvedSymbol as? FirVariableSymbol<*> val lhsVariable = lhsSymbol?.fir val lhsIsVar = lhsVariable?.isVar == true @@ -528,7 +528,12 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform leftArgument.calleeReference.source else -> leftArgument.source } - diagnostic = if (lhsSymbol == null) ConeVariableExpectedError else ConeValReassignmentError(lhsSymbol) + diagnostic = when { + // Use a stub diagnostic to suppress unresolved error here because it would be reported by other logic + lhsReference is FirErrorNamedReference -> ConeStubDiagnostic(ConeUnresolvedReferenceError()) + lhsSymbol == null -> ConeVariableExpectedError + else -> ConeValReassignmentError(lhsSymbol) + } } } (leftArgument as? FirQualifiedAccess)?.let { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt index 7b3549e2c53..4a3a90d3a16 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt @@ -56,8 +56,12 @@ inline val FirCall.argumentMapping: LinkedHashMap? { diff --git a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/AssignmentOperation.fir.kt b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/AssignmentOperation.fir.kt index dc1adc8f13f..11ea10d69c5 100644 --- a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/AssignmentOperation.fir.kt +++ b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/AssignmentOperation.fir.kt @@ -7,7 +7,7 @@ fun bar1(x: Number, y: Int) { } fun bar2(x: Number) { - y += x as Int + y += x as Int checkSubtype(x) } diff --git a/compiler/testData/diagnostics/tests/incompleteCode/incompleteAssignment.fir.kt b/compiler/testData/diagnostics/tests/incompleteCode/incompleteAssignment.fir.kt index c6ac1ef5c95..6a979ec04cc 100644 --- a/compiler/testData/diagnostics/tests/incompleteCode/incompleteAssignment.fir.kt +++ b/compiler/testData/diagnostics/tests/incompleteCode/incompleteAssignment.fir.kt @@ -7,7 +7,7 @@ fun sum(a : IntArray) : Int { // Write your solution here res = 0 for (e in a) - res += + res += } fun main() { test(0) diff --git a/compiler/testData/diagnostics/tests/resolve/dslMarker/properties.fir.kt b/compiler/testData/diagnostics/tests/resolve/dslMarker/properties.fir.kt index 783d60abfc2..ced320b1762 100644 --- a/compiler/testData/diagnostics/tests/resolve/dslMarker/properties.fir.kt +++ b/compiler/testData/diagnostics/tests/resolve/dslMarker/properties.fir.kt @@ -35,11 +35,11 @@ fun test() { bar { a + 1 - a += a + 1 + a += a + 1 a++ a1 + 1 - a1 += a1 + 1 + a1 += a1 + 1 a1++ this@foo.a + 1