From 640d2de5b95b45cacd6b835d412306b7253bd10d Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Tue, 17 Feb 2015 19:57:26 +0300 Subject: [PATCH] Fix incorrect reference target for class literals in some cases --- .../kotlin/resolve/scopes/receivers/Qualifier.kt | 11 ++++------- idea/testData/highlighter/deprecated/ClassObject.kt | 2 +- .../references/ClassObjectClassLiteralReference.kt | 12 ++++++++++++ .../ClassObjectClassLiteralReferenceWithField.kt | 13 +++++++++++++ .../idea/resolve/ReferenceResolveTestGenerated.java | 12 ++++++++++++ 5 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 idea/testData/resolve/references/ClassObjectClassLiteralReference.kt create mode 100644 idea/testData/resolve/references/ClassObjectClassLiteralReferenceWithField.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt index cd92d9fe6e6..9ea9a9bb7bc 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt @@ -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() } diff --git a/idea/testData/highlighter/deprecated/ClassObject.kt b/idea/testData/highlighter/deprecated/ClassObject.kt index ebea55e9309..b5a68f2f35c 100644 --- a/idea/testData/highlighter/deprecated/ClassObject.kt +++ b/idea/testData/highlighter/deprecated/ClassObject.kt @@ -7,7 +7,7 @@ fun test() { MyTrait.Default MyTrait MyClass.Default - MyClass.Default.test + MyClass.Default.test a == b } diff --git a/idea/testData/resolve/references/ClassObjectClassLiteralReference.kt b/idea/testData/resolve/references/ClassObjectClassLiteralReference.kt new file mode 100644 index 00000000000..264f019adbf --- /dev/null +++ b/idea/testData/resolve/references/ClassObjectClassLiteralReference.kt @@ -0,0 +1,12 @@ +package t + +class A { + class object Named { + } +} + +fun f() { + A.Named +} + +// REF: (t).A \ No newline at end of file diff --git a/idea/testData/resolve/references/ClassObjectClassLiteralReferenceWithField.kt b/idea/testData/resolve/references/ClassObjectClassLiteralReferenceWithField.kt new file mode 100644 index 00000000000..497af07deba --- /dev/null +++ b/idea/testData/resolve/references/ClassObjectClassLiteralReferenceWithField.kt @@ -0,0 +1,13 @@ +package t + +class A { + class object Named { + val i: Int + } +} + +fun f() { + A.Named.i +} + +// REF: (t).A \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java index 98b9e97d1ed..bb6bde280d4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java @@ -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");