From 8d31a5c3a65852307a4d166abfb57f6f3880b5a8 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 8 Apr 2015 20:07:46 +0300 Subject: [PATCH] Imports on paste: do not suggest to import already imported extensions --- .../KotlinCopyPasteReferenceProcessor.kt | 38 ++++++++++++------- .../KotlinReferenceTransferableData.kt | 3 +- .../AlreadyImportedExtensions.dependency.kt | 3 ++ .../AlreadyImportedExtensions.expected.kt | 8 ++++ .../AlreadyImportedExtensions.expected.names | 1 + .../imports/AlreadyImportedExtensions.kt | 10 +++++ .../imports/AlreadyImportedExtensions.to.kt | 3 ++ .../InsertImportOnPasteTestGenerated.java | 12 ++++++ 8 files changed, 64 insertions(+), 14 deletions(-) create mode 100644 idea/testData/copyPaste/imports/AlreadyImportedExtensions.dependency.kt create mode 100644 idea/testData/copyPaste/imports/AlreadyImportedExtensions.expected.kt create mode 100644 idea/testData/copyPaste/imports/AlreadyImportedExtensions.expected.names create mode 100644 idea/testData/copyPaste/imports/AlreadyImportedExtensions.kt create mode 100644 idea/testData/copyPaste/imports/AlreadyImportedExtensions.to.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt index 8874701bf90..776115c3657 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.codeInsight import com.intellij.codeInsight.CodeInsightSettings import com.intellij.codeInsight.editorActions.CopyPastePostProcessor -import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.RangeMarker @@ -29,10 +28,7 @@ import com.intellij.openapi.util.Ref import com.intellij.openapi.util.TextRange import com.intellij.psi.* import com.intellij.psi.util.PsiTreeUtil -import org.jetbrains.kotlin.descriptors.CallableDescriptor -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.PackageViewDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.codeInsight.shorten.performDelayedShortening @@ -57,6 +53,7 @@ import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver.LookupMode import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension +import org.jetbrains.kotlin.resolve.scopes.JetScope import org.jetbrains.kotlin.types.ErrorUtils import org.jetbrains.kotlin.utils.addIfNotNull import java.awt.datatransfer.Transferable @@ -181,8 +178,11 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor KotlinReferenceData.Kind.PACKAGE - is CallableDescriptor -> - if (descriptor.isExtension) KotlinReferenceData.Kind.EXTENSION_CALLABLE else KotlinReferenceData.Kind.NON_EXTENSION_CALLABLE + is FunctionDescriptor -> + if (descriptor.isExtension) KotlinReferenceData.Kind.EXTENSION_FUNCTION else KotlinReferenceData.Kind.NON_EXTENSION_CALLABLE + + is PropertyDescriptor -> + if (descriptor.isExtension) KotlinReferenceData.Kind.EXTENSION_PROPERTY else KotlinReferenceData.Kind.NON_EXTENSION_CALLABLE else -> null @@ -229,10 +229,11 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor): List { if (file !is JetFile) return listOf() + val fileResolutionScope = file.getResolutionFacade().getFileTopLevelScope(file) return referenceData.map { val referenceElement = findReference(it, file, blockStart) if (referenceElement != null) - createReferenceToRestoreData(referenceElement, it) + createReferenceToRestoreData(referenceElement, it, fileResolutionScope) else null }.filterNotNull() @@ -259,7 +260,16 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor() - return descriptors.singleOrNull() + return descriptors.singleOrNull() //TODO: not correct } private fun showRestoreReferencesDialog(project: Project, referencesToRestore: List): Collection { diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinReferenceTransferableData.kt b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinReferenceTransferableData.kt index 06b3c8b521c..97a8cb95723 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinReferenceTransferableData.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinReferenceTransferableData.kt @@ -62,7 +62,8 @@ public class KotlinReferenceData( CLASS PACKAGE NON_EXTENSION_CALLABLE - EXTENSION_CALLABLE + EXTENSION_FUNCTION + EXTENSION_PROPERTY } public override fun clone(): KotlinReferenceData { diff --git a/idea/testData/copyPaste/imports/AlreadyImportedExtensions.dependency.kt b/idea/testData/copyPaste/imports/AlreadyImportedExtensions.dependency.kt new file mode 100644 index 00000000000..346fdc12d71 --- /dev/null +++ b/idea/testData/copyPaste/imports/AlreadyImportedExtensions.dependency.kt @@ -0,0 +1,3 @@ +package dependency + +fun String.extensionFun() {} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/AlreadyImportedExtensions.expected.kt b/idea/testData/copyPaste/imports/AlreadyImportedExtensions.expected.kt new file mode 100644 index 00000000000..5994f129e6b --- /dev/null +++ b/idea/testData/copyPaste/imports/AlreadyImportedExtensions.expected.kt @@ -0,0 +1,8 @@ +fun foo() { + s.extensionFun() + for (i in s.indices) { + val pair = s to null + val s1 = s + "1" + } + +} diff --git a/idea/testData/copyPaste/imports/AlreadyImportedExtensions.expected.names b/idea/testData/copyPaste/imports/AlreadyImportedExtensions.expected.names new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/idea/testData/copyPaste/imports/AlreadyImportedExtensions.expected.names @@ -0,0 +1 @@ + diff --git a/idea/testData/copyPaste/imports/AlreadyImportedExtensions.kt b/idea/testData/copyPaste/imports/AlreadyImportedExtensions.kt new file mode 100644 index 00000000000..900591ce52d --- /dev/null +++ b/idea/testData/copyPaste/imports/AlreadyImportedExtensions.kt @@ -0,0 +1,10 @@ +// RUNTIME +// ALLOW_UNRESOLVED + +fun foo(s: String) { + s.extensionFun() + for (i in s.indices) { + val pair = s to null + val s1 = s + "1" + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/AlreadyImportedExtensions.to.kt b/idea/testData/copyPaste/imports/AlreadyImportedExtensions.to.kt new file mode 100644 index 00000000000..352e90baa62 --- /dev/null +++ b/idea/testData/copyPaste/imports/AlreadyImportedExtensions.to.kt @@ -0,0 +1,3 @@ +fun foo() { + +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java index 91fb5ee8bcd..e60ddf01c53 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java @@ -42,6 +42,12 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/copyPaste/imports"), Pattern.compile("^([^\\.]+)\\.kt$"), false); } + @TestMetadata("AlreadyImportedExtensions.kt") + public void testAlreadyImportedExtensions() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/imports/AlreadyImportedExtensions.kt"); + doTestCopy(fileName); + } + @TestMetadata("AlreadyImportedViaStar.kt") public void testAlreadyImportedViaStar() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/imports/AlreadyImportedViaStar.kt"); @@ -363,6 +369,12 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/copyPaste/imports"), Pattern.compile("^([^\\.]+)\\.kt$"), false); } + @TestMetadata("AlreadyImportedExtensions.kt") + public void testAlreadyImportedExtensions() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/imports/AlreadyImportedExtensions.kt"); + doTestCut(fileName); + } + @TestMetadata("AlreadyImportedViaStar.kt") public void testAlreadyImportedViaStar() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/imports/AlreadyImportedViaStar.kt");