From d728417f7f2b7e38f55a4cf973fa78c6c8a2aea9 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 12 Oct 2015 21:12:33 +0300 Subject: [PATCH] Fixed KT-9496 FQ-class name inserted in type argument on copy/paste #KT-9496 Fixed --- .../kotlin/resolve/calls/CallResolver.java | 16 ++++++++++++++++ .../kotlin/resolve/calls/CandidateResolver.kt | 13 +++---------- .../diagnostics/tests/StarsInFunctionCalls.kt | 2 +- .../resolve/resolveTypeArgsForUnresolvedCall.kt | 4 ++++ .../resolve/resolveTypeArgsForUnresolvedCall.txt | 3 +++ .../checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ .../imports/TypeArgForUnresolvedCall.expected.kt | 6 ++++++ .../TypeArgForUnresolvedCall.expected.names | 1 + .../imports/TypeArgForUnresolvedCall.kt | 5 +++++ .../imports/TypeArgForUnresolvedCall.to.kt | 3 +++ .../InsertImportOnPasteTestGenerated.java | 12 ++++++++++++ 11 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/resolve/resolveTypeArgsForUnresolvedCall.kt create mode 100644 compiler/testData/diagnostics/tests/resolve/resolveTypeArgsForUnresolvedCall.txt create mode 100644 idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.expected.kt create mode 100644 idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.expected.names create mode 100644 idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.kt create mode 100644 idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.to.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java index c7ed4ccf592..e946a3dec96 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java @@ -46,6 +46,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.*; import org.jetbrains.kotlin.resolve.calls.tasks.collectors.CallableDescriptorCollectors; import org.jetbrains.kotlin.resolve.calls.util.CallMaker; import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage; +import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil; import org.jetbrains.kotlin.resolve.scopes.LexicalScope; import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue; @@ -558,6 +559,21 @@ public class CallResolver { if (context.checkArguments == CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS) { argumentTypeResolver.analyzeArgumentsAndRecordTypes(context); } + + List typeArguments = context.call.getTypeArguments(); + for (JetTypeProjection projection : typeArguments) { + if (projection.getProjectionKind() != JetProjectionKind.NONE) { + context.trace.report(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT.on(projection)); + ModifierCheckerCore.INSTANCE.check(projection, context.trace, null); + } + JetType type = argumentTypeResolver.resolveTypeRefWithDefault( + projection.getTypeReference(), context.scope, context.trace, + null); + if (type != null) { + ForceResolveUtil.forceResolveAllContents(type); + } + } + Collection> allCandidates = Lists.newArrayList(); OverloadResolutionResultsImpl successfulResults = null; TemporaryBindingTrace traceForFirstNonemptyCandidateSet = null; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CandidateResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CandidateResolver.kt index b22abe61293..60a95dd2a3d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CandidateResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CandidateResolver.kt @@ -21,7 +21,6 @@ import com.google.common.collect.Sets import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.ReflectionTypes import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.diagnostics.Errors.PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT import org.jetbrains.kotlin.diagnostics.Errors.SUPER_CANT_BE_EXTENSION_RECEIVER import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus import org.jetbrains.kotlin.psi.* @@ -46,7 +45,6 @@ import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager import org.jetbrains.kotlin.resolve.calls.tasks.ResolutionTask import org.jetbrains.kotlin.resolve.calls.tasks.isSynthesizedInvoke import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject -import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.types.* @@ -118,16 +116,11 @@ public class CandidateResolver( val typeArguments = ArrayList() for (projection in jetTypeArguments) { - if (projection.getProjectionKind() != JetProjectionKind.NONE) { - trace.report(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT.on(projection)) - ModifierCheckerCore.check(projection, trace, null) - } - val type = argumentTypeResolver.resolveTypeRefWithDefault( - projection.getTypeReference(), scope, trace, - ErrorUtils.createErrorType("Star projection in a call"))!! - ForceResolveUtil.forceResolveAllContents(type) + val type = projection.typeReference?.let { trace.bindingContext.get(BindingContext.TYPE, it) } + ?: ErrorUtils.createErrorType("Star projection in a call") typeArguments.add(type) } + val expectedTypeArgumentCount = candidateDescriptor.getTypeParameters().size() for (index in jetTypeArguments.size()..expectedTypeArgumentCount - 1) { typeArguments.add(ErrorUtils.createErrorType( diff --git a/compiler/testData/diagnostics/tests/StarsInFunctionCalls.kt b/compiler/testData/diagnostics/tests/StarsInFunctionCalls.kt index 525d57ad2e8..2a7f60af188 100644 --- a/compiler/testData/diagnostics/tests/StarsInFunctionCalls.kt +++ b/compiler/testData/diagnostics/tests/StarsInFunctionCalls.kt @@ -5,7 +5,7 @@ fun foo(a : Any?) {} public fun main() { getT<*>() - ggetT<*>() + ggetT<*>() getTT<*, *>() getTT<*, Int>() getTT*>() diff --git a/compiler/testData/diagnostics/tests/resolve/resolveTypeArgsForUnresolvedCall.kt b/compiler/testData/diagnostics/tests/resolve/resolveTypeArgsForUnresolvedCall.kt new file mode 100644 index 00000000000..0abb973ecd9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/resolve/resolveTypeArgsForUnresolvedCall.kt @@ -0,0 +1,4 @@ +fun foo() { + x.yyy<XXX>() + x.yyy() +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/resolve/resolveTypeArgsForUnresolvedCall.txt b/compiler/testData/diagnostics/tests/resolve/resolveTypeArgsForUnresolvedCall.txt new file mode 100644 index 00000000000..65a6ac47e1f --- /dev/null +++ b/compiler/testData/diagnostics/tests/resolve/resolveTypeArgsForUnresolvedCall.txt @@ -0,0 +1,3 @@ +package + +public fun foo(): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 39b9199d6cc..bd874b0d289 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -12603,6 +12603,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("resolveTypeArgsForUnresolvedCall.kt") + public void testResolveTypeArgsForUnresolvedCall() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/resolve/resolveTypeArgsForUnresolvedCall.kt"); + doTest(fileName); + } + @TestMetadata("resolveWithFunctionLiteralWithId.kt") public void testResolveWithFunctionLiteralWithId() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/resolve/resolveWithFunctionLiteralWithId.kt"); diff --git a/idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.expected.kt b/idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.expected.kt new file mode 100644 index 00000000000..01d4d005f71 --- /dev/null +++ b/idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.expected.kt @@ -0,0 +1,6 @@ +// ERROR: Unresolved reference: list +import java.io.File + +fun file() { + list.filterIsInstance() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.expected.names b/idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.expected.names new file mode 100644 index 00000000000..59de4646c43 --- /dev/null +++ b/idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.expected.names @@ -0,0 +1 @@ +java.io.File diff --git a/idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.kt b/idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.kt new file mode 100644 index 00000000000..c90ac9fc877 --- /dev/null +++ b/idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.kt @@ -0,0 +1,5 @@ +import java.io.File + +fun file(list: List) { + list.filterIsInstance() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.to.kt b/idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.to.kt new file mode 100644 index 00000000000..a69483d80a2 --- /dev/null +++ b/idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.to.kt @@ -0,0 +1,3 @@ +fun file() { + +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java index 2fefad7bfb0..5e979c27023 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java @@ -361,6 +361,12 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast doTestCopy(fileName); } + @TestMetadata("TypeArgForUnresolvedCall.kt") + public void testTypeArgForUnresolvedCall() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.kt"); + doTestCopy(fileName); + } + @TestMetadata("TypeParameter.kt") public void testTypeParameter() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/imports/TypeParameter.kt"); @@ -700,6 +706,12 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast doTestCut(fileName); } + @TestMetadata("TypeArgForUnresolvedCall.kt") + public void testTypeArgForUnresolvedCall() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/imports/TypeArgForUnresolvedCall.kt"); + doTestCut(fileName); + } + @TestMetadata("TypeParameter.kt") public void testTypeParameter() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/imports/TypeParameter.kt");