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
}
val containingDeclaration = when {
val selectorContainer = when {
selector is ConstructorDescriptor -> selector.getContainingDeclaration().getContainingDeclaration()
else -> selector?.getContainingDeclaration()
}
if (packageView != null && (containingDeclaration is PackageFragmentDescriptor || containingDeclaration is PackageViewDescriptor)
&& getFqName(packageView) == getFqName(containingDeclaration)) {
if (packageView != null && (selectorContainer is PackageFragmentDescriptor || selectorContainer is PackageViewDescriptor)
&& getFqName(packageView) == getFqName(selectorContainer)) {
return packageView
}
if (classifier != null && containingDeclaration is ClassDescriptor && classifier == containingDeclaration) {
return classifier
}
if (classifier is ClassDescriptor && classifier.classObjectDescriptor != null) {
if (classifier is ClassDescriptor && classifier.classObjectDescriptor == selectorContainer) {
return classifier.getClassObjectReferenceTarget()
}
@@ -7,7 +7,7 @@ fun test() {
MyTrait.<warning descr="'MyTrait.Default' is deprecated. Use A instead">Default</warning>
<warning descr="'MyTrait.Default' is deprecated. Use A instead">MyTrait</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
}
@@ -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);
}
@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")
public void testClassReferenceInImport() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/ClassReferenceInImport.kt");