From 95710f4087010596c87a8b498dbc839ac6a1c2b7 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Sun, 26 May 2019 02:05:01 +0300 Subject: [PATCH] [NI] Avoid forcing resolve for array access expression #KT-31606 Fixed #EA-126523 Fixed --- .../fir/FirDiagnosticsSmokeTestGenerated.java | 5 ++ .../BasicExpressionTypingVisitor.java | 46 +++++++++++++++---- .../rewriteAtSliceOnGetOperator.kt | 18 ++++++++ .../rewriteAtSliceOnGetOperator.txt | 27 +++++++++++ .../checkers/DiagnosticsTestGenerated.java | 5 ++ .../DiagnosticsUsingJavacTestGenerated.java | 5 ++ 6 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/callableReference/rewriteAtSliceOnGetOperator.kt create mode 100644 compiler/testData/diagnostics/tests/callableReference/rewriteAtSliceOnGetOperator.txt diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java index f47e4dc1464..3e527e64541 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java @@ -1704,6 +1704,11 @@ public class FirDiagnosticsSmokeTestGenerated extends AbstractFirDiagnosticsSmok runTest("compiler/testData/diagnostics/tests/callableReference/parsingPriorityOfGenericArgumentsVsLess.kt"); } + @TestMetadata("rewriteAtSliceOnGetOperator.kt") + public void testRewriteAtSliceOnGetOperator() throws Exception { + runTest("compiler/testData/diagnostics/tests/callableReference/rewriteAtSliceOnGetOperator.kt"); + } + @TestMetadata("sam.kt") public void testSam() throws Exception { runTest("compiler/testData/diagnostics/tests/callableReference/sam.kt"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java index 084381c0d47..02c9db8543b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java @@ -1717,15 +1717,9 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { context, call, arrayAccessExpression, isGet ? OperatorNameConventions.GET : OperatorNameConventions.SET); List indices = arrayAccessExpression.getIndexExpressions(); - // The accumulated data flow info of all index expressions is saved on the last index - KotlinTypeInfo resultTypeInfo = arrayTypeInfo; - if (!indices.isEmpty()) { - resultTypeInfo = facade.getTypeInfo(indices.get(indices.size() - 1), context); - } - if (!isGet) { - resultTypeInfo = facade.getTypeInfo(rightHandSide, context); - } + KotlinTypeInfo resultTypeInfo = + computeAccumulatedInfoForArrayAccessExpression(arrayTypeInfo, indices, rightHandSide, isGet, context, facade); if ((isImplicit && !functionResults.isSuccess()) || !functionResults.isSingleResult()) { traceForResolveResult.report(isGet ? NO_GET_METHOD.on(arrayAccessExpression) : NO_SET_METHOD.on(arrayAccessExpression)); @@ -1735,4 +1729,40 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { functionResults.getResultingCall()); return resultTypeInfo.replaceType(functionResults.getResultingDescriptor().getReturnType()); } + + private static KotlinTypeInfo computeAccumulatedInfoForArrayAccessExpression( + @NotNull KotlinTypeInfo arrayTypeInfo, + @NotNull List indices, + @Nullable KtExpression rightHandSide, + boolean isGet, + @NotNull ExpressionTypingContext context, + @NotNull ExpressionTypingInternals facade + ) { + KotlinTypeInfo accumulatedTypeInfo = null; + boolean forceResolve = !context.languageVersionSettings.supportsFeature(LanguageFeature.NewInference); + + // The accumulated data flow info of all index expressions is saved on the last index + if (!indices.isEmpty()) { + accumulatedTypeInfo = getTypeInfo(indices.get(indices.size() - 1), facade, context, forceResolve); + } + + if (!isGet && rightHandSide != null) { + accumulatedTypeInfo = getTypeInfo(rightHandSide, facade, context, forceResolve); + } + + return accumulatedTypeInfo != null ? accumulatedTypeInfo : arrayTypeInfo; + } + + private static KotlinTypeInfo getTypeInfo( + @NotNull KtExpression expression, + @NotNull ExpressionTypingInternals facade, + @NotNull ExpressionTypingContext context, + boolean forceExpressionResolve + ) { + if (forceExpressionResolve) { + return facade.getTypeInfo(expression, context); + } else { + return BindingContextUtils.getRecordedTypeInfo(expression, context.trace.getBindingContext()); + } + } } diff --git a/compiler/testData/diagnostics/tests/callableReference/rewriteAtSliceOnGetOperator.kt b/compiler/testData/diagnostics/tests/callableReference/rewriteAtSliceOnGetOperator.kt new file mode 100644 index 00000000000..8fe7a6dc817 --- /dev/null +++ b/compiler/testData/diagnostics/tests/callableReference/rewriteAtSliceOnGetOperator.kt @@ -0,0 +1,18 @@ +// !LANGUAGE: +NewInference +// !DIAGNOSTICS: -UNUSED_PARAMETER + +import kotlin.reflect.KProperty1 + +class Sample(val str: String) + +class Inv + +class Form { + operator fun get(field: KProperty1<*, F>): Inv = TODO() +} + +fun foo(i: Inv) {} + +fun test(f: Form) { + foo(f[Sample::str]) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/callableReference/rewriteAtSliceOnGetOperator.txt b/compiler/testData/diagnostics/tests/callableReference/rewriteAtSliceOnGetOperator.txt new file mode 100644 index 00000000000..51de893e5e7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/callableReference/rewriteAtSliceOnGetOperator.txt @@ -0,0 +1,27 @@ +package + +public fun foo(/*0*/ i: Inv): kotlin.Unit +public fun test(/*0*/ f: Form): kotlin.Unit + +public final class Form { + public constructor Form() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final operator fun get(/*0*/ field: kotlin.reflect.KProperty1<*, F>): Inv + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Inv { + public constructor Inv() + 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 +} + +public final class Sample { + public constructor Sample(/*0*/ str: kotlin.String) + public final val str: kotlin.String + 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 +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 7c6ae029ffc..e4b82335a1c 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -1711,6 +1711,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/diagnostics/tests/callableReference/parsingPriorityOfGenericArgumentsVsLess.kt"); } + @TestMetadata("rewriteAtSliceOnGetOperator.kt") + public void testRewriteAtSliceOnGetOperator() throws Exception { + runTest("compiler/testData/diagnostics/tests/callableReference/rewriteAtSliceOnGetOperator.kt"); + } + @TestMetadata("sam.kt") public void testSam() throws Exception { runTest("compiler/testData/diagnostics/tests/callableReference/sam.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 6b511f68390..ec5a45d07d3 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -1706,6 +1706,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/callableReference/parsingPriorityOfGenericArgumentsVsLess.kt"); } + @TestMetadata("rewriteAtSliceOnGetOperator.kt") + public void testRewriteAtSliceOnGetOperator() throws Exception { + runTest("compiler/testData/diagnostics/tests/callableReference/rewriteAtSliceOnGetOperator.kt"); + } + @TestMetadata("sam.kt") public void testSam() throws Exception { runTest("compiler/testData/diagnostics/tests/callableReference/sam.kt");