Frontend: Avoid retypechecking the right hand side of assignment operators
This commit is contained in:
committed by
Mikhail Glukhikh
parent
41c81d25a0
commit
ab506c1579
+5
@@ -9763,6 +9763,11 @@ public class FirDiagnosticsSmokeTestGenerated extends AbstractFirDiagnosticsSmok
|
|||||||
runTest("compiler/testData/diagnostics/tests/inference/functionPlaceholderError.kt");
|
runTest("compiler/testData/diagnostics/tests/inference/functionPlaceholderError.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("genericAssignmentOperator.kt")
|
||||||
|
public void testGenericAssignmentOperator() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/inference/genericAssignmentOperator.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("hasErrorInConstrainingTypes.kt")
|
@TestMetadata("hasErrorInConstrainingTypes.kt")
|
||||||
public void testHasErrorInConstrainingTypes() throws Exception {
|
public void testHasErrorInConstrainingTypes() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/inference/hasErrorInConstrainingTypes.kt");
|
runTest("compiler/testData/diagnostics/tests/inference/hasErrorInConstrainingTypes.kt");
|
||||||
|
|||||||
+8
-1
@@ -29,7 +29,9 @@ import org.jetbrains.kotlin.psi.*;
|
|||||||
import org.jetbrains.kotlin.resolve.BindingContext;
|
import org.jetbrains.kotlin.resolve.BindingContext;
|
||||||
import org.jetbrains.kotlin.resolve.BindingContextUtils;
|
import org.jetbrains.kotlin.resolve.BindingContextUtils;
|
||||||
import org.jetbrains.kotlin.resolve.TemporaryBindingTrace;
|
import org.jetbrains.kotlin.resolve.TemporaryBindingTrace;
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver;
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.CallPosition;
|
import org.jetbrains.kotlin.resolve.calls.context.CallPosition;
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.context.ContextDependency;
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.TemporaryTraceAndCache;
|
import org.jetbrains.kotlin.resolve.calls.context.TemporaryTraceAndCache;
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
||||||
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResults;
|
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResults;
|
||||||
@@ -37,7 +39,6 @@ import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResultsImpl;
|
|||||||
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResultsUtil;
|
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResultsUtil;
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue;
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue;
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory;
|
|
||||||
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil;
|
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.LexicalWritableScope;
|
import org.jetbrains.kotlin.resolve.scopes.LexicalWritableScope;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver;
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver;
|
||||||
@@ -213,6 +214,12 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
|
|||||||
context.trace.report(UNRESOLVED_REFERENCE.on(operationSign, operationSign));
|
context.trace.report(UNRESOLVED_REFERENCE.on(operationSign, operationSign));
|
||||||
temporary.commit();
|
temporary.commit();
|
||||||
return rightInfo.clearType();
|
return rightInfo.clearType();
|
||||||
|
} else if (ArgumentTypeResolver.getFunctionLiteralArgumentIfAny(right, context) == null &&
|
||||||
|
ArgumentTypeResolver.getCallableReferenceExpressionIfAny(right, context) == null) {
|
||||||
|
// Cache the type info for the right hand side so that we don't evaluate it twice if there is no valid plusAssign.
|
||||||
|
// We skip over function literals and references, since ArgumentTypeResolver will only resolve the shape of the
|
||||||
|
// function type before attempting to resolve the call.
|
||||||
|
facade.getTypeInfo(right, context.replaceContextDependency(ContextDependency.DEPENDENT));
|
||||||
}
|
}
|
||||||
ExpressionReceiver receiver = ExpressionReceiver.Companion.create(left, leftType, context.trace.getBindingContext());
|
ExpressionReceiver receiver = ExpressionReceiver.Companion.create(left, leftType, context.trace.getBindingContext());
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
class R<T>
|
||||||
|
|
||||||
|
fun <T> f(): R<T> = R<T>()
|
||||||
|
|
||||||
|
operator fun Int.plusAssign(<!UNUSED_PARAMETER!>y<!>: R<Int>) {}
|
||||||
|
|
||||||
|
fun box() {
|
||||||
|
1 += f()
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun box(): kotlin.Unit
|
||||||
|
public fun </*0*/ T> f(): R<T>
|
||||||
|
public operator fun kotlin.Int.plusAssign(/*0*/ y: R<kotlin.Int>): kotlin.Unit
|
||||||
|
|
||||||
|
public final class R</*0*/ T> {
|
||||||
|
public constructor R</*0*/ T>()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
@@ -9770,6 +9770,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/inference/functionPlaceholderError.kt");
|
runTest("compiler/testData/diagnostics/tests/inference/functionPlaceholderError.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("genericAssignmentOperator.kt")
|
||||||
|
public void testGenericAssignmentOperator() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/inference/genericAssignmentOperator.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("hasErrorInConstrainingTypes.kt")
|
@TestMetadata("hasErrorInConstrainingTypes.kt")
|
||||||
public void testHasErrorInConstrainingTypes() throws Exception {
|
public void testHasErrorInConstrainingTypes() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/inference/hasErrorInConstrainingTypes.kt");
|
runTest("compiler/testData/diagnostics/tests/inference/hasErrorInConstrainingTypes.kt");
|
||||||
|
|||||||
Generated
+5
@@ -9765,6 +9765,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
|
|||||||
runTest("compiler/testData/diagnostics/tests/inference/functionPlaceholderError.kt");
|
runTest("compiler/testData/diagnostics/tests/inference/functionPlaceholderError.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("genericAssignmentOperator.kt")
|
||||||
|
public void testGenericAssignmentOperator() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/inference/genericAssignmentOperator.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("hasErrorInConstrainingTypes.kt")
|
@TestMetadata("hasErrorInConstrainingTypes.kt")
|
||||||
public void testHasErrorInConstrainingTypes() throws Exception {
|
public void testHasErrorInConstrainingTypes() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/inference/hasErrorInConstrainingTypes.kt");
|
runTest("compiler/testData/diagnostics/tests/inference/hasErrorInConstrainingTypes.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user