提交 d728417f 编写于 作者: V Valentin Kipyatkov

Fixed KT-9496 FQ-class name inserted in type argument on copy/paste

 #KT-9496 Fixed
上级 f4e1f535
...@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.*; ...@@ -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.tasks.collectors.CallableDescriptorCollectors;
import org.jetbrains.kotlin.resolve.calls.util.CallMaker; import org.jetbrains.kotlin.resolve.calls.util.CallMaker;
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage; 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.LexicalScope;
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver;
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue;
...@@ -558,6 +559,21 @@ public class CallResolver { ...@@ -558,6 +559,21 @@ public class CallResolver {
if (context.checkArguments == CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS) { if (context.checkArguments == CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS) {
argumentTypeResolver.analyzeArgumentsAndRecordTypes(context); argumentTypeResolver.analyzeArgumentsAndRecordTypes(context);
} }
List<JetTypeProjection> 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<ResolvedCall<F>> allCandidates = Lists.newArrayList(); Collection<ResolvedCall<F>> allCandidates = Lists.newArrayList();
OverloadResolutionResultsImpl<F> successfulResults = null; OverloadResolutionResultsImpl<F> successfulResults = null;
TemporaryBindingTrace traceForFirstNonemptyCandidateSet = null; TemporaryBindingTrace traceForFirstNonemptyCandidateSet = null;
......
...@@ -21,7 +21,6 @@ import com.google.common.collect.Sets ...@@ -21,7 +21,6 @@ import com.google.common.collect.Sets
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.ReflectionTypes import org.jetbrains.kotlin.builtins.ReflectionTypes
import org.jetbrains.kotlin.descriptors.* 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.diagnostics.Errors.SUPER_CANT_BE_EXTENSION_RECEIVER
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
...@@ -46,7 +45,6 @@ import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager ...@@ -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.ResolutionTask
import org.jetbrains.kotlin.resolve.calls.tasks.isSynthesizedInvoke import org.jetbrains.kotlin.resolve.calls.tasks.isSynthesizedInvoke
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject 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.ExpressionReceiver
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.*
...@@ -118,16 +116,11 @@ public class CandidateResolver( ...@@ -118,16 +116,11 @@ public class CandidateResolver(
val typeArguments = ArrayList<JetType>() val typeArguments = ArrayList<JetType>()
for (projection in jetTypeArguments) { for (projection in jetTypeArguments) {
if (projection.getProjectionKind() != JetProjectionKind.NONE) { val type = projection.typeReference?.let { trace.bindingContext.get(BindingContext.TYPE, it) }
trace.report(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT.on(projection)) ?: ErrorUtils.createErrorType("Star projection in a call")
ModifierCheckerCore.check(projection, trace, null)
}
val type = argumentTypeResolver.resolveTypeRefWithDefault(
projection.getTypeReference(), scope, trace,
ErrorUtils.createErrorType("Star projection in a call"))!!
ForceResolveUtil.forceResolveAllContents(type)
typeArguments.add(type) typeArguments.add(type)
} }
val expectedTypeArgumentCount = candidateDescriptor.getTypeParameters().size() val expectedTypeArgumentCount = candidateDescriptor.getTypeParameters().size()
for (index in jetTypeArguments.size()..expectedTypeArgumentCount - 1) { for (index in jetTypeArguments.size()..expectedTypeArgumentCount - 1) {
typeArguments.add(ErrorUtils.createErrorType( typeArguments.add(ErrorUtils.createErrorType(
......
...@@ -5,7 +5,7 @@ fun foo(<!UNUSED_PARAMETER!>a<!> : Any?) {} ...@@ -5,7 +5,7 @@ fun foo(<!UNUSED_PARAMETER!>a<!> : Any?) {}
public fun main() { public fun main() {
getT<<!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>*<!>>() getT<<!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>*<!>>()
<!UNRESOLVED_REFERENCE!>ggetT<!><<!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>*<!>>() <!UNRESOLVED_REFERENCE!>ggetT<!><<!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>*<!>>()
getTT<<!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>*<!>, <!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>*<!>>() getTT<<!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>*<!>, <!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>*<!>>()
getTT<<!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>*<!>, Int>() getTT<<!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>*<!>, Int>()
getTT<Int, <!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>*<!>>() getTT<Int, <!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>*<!>>()
......
fun foo() {
<!UNRESOLVED_REFERENCE!>x<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>yyy<!><<!UNRESOLVED_REFERENCE!>XXX<!>>()
<!UNRESOLVED_REFERENCE!>x<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>yyy<!><Int>()
}
\ No newline at end of file
...@@ -12603,6 +12603,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { ...@@ -12603,6 +12603,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
doTest(fileName); 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") @TestMetadata("resolveWithFunctionLiteralWithId.kt")
public void testResolveWithFunctionLiteralWithId() throws Exception { public void testResolveWithFunctionLiteralWithId() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/resolve/resolveWithFunctionLiteralWithId.kt"); String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/resolve/resolveWithFunctionLiteralWithId.kt");
......
// ERROR: Unresolved reference: list
import java.io.File
fun file() {
list.filterIsInstance<File>()
}
\ No newline at end of file
import java.io.File
fun file(list: List<Any>) {
<selection>list.filterIsInstance<File>()</selection>
}
\ No newline at end of file
fun file() {
<caret>
}
\ No newline at end of file
...@@ -361,6 +361,12 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast ...@@ -361,6 +361,12 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast
doTestCopy(fileName); 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") @TestMetadata("TypeParameter.kt")
public void testTypeParameter() throws Exception { public void testTypeParameter() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/imports/TypeParameter.kt"); String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/imports/TypeParameter.kt");
...@@ -700,6 +706,12 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast ...@@ -700,6 +706,12 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast
doTestCut(fileName); 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") @TestMetadata("TypeParameter.kt")
public void testTypeParameter() throws Exception { public void testTypeParameter() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/imports/TypeParameter.kt"); String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/imports/TypeParameter.kt");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册