Fix incorrect reference target for class literals in some cases

This commit is contained in:
Pavel V. Talanov
2015-02-17 19:57:26 +03:00
parent 88c5379424
commit 640d2de5b9
5 changed files with 42 additions and 8 deletions
@@ -161,20 +161,17 @@ private fun QualifierReceiver.resolveReferenceTarget(selector: DeclarationDescri
return classifier return classifier
} }
val containingDeclaration = when { val selectorContainer = when {
selector is ConstructorDescriptor -> selector.getContainingDeclaration().getContainingDeclaration() selector is ConstructorDescriptor -> selector.getContainingDeclaration().getContainingDeclaration()
else -> selector?.getContainingDeclaration() else -> selector?.getContainingDeclaration()
} }
if (packageView != null && (containingDeclaration is PackageFragmentDescriptor || containingDeclaration is PackageViewDescriptor) if (packageView != null && (selectorContainer is PackageFragmentDescriptor || selectorContainer is PackageViewDescriptor)
&& getFqName(packageView) == getFqName(containingDeclaration)) { && getFqName(packageView) == getFqName(selectorContainer)) {
return packageView return packageView
} }
if (classifier != null && containingDeclaration is ClassDescriptor && classifier == containingDeclaration) { if (classifier is ClassDescriptor && classifier.classObjectDescriptor == selectorContainer) {
return classifier
}
if (classifier is ClassDescriptor && classifier.classObjectDescriptor != null) {
return classifier.getClassObjectReferenceTarget() return classifier.getClassObjectReferenceTarget()
} }
@@ -7,7 +7,7 @@ fun test() {
MyTrait.<warning descr="'MyTrait.Default' is deprecated. Use A instead">Default</warning> MyTrait.<warning descr="'MyTrait.Default' is deprecated. Use A instead">Default</warning>
<warning descr="'MyTrait.Default' is deprecated. Use A instead">MyTrait</warning> <warning descr="'MyTrait.Default' is deprecated. Use A instead">MyTrait</warning>
MyClass.<warning descr="'MyClass.Default' is deprecated. Use A instead">Default</warning> MyClass.<warning descr="'MyClass.Default' is deprecated. Use A instead">Default</warning>
<warning descr="'MyClass.Default' is deprecated. Use A instead">MyClass</warning>.<warning descr="'MyClass.Default' is deprecated. Use A instead">Default</warning>.test MyClass.<warning descr="'MyClass.Default' is deprecated. Use A instead">Default</warning>.test
a == b a == b
} }
@@ -0,0 +1,12 @@
package t
class A {
class object Named {
}
}
fun f() {
<caret>A.Named
}
// REF: (t).A
@@ -0,0 +1,13 @@
package t
class A {
class object Named {
val i: Int
}
}
fun f() {
<caret>A.Named.i
}
// REF: (t).A
@@ -83,6 +83,18 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest
doTest(fileName); doTest(fileName);
} }
@TestMetadata("ClassObjectClassLiteralReference.kt")
public void testClassObjectClassLiteralReference() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/ClassObjectClassLiteralReference.kt");
doTest(fileName);
}
@TestMetadata("ClassObjectClassLiteralReferenceWithField.kt")
public void testClassObjectClassLiteralReferenceWithField() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/ClassObjectClassLiteralReferenceWithField.kt");
doTest(fileName);
}
@TestMetadata("ClassReferenceInImport.kt") @TestMetadata("ClassReferenceInImport.kt")
public void testClassReferenceInImport() throws Exception { public void testClassReferenceInImport() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/ClassReferenceInImport.kt"); String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/ClassReferenceInImport.kt");