From f658cce1f10dec719cfe398754768699f7355c40 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 7 Aug 2015 21:01:57 +0300 Subject: [PATCH] KT-8176 References to type arguments are not resolved when number of them does not match type parameters KT-8078 FQ-name inserted on class name completion in type arguments #KT-8176 Fixed #KT-8078 Fixed --- .../org/jetbrains/kotlin/resolve/TypeResolver.kt | 13 ++++++++++--- .../testData/handlers/basic/FirstTypeArgument.kt | 5 +++++ .../handlers/basic/FirstTypeArgument.kt.after | 5 +++++ .../BasicCompletionHandlerTestGenerated.java | 6 ++++++ .../imports/DependencyOnStdLib.expected.names | 3 +-- .../references/TypeArgumentUnresolvedClass.kt | 3 +++ .../resolve/references/TypeArgumentWrongNumber.kt | 5 +++++ .../idea/resolve/ReferenceResolveTestGenerated.java | 12 ++++++++++++ 8 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 idea/idea-completion/testData/handlers/basic/FirstTypeArgument.kt create mode 100644 idea/idea-completion/testData/handlers/basic/FirstTypeArgument.kt.after create mode 100644 idea/testData/resolve/references/TypeArgumentUnresolvedClass.kt create mode 100644 idea/testData/resolve/references/TypeArgumentWrongNumber.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt index 258a8aa2a4d..4e7b237cff8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.diagnostics.Errors.* -import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.codeFragmentUtil.debugTypeInfo import org.jetbrains.kotlin.psi.debugText.getDebugText @@ -124,7 +123,8 @@ public class TypeResolver( val classifierDescriptor = resolveClass(c.scope, type, c.trace) if (classifierDescriptor == null) { - resolveTypeProjections(c, ErrorUtils.createErrorType("No type").getConstructor(), type.getTypeArguments()) + val arguments = resolveTypeProjections(c, ErrorUtils.createErrorType("No type").getConstructor(), type.getTypeArguments()) + result = type(ErrorUtils.createErrorTypeWithArguments(type.getDebugText(), arguments)) return } @@ -162,7 +162,7 @@ public class TypeResolver( val expectedArgumentCount = parameters.size() val actualArgumentCount = arguments.size() if (ErrorUtils.isError(classifierDescriptor)) { - result = type(ErrorUtils.createErrorType("[Error type: " + typeConstructor + "]")) + result = type(ErrorUtils.createErrorTypeWithArguments("[Error type: " + typeConstructor + "]", arguments)) } else { if (actualArgumentCount != expectedArgumentCount) { @@ -251,6 +251,13 @@ public class TypeResolver( c.trace.report(UNSUPPORTED.on(element, "Self-types are not supported yet")) } }) + + if (result != null && !result!!.isBare) { + for (argument in result!!.actualType.arguments) { + ForceResolveUtil.forceResolveAllContents(argument.type) + } + } + return result ?: type(ErrorUtils.createErrorType(typeElement?.getDebugText() ?: "No type element")) } diff --git a/idea/idea-completion/testData/handlers/basic/FirstTypeArgument.kt b/idea/idea-completion/testData/handlers/basic/FirstTypeArgument.kt new file mode 100644 index 00000000000..4bcde02b862 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/FirstTypeArgument.kt @@ -0,0 +1,5 @@ +class Foo + +class Bar: Foo + +// ELEMENT: StringBuilder \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/basic/FirstTypeArgument.kt.after b/idea/idea-completion/testData/handlers/basic/FirstTypeArgument.kt.after new file mode 100644 index 00000000000..8158e77a1f4 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/FirstTypeArgument.kt.after @@ -0,0 +1,5 @@ +class Foo + +class Bar: Foo + +// ELEMENT: StringBuilder \ No newline at end of file diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java index 91a7d9cd735..06f06a3a066 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java @@ -53,6 +53,12 @@ public class BasicCompletionHandlerTestGenerated extends AbstractBasicCompletion doTest(fileName); } + @TestMetadata("FirstTypeArgument.kt") + public void testFirstTypeArgument() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/FirstTypeArgument.kt"); + doTest(fileName); + } + @TestMetadata("GenericFunctionWithTab.kt") public void testGenericFunctionWithTab() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/GenericFunctionWithTab.kt"); diff --git a/idea/testData/copyPaste/imports/DependencyOnStdLib.expected.names b/idea/testData/copyPaste/imports/DependencyOnStdLib.expected.names index 2a89ec4170a..e036d44ad10 100644 --- a/idea/testData/copyPaste/imports/DependencyOnStdLib.expected.names +++ b/idea/testData/copyPaste/imports/DependencyOnStdLib.expected.names @@ -1,2 +1 @@ -kotlin.Int -kotlin.properties.ObservableProperty +kotlin.properties.ObservableProperty \ No newline at end of file diff --git a/idea/testData/resolve/references/TypeArgumentUnresolvedClass.kt b/idea/testData/resolve/references/TypeArgumentUnresolvedClass.kt new file mode 100644 index 00000000000..e71361f94d8 --- /dev/null +++ b/idea/testData/resolve/references/TypeArgumentUnresolvedClass.kt @@ -0,0 +1,3 @@ +val v: UnknownClass<String> + +// REF: (kotlin).String diff --git a/idea/testData/resolve/references/TypeArgumentWrongNumber.kt b/idea/testData/resolve/references/TypeArgumentWrongNumber.kt new file mode 100644 index 00000000000..232ee88a284 --- /dev/null +++ b/idea/testData/resolve/references/TypeArgumentWrongNumber.kt @@ -0,0 +1,5 @@ +class Foo + +class Bar: Foo<String + +// REF: (kotlin).String diff --git a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java index afaea8b1dc3..383032882b9 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java @@ -353,6 +353,18 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest doTest(fileName); } + @TestMetadata("TypeArgumentUnresolvedClass.kt") + public void testTypeArgumentUnresolvedClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/TypeArgumentUnresolvedClass.kt"); + doTest(fileName); + } + + @TestMetadata("TypeArgumentWrongNumber.kt") + public void testTypeArgumentWrongNumber() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/TypeArgumentWrongNumber.kt"); + doTest(fileName); + } + @TestMetadata("TypeParameterInAnonymousObject.kt") public void testTypeParameterInAnonymousObject() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/TypeParameterInAnonymousObject.kt");