diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt index 4e7b237cff8..b69a4ec349d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt @@ -117,6 +117,14 @@ public class TypeResolver( var result: PossiblyBareType? = null typeElement?.accept(object : JetVisitorVoid() { override fun visitUserType(type: JetUserType) { + if (type.qualifier != null) { // we must resolve all type references in arguments of qualifier type + for (typeArgument in type.qualifier!!.typeArguments) { + typeArgument.typeReference?.let { + ForceResolveUtil.forceResolveAllContents(resolveType(c, it)) + } + } + } + val referenceExpression = type.getReferenceExpression() val referencedName = type.getReferencedName() if (referenceExpression == null || referencedName == null) return diff --git a/idea/idea-completion/testData/basic/common/TypeArgFromTheSameFile.kt b/idea/idea-completion/testData/basic/common/TypeArgFromTheSameFile.kt new file mode 100644 index 00000000000..c50f3700093 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/TypeArgFromTheSameFile.kt @@ -0,0 +1,7 @@ +class C { + val prop: List> +} + +class Foo + +// EXIST: Foo diff --git a/idea/idea-completion/testData/basic/common/TypeArgOfOwnerClass.kt b/idea/idea-completion/testData/basic/common/TypeArgOfOwnerClass.kt new file mode 100644 index 00000000000..96aaa1d28d1 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/TypeArgOfOwnerClass.kt @@ -0,0 +1,5 @@ +class C { + val v: List +} + +// EXIST: TParam diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java index 7ae4beb8437..be92bd64197 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java @@ -901,6 +901,18 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("TypeArgFromTheSameFile.kt") + public void testTypeArgFromTheSameFile() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/TypeArgFromTheSameFile.kt"); + doTest(fileName); + } + + @TestMetadata("TypeArgOfOwnerClass.kt") + public void testTypeArgOfOwnerClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/TypeArgOfOwnerClass.kt"); + doTest(fileName); + } + @TestMetadata("TypeParameterFromOuterClass.kt") public void testTypeParameterFromOuterClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/TypeParameterFromOuterClass.kt"); diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java index 243d6a426da..9c7a5c9f583 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java @@ -901,6 +901,18 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("TypeArgFromTheSameFile.kt") + public void testTypeArgFromTheSameFile() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/TypeArgFromTheSameFile.kt"); + doTest(fileName); + } + + @TestMetadata("TypeArgOfOwnerClass.kt") + public void testTypeArgOfOwnerClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/TypeArgOfOwnerClass.kt"); + doTest(fileName); + } + @TestMetadata("TypeParameterFromOuterClass.kt") public void testTypeParameterFromOuterClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/TypeParameterFromOuterClass.kt"); diff --git a/idea/testData/resolve/references/TypeArgumentBeforeDot.kt b/idea/testData/resolve/references/TypeArgumentBeforeDot.kt new file mode 100644 index 00000000000..9157a78e603 --- /dev/null +++ b/idea/testData/resolve/references/TypeArgumentBeforeDot.kt @@ -0,0 +1,11 @@ +class Generic { + class Nested +} + +class C { + val prop: Generic<Foo>.Nested? = null +} + +class Foo + +// REF: ().Foo diff --git a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java index 383032882b9..e6585b4a887 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java @@ -353,6 +353,12 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest doTest(fileName); } + @TestMetadata("TypeArgumentBeforeDot.kt") + public void testTypeArgumentBeforeDot() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/TypeArgumentBeforeDot.kt"); + doTest(fileName); + } + @TestMetadata("TypeArgumentUnresolvedClass.kt") public void testTypeArgumentUnresolvedClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/TypeArgumentUnresolvedClass.kt");