From 837df66c19830ba747b600c48754a7b5eb63175c Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Tue, 20 Jun 2017 23:57:59 +0300 Subject: [PATCH] Register reference contributor for collection literals #KT-18551 Fixed --- .../psi/KtCollectionLiteralExpression.kt | 8 +++ .../references/KotlinReferenceContributor.kt | 4 +- .../KtCollectionLiteralReference.kt | 50 +++++++++++++++++++ .../CollectionLiteralReference.expected.kt | 1 + .../literal/CollectionLiteralReference.kt | 1 + .../literal/CollectionLiteralReference.to.kt | 1 + ...lKotlinToKotlinCopyPasteTestGenerated.java | 6 +++ 7 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtCollectionLiteralReference.kt create mode 100644 idea/testData/copyPaste/literal/CollectionLiteralReference.expected.kt create mode 100644 idea/testData/copyPaste/literal/CollectionLiteralReference.kt create mode 100644 idea/testData/copyPaste/literal/CollectionLiteralReference.to.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtCollectionLiteralExpression.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtCollectionLiteralExpression.kt index c783ab31f3c..a6c0404d199 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtCollectionLiteralExpression.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtCollectionLiteralExpression.kt @@ -17,13 +17,21 @@ package org.jetbrains.kotlin.psi import com.intellij.lang.ASTNode +import com.intellij.psi.PsiElement import com.intellij.psi.util.PsiTreeUtil +import org.jetbrains.kotlin.lexer.KtTokens class KtCollectionLiteralExpression(node: ASTNode) : KtExpressionImpl(node), KtReferenceExpression { override fun accept(visitor: KtVisitor, data: D): R { return visitor.visitCollectionLiteralExpression(this, data) } + val leftBracket: PsiElement? + get() = findChildByType(KtTokens.LBRACKET) + + val rightBracket: PsiElement? + get() = findChildByType(KtTokens.LBRACKET) + fun getInnerExpressions(): List { return PsiTreeUtil.getChildrenOfTypeAsList(this, KtExpression::class.java) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KotlinReferenceContributor.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KotlinReferenceContributor.kt index be5438410bf..e0469dfb71d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KotlinReferenceContributor.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KotlinReferenceContributor.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 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. @@ -53,6 +53,8 @@ class KotlinReferenceContributor() : AbstractKotlinReferenceContributor() { registerProvider(factory = ::KtArrayAccessReference) + registerProvider(factory = ::KtCollectionLiteralReference) + registerProvider(factory = ::KtForLoopInReference) registerProvider(factory = ::KtPropertyDelegationMethodsReference) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtCollectionLiteralReference.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtCollectionLiteralReference.kt new file mode 100644 index 00000000000..f11237eb056 --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtCollectionLiteralReference.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2017 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.kotlin.idea.references + +import com.intellij.openapi.util.TextRange +import com.intellij.psi.MultiRangeReference +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtCollectionLiteralExpression +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.CollectionLiteralResolver + +class KtCollectionLiteralReference(expression: KtCollectionLiteralExpression) : KtSimpleReference(expression), MultiRangeReference { + companion object { + private val COLLECTION_LITERAL_CALL_NAMES = + CollectionLiteralResolver.PRIMITIVE_TYPE_TO_ARRAY.values + + CollectionLiteralResolver.ARRAY_OF_FUNCTION + } + + override fun getRangeInElement(): TextRange = element.normalizeRange() + + override fun getTargetDescriptors(context: BindingContext): Collection { + val resolvedCall = context[BindingContext.COLLECTION_LITERAL_CALL, element] + return listOfNotNull(resolvedCall?.resultingDescriptor) + } + + override fun getRanges(): List { + return listOfNotNull(element.leftBracket?.normalizeRange(), element.rightBracket?.normalizeRange()) + } + + override val resolvesByNames: Collection + get() = COLLECTION_LITERAL_CALL_NAMES + + private fun PsiElement.normalizeRange(): TextRange = this.textRange.shiftRight(-expression.textOffset) +} diff --git a/idea/testData/copyPaste/literal/CollectionLiteralReference.expected.kt b/idea/testData/copyPaste/literal/CollectionLiteralReference.expected.kt new file mode 100644 index 00000000000..180f31c568e --- /dev/null +++ b/idea/testData/copyPaste/literal/CollectionLiteralReference.expected.kt @@ -0,0 +1 @@ +val test = [1, 2, 3] \ No newline at end of file diff --git a/idea/testData/copyPaste/literal/CollectionLiteralReference.kt b/idea/testData/copyPaste/literal/CollectionLiteralReference.kt new file mode 100644 index 00000000000..87cce7a16f1 --- /dev/null +++ b/idea/testData/copyPaste/literal/CollectionLiteralReference.kt @@ -0,0 +1 @@ +val abc = [1, 2, 3] \ No newline at end of file diff --git a/idea/testData/copyPaste/literal/CollectionLiteralReference.to.kt b/idea/testData/copyPaste/literal/CollectionLiteralReference.to.kt new file mode 100644 index 00000000000..141510fa632 --- /dev/null +++ b/idea/testData/copyPaste/literal/CollectionLiteralReference.to.kt @@ -0,0 +1 @@ +val test = \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/LiteralKotlinToKotlinCopyPasteTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/LiteralKotlinToKotlinCopyPasteTestGenerated.java index e55fc39242b..94e1eb75d72 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/LiteralKotlinToKotlinCopyPasteTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/LiteralKotlinToKotlinCopyPasteTestGenerated.java @@ -36,6 +36,12 @@ public class LiteralKotlinToKotlinCopyPasteTestGenerated extends AbstractLiteral KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/copyPaste/literal"), Pattern.compile("^([^\\.]+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("CollectionLiteralReference.kt") + public void testCollectionLiteralReference() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/literal/CollectionLiteralReference.kt"); + doTest(fileName); + } + @TestMetadata("DontEscapeEntries.kt") public void testDontEscapeEntries() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/literal/DontEscapeEntries.kt");