diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetMultiDeclarationReference.kt b/idea/src/org/jetbrains/jet/plugin/references/JetMultiDeclarationReference.kt new file mode 100644 index 00000000000..64337043d81 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/references/JetMultiDeclarationReference.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.references + +import org.jetbrains.jet.lang.psi.JetMultiDeclaration +import org.jetbrains.jet.lang.resolve.BindingContext +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor +import com.intellij.openapi.util.TextRange + +class JetMultiDeclarationReference(element: JetMultiDeclaration) : JetMultiReference(element) { + override fun getTargetDescriptors(context: BindingContext): Collection { + return expression.getEntries().map { entry -> + //TODO: remove getOriginal + context.get(BindingContext.COMPONENT_RESOLVED_CALL, entry)?.getCandidateDescriptor()?.getOriginal() + }.filterNotNull() + } + + + override fun getRangeInElement(): TextRange? { + val entries = expression.getEntries() + if (entries.isEmpty()) { + return TextRange.EMPTY_RANGE + } + val start = entries.first!!.getStartOffsetInParent() + val end = entries.last!!.getStartOffsetInParent() + entries.last!!.getTextLength() + return TextRange(start, end) + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetReferenceContributor.kt b/idea/src/org/jetbrains/jet/plugin/references/JetReferenceContributor.kt index 5af663ee1a3..6048d0bc86b 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetReferenceContributor.kt +++ b/idea/src/org/jetbrains/jet/plugin/references/JetReferenceContributor.kt @@ -45,6 +45,9 @@ public class JetReferenceContributor() : PsiReferenceContributor() { registerProvider(javaClass()) { JetPropertyDelegationMethodsReference(it) } + registerProvider(javaClass()) { + JetMultiDeclarationReference(it) + } } } diff --git a/idea/testData/copyPaste/imports/MultiDeclaration.expected.kt b/idea/testData/copyPaste/imports/MultiDeclaration.expected.kt new file mode 100644 index 00000000000..04e928d7d22 --- /dev/null +++ b/idea/testData/copyPaste/imports/MultiDeclaration.expected.kt @@ -0,0 +1,9 @@ +package to + +import a.A +import a.component1 +import a.component2 + +fun f() { + val (a, b) = A() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/MultiDeclaration.kt b/idea/testData/copyPaste/imports/MultiDeclaration.kt new file mode 100644 index 00000000000..b7c730c73c2 --- /dev/null +++ b/idea/testData/copyPaste/imports/MultiDeclaration.kt @@ -0,0 +1,11 @@ +package a + +class A() { +} + +fun A.component1() = 1 +fun A.component2() = 2 + +fun f() { + val (a, b) = A() +} \ No newline at end of file diff --git a/idea/testData/resolve/referenceWithLib/multiDeclarationWithTypeParameters.kt b/idea/testData/resolve/referenceWithLib/multiDeclarationWithTypeParameters.kt new file mode 100644 index 00000000000..3b87ffecffe --- /dev/null +++ b/idea/testData/resolve/referenceWithLib/multiDeclarationWithTypeParameters.kt @@ -0,0 +1,13 @@ +package test + +import dependency.* + +fun f(l: List) { + val (el1, el2, el3) = l +} + +// MULTIRESOLVE +// REF: (for kotlin.List in dependency).component1() +// REF: (for kotlin.List in dependency).component2() +// REF: (for kotlin.List in dependency).component3() + diff --git a/idea/testData/resolve/referenceWithLib/multiDeclarationWithTypeParametersSrc/multiDeclarationWithTypeParametersDependency.kt b/idea/testData/resolve/referenceWithLib/multiDeclarationWithTypeParametersSrc/multiDeclarationWithTypeParametersDependency.kt new file mode 100644 index 00000000000..1b17e46b082 --- /dev/null +++ b/idea/testData/resolve/referenceWithLib/multiDeclarationWithTypeParametersSrc/multiDeclarationWithTypeParametersDependency.kt @@ -0,0 +1,5 @@ +package dependency + +fun List.component1() = get(0) +fun List.component2() = get(1) +fun List.component3() = get(2) \ No newline at end of file diff --git a/idea/testData/resolve/references/MultiDeclarationReference.kt b/idea/testData/resolve/references/MultiDeclarationReference.kt new file mode 100644 index 00000000000..d834fbc5f86 --- /dev/null +++ b/idea/testData/resolve/references/MultiDeclarationReference.kt @@ -0,0 +1,15 @@ +package a + +class A() { +} + +fun A.component1() = 1 +fun A.component2() = 1 + +fun main(args: Array) { + val (a, b) = A() +} + +// MULTIRESOLVE +// REF: (for A in a).component1() +// REF: (for A in a).component2() diff --git a/idea/testData/resolve/references/PairMultiDeclaration.kt b/idea/testData/resolve/references/PairMultiDeclaration.kt new file mode 100644 index 00000000000..0d6978ef028 --- /dev/null +++ b/idea/testData/resolve/references/PairMultiDeclaration.kt @@ -0,0 +1,10 @@ +package a + +fun main(args: Array) { + val p = Pair(1, 2) + val (a, b) = p +} + +// MULTIRESOLVE +// REF: (in kotlin.Pair).component1() +// REF: (in kotlin.Pair).component2() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/InsertImportOnPasteTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/InsertImportOnPasteTestGenerated.java index 3a6113112c8..088d92863df 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/InsertImportOnPasteTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/InsertImportOnPasteTestGenerated.java @@ -228,6 +228,11 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast doTestCopy("idea/testData/copyPaste/imports/Local.kt"); } + @TestMetadata("MultiDeclaration.kt") + public void testMultiDeclaration() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/MultiDeclaration.kt"); + } + @TestMetadata("MultiReferencePartiallyCopied.kt") public void testMultiReferencePartiallyCopied() throws Exception { doTestCopy("idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.kt"); @@ -506,6 +511,11 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast doTestCut("idea/testData/copyPaste/imports/Local.kt"); } + @TestMetadata("MultiDeclaration.kt") + public void testMultiDeclaration() throws Exception { + doTestCut("idea/testData/copyPaste/imports/MultiDeclaration.kt"); + } + @TestMetadata("MultiReferencePartiallyCopied.kt") public void testMultiReferencePartiallyCopied() throws Exception { doTestCut("idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.kt"); diff --git a/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveTestGenerated.java b/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveTestGenerated.java index 9c27698d3b0..5f37ba5b61e 100644 --- a/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveTestGenerated.java @@ -142,6 +142,11 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest doTest("idea/testData/resolve/references/JavaReference.kt"); } + @TestMetadata("MultiDeclarationReference.kt") + public void testMultiDeclarationReference() throws Exception { + doTest("idea/testData/resolve/references/MultiDeclarationReference.kt"); + } + @TestMetadata("PackageReference.kt") public void testPackageReference() throws Exception { doTest("idea/testData/resolve/references/PackageReference.kt"); @@ -152,6 +157,11 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest doTest("idea/testData/resolve/references/PackageReferenceInImport.kt"); } + @TestMetadata("PairMultiDeclaration.kt") + public void testPairMultiDeclaration() throws Exception { + doTest("idea/testData/resolve/references/PairMultiDeclaration.kt"); + } + @TestMetadata("PropertyPlaceInClassObjectInObject.kt") public void testPropertyPlaceInClassObjectInObject() throws Exception { doTest("idea/testData/resolve/references/PropertyPlaceInClassObjectInObject.kt"); diff --git a/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveWithLibTestGenerated.java b/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveWithLibTestGenerated.java index 63c09f7e8c8..b5fb9fea938 100644 --- a/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveWithLibTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveWithLibTestGenerated.java @@ -61,6 +61,11 @@ public class ReferenceResolveWithLibTestGenerated extends AbstractReferenceResol doTest("idea/testData/resolve/referenceWithLib/iteratorWithTypeParameter.kt"); } + @TestMetadata("multiDeclarationWithTypeParameters.kt") + public void testMultiDeclarationWithTypeParameters() throws Exception { + doTest("idea/testData/resolve/referenceWithLib/multiDeclarationWithTypeParameters.kt"); + } + @TestMetadata("nestedClassFromLib.kt") public void testNestedClassFromLib() throws Exception { doTest("idea/testData/resolve/referenceWithLib/nestedClassFromLib.kt");