From 9877fe1a269077e6126e53fe1c7fe9cb48de3841 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 21 Oct 2015 14:42:39 +0300 Subject: [PATCH] Fixed the call completer to update the type of the argument expression correctly --- .../resolve/calls/ArgumentTypeResolver.java | 7 ++++--- .../kotlin/resolve/calls/CallCompleter.kt | 2 +- .../elvis/kt6694ExactAnnotationForElvis.kt | 19 +++++++++++++++++++ .../BlackBoxCodegenTestGenerated.java | 6 ++++++ 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/box/elvis/kt6694ExactAnnotationForElvis.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ArgumentTypeResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ArgumentTypeResolver.java index 656e138e65b..4f3c2bb1efe 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ArgumentTypeResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ArgumentTypeResolver.java @@ -149,7 +149,7 @@ public class ArgumentTypeResolver { private void checkArgumentTypeWithNoCallee(CallResolutionContext context, KtExpression argumentExpression) { expressionTypingServices.getTypeInfo(argumentExpression, context.replaceExpectedType(NO_EXPECTED_TYPE)); - updateResultArgumentTypeIfNotDenotable(context, argumentExpression); + updateResultArgumentTypeIfNotDenotable(context, argumentExpression, null); } public static boolean isFunctionLiteralArgument( @@ -349,9 +349,10 @@ public class ArgumentTypeResolver { @Nullable public KotlinType updateResultArgumentTypeIfNotDenotable( @NotNull ResolutionContext context, - @NotNull KtExpression expression + @NotNull KtExpression expression, + @Nullable KotlinType argumentType ) { - KotlinType type = context.trace.getType(expression); + KotlinType type = (argumentType != null) ? argumentType : context.trace.getType(expression); if (type != null && !type.getConstructor().isDenotable()) { if (type.getConstructor() instanceof IntegerValueTypeConstructor) { IntegerValueTypeConstructor constructor = (IntegerValueTypeConstructor) type.getConstructor(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt index 269a29646bf..2ed8ce01e43 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt @@ -251,7 +251,7 @@ public class CallCompleter( // For the cases like 'foo(1)' the type of '1' depends on expected type (it can be Int, Byte, etc.), // so while the expected type is not known, it's IntegerValueType(1), and should be updated when the expected type is known. if (recordedType != null && !recordedType.getConstructor().isDenotable()) { - updatedType = argumentTypeResolver.updateResultArgumentTypeIfNotDenotable(context, expression) + updatedType = argumentTypeResolver.updateResultArgumentTypeIfNotDenotable(context, expression, updatedType) } updatedType = updateRecordedTypeForArgument(updatedType, recordedType, expression, context.trace) diff --git a/compiler/testData/codegen/box/elvis/kt6694ExactAnnotationForElvis.kt b/compiler/testData/codegen/box/elvis/kt6694ExactAnnotationForElvis.kt new file mode 100644 index 00000000000..af26c6e87f2 --- /dev/null +++ b/compiler/testData/codegen/box/elvis/kt6694ExactAnnotationForElvis.kt @@ -0,0 +1,19 @@ +interface PsiElement { + fun findChildByType(i: Int): T? = + if (i == 42) JetOperationReferenceExpression() as T else throw Exception() +} +interface JetSimpleNameExpression : PsiElement { + fun getReferencedNameElement(): PsiElement +} +class JetOperationReferenceExpression : JetSimpleNameExpression { + override fun getReferencedNameElement() = this +} +class JetLabelReferenceExpression : JetSimpleNameExpression { + public override fun getReferencedNameElement(): PsiElement = + findChildByType(42) ?: this +} + +fun box(): String { + val element = JetLabelReferenceExpression().getReferencedNameElement() + return if (element is JetOperationReferenceExpression) "OK" else "fail" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java index 4cb7bc89229..7672e071332 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -3367,6 +3367,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("kt6694ExactAnnotationForElvis.kt") + public void testKt6694ExactAnnotationForElvis() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/elvis/kt6694ExactAnnotationForElvis.kt"); + doTest(fileName); + } + @TestMetadata("primitive.kt") public void testPrimitive() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/elvis/primitive.kt");