diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.java index 4aa0a5fd77c..3a12bd58a4e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.java @@ -87,9 +87,11 @@ public class QualifiedExpressionResolver { } JetSimpleNameExpression referenceExpression = userType.getReferenceExpression(); + /* if (referenceExpression == null) { return Collections.emptyList(); } + */ JetUserType qualifier = userType.getQualifier(); // We do not want to resolve the last segment of a user type to a package @@ -97,11 +99,13 @@ public class QualifiedExpressionResolver { DeclarationDescriptor shouldBeVisibleFrom = outerScope.getContainingDeclaration(); if (qualifier == null) { + if (referenceExpression == null) return Collections.emptyList(); return lookupDescriptorsForSimpleNameReference(referenceExpression, filteredScope, shouldBeVisibleFrom, trace, LookupMode.ONLY_CLASSES_AND_PACKAGES, false, true); } Collection declarationDescriptors = lookupDescriptorsForUserType(qualifier, outerScope, trace, false); + if (referenceExpression == null) return Collections.emptyList(); return lookupSelectorDescriptors(referenceExpression, declarationDescriptors, trace, shouldBeVisibleFrom, LookupMode.ONLY_CLASSES_AND_PACKAGES, true); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt index b69a4ec349d..66b9b5049c8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt @@ -117,18 +117,6 @@ 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 - val classifierDescriptor = resolveClass(c.scope, type, c.trace) if (classifierDescriptor == null) { val arguments = resolveTypeProjections(c, ErrorUtils.createErrorType("No type").getConstructor(), type.getTypeArguments()) @@ -136,6 +124,10 @@ public class TypeResolver( return } + val referenceExpression = type.getReferenceExpression() + val referencedName = type.getReferencedName() + if (referenceExpression == null || referencedName == null) return + c.trace.record(BindingContext.REFERENCE_TARGET, referenceExpression, classifierDescriptor) when (classifierDescriptor) { @@ -316,6 +308,14 @@ public class TypeResolver( } public fun resolveClass(scope: JetScope, userType: JetUserType, trace: BindingTrace): ClassifierDescriptor? { + if (userType.qualifier != null) { // we must resolve all type references in arguments of qualifier type + for (typeArgument in userType.qualifier!!.typeArguments) { + typeArgument.typeReference?.let { + ForceResolveUtil.forceResolveAllContents(resolveType(scope, it, trace, true)) + } + } + } + val classifierDescriptor = qualifiedExpressionResolver.lookupDescriptorsForUserType(userType, scope, trace, true) .firstIsInstanceOrNull() if (classifierDescriptor != null) { diff --git a/idea/testData/resolve/references/ClassNameBeforeDot.kt b/idea/testData/resolve/references/ClassNameBeforeDot.kt new file mode 100644 index 00000000000..a88fa35b045 --- /dev/null +++ b/idea/testData/resolve/references/ClassNameBeforeDot.kt @@ -0,0 +1,7 @@ +class Foo + +class C { + val prop: Foo. +} + +// REF: ().Foo diff --git a/idea/testData/resolve/references/TypeArgumentBeforeDot2.kt b/idea/testData/resolve/references/TypeArgumentBeforeDot2.kt new file mode 100644 index 00000000000..045c03829db --- /dev/null +++ b/idea/testData/resolve/references/TypeArgumentBeforeDot2.kt @@ -0,0 +1,9 @@ +class Generic + +class C { + val prop: Generic<Foo>. +} + +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 e6585b4a887..75deacced56 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java @@ -77,6 +77,12 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest doTest(fileName); } + @TestMetadata("ClassNameBeforeDot.kt") + public void testClassNameBeforeDot() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/ClassNameBeforeDot.kt"); + doTest(fileName); + } + @TestMetadata("ClassObjectClassLiteralReference.kt") public void testClassObjectClassLiteralReference() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/ClassObjectClassLiteralReference.kt"); @@ -359,6 +365,12 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest doTest(fileName); } + @TestMetadata("TypeArgumentBeforeDot2.kt") + public void testTypeArgumentBeforeDot2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/TypeArgumentBeforeDot2.kt"); + doTest(fileName); + } + @TestMetadata("TypeArgumentUnresolvedClass.kt") public void testTypeArgumentUnresolvedClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/TypeArgumentUnresolvedClass.kt");