From fb5398cdcdffaa1520554578001a01fd80c41984 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Thu, 8 Dec 2016 21:27:54 +0300 Subject: [PATCH] Fix for KT-14885 J2K on paste adds duplicated imports --- .../copy/PlainTextPasteImportResolver.kt | 21 ++++++++++--------- .../ImportFromTarget.expected.kt | 10 +++++++++ .../ImportFromTarget.to.kt | 8 +++++++ .../plainTextConversion/ImportFromTarget.txt | 4 ++++ .../ImportResolve.expected.kt | 6 +++--- ...otlinCopyPasteConversionTestGenerated.java | 6 ++++++ 6 files changed, 42 insertions(+), 13 deletions(-) create mode 100644 idea/testData/copyPaste/plainTextConversion/ImportFromTarget.expected.kt create mode 100644 idea/testData/copyPaste/plainTextConversion/ImportFromTarget.to.kt create mode 100644 idea/testData/copyPaste/plainTextConversion/ImportFromTarget.txt diff --git a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/PlainTextPasteImportResolver.kt b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/PlainTextPasteImportResolver.kt index 5b244c6d08b..937aa28b604 100644 --- a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/PlainTextPasteImportResolver.kt +++ b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/PlainTextPasteImportResolver.kt @@ -36,7 +36,7 @@ import org.jetbrains.kotlin.psi.KtImportDirective import java.util.* -class PlainTextPasteImportResolver(dataForConversion: DataForConversion, val targetFile: KtFile) { +class PlainTextPasteImportResolver(val dataForConversion: DataForConversion, val targetFile: KtFile) { private val file = dataForConversion.file private val project = targetFile.project @@ -91,21 +91,22 @@ class PlainTextPasteImportResolver(dataForConversion: DataForConversion, val tar if (importPath.isAllUnder) { if (isClassReceiver) - psiElementFactory.createImportStaticStatement(receiver as PsiClass, "*") + addImport(psiElementFactory.createImportStaticStatement(receiver as PsiClass, "*")) else if (isPackageReceiver) - psiElementFactory.createImportStatementOnDemand((receiver as PsiPackage).qualifiedName) + addImport(psiElementFactory.createImportStatementOnDemand((receiver as PsiPackage).qualifiedName)) } else { - if (isPackageReceiver && isClassSelector) - psiElementFactory.createImportStatement(selector as PsiClass) + if (isClassSelector) + addImport(psiElementFactory.createImportStatement(selector as PsiClass)) else if (isClassReceiver) - psiElementFactory.createImportStaticStatement(receiver as PsiClass, importPath.importedName!!.asString()) + addImport(psiElementFactory.createImportStaticStatement(receiver as PsiClass, importPath.importedName!!.asString())) } } } - runWriteAction { - targetFile.importDirectives.forEach(::tryConvertKotlinImport) - } + if (importList !in dataForConversion.elementsAndTexts.toList()) + runWriteAction { + targetFile.importDirectives.forEach(::tryConvertKotlinImport) + } } fun tryResolveReferences() { @@ -163,7 +164,7 @@ class PlainTextPasteImportResolver(dataForConversion: DataForConversion, val tar } runWriteAction { - elementsWithUnresolvedRef.forEach { + elementsWithUnresolvedRef.reversed().forEach { val reference = it.reference as PsiQualifiedReference if (!tryResolveReference(reference)) failedToResolveReferenceNames += reference.referenceName!! } diff --git a/idea/testData/copyPaste/plainTextConversion/ImportFromTarget.expected.kt b/idea/testData/copyPaste/plainTextConversion/ImportFromTarget.expected.kt new file mode 100644 index 00000000000..85ca628988d --- /dev/null +++ b/idea/testData/copyPaste/plainTextConversion/ImportFromTarget.expected.kt @@ -0,0 +1,10 @@ +package com.example + +import java.util.UUID + + +class ExampleClass { + override fun toString(): String { + return UUID.randomUUID().toString() + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/plainTextConversion/ImportFromTarget.to.kt b/idea/testData/copyPaste/plainTextConversion/ImportFromTarget.to.kt new file mode 100644 index 00000000000..8282a03857a --- /dev/null +++ b/idea/testData/copyPaste/plainTextConversion/ImportFromTarget.to.kt @@ -0,0 +1,8 @@ +package com.example + +import java.util.UUID + + +class ExampleClass { + +} \ No newline at end of file diff --git a/idea/testData/copyPaste/plainTextConversion/ImportFromTarget.txt b/idea/testData/copyPaste/plainTextConversion/ImportFromTarget.txt new file mode 100644 index 00000000000..16b4583035e --- /dev/null +++ b/idea/testData/copyPaste/plainTextConversion/ImportFromTarget.txt @@ -0,0 +1,4 @@ +@Override +public String toString() { + return UUID.randomUUID().toString(); +} \ No newline at end of file diff --git a/idea/testData/copyPaste/plainTextConversion/ImportResolve.expected.kt b/idea/testData/copyPaste/plainTextConversion/ImportResolve.expected.kt index d565fec1455..d5793ea42fb 100644 --- a/idea/testData/copyPaste/plainTextConversion/ImportResolve.expected.kt +++ b/idea/testData/copyPaste/plainTextConversion/ImportResolve.expected.kt @@ -1,9 +1,9 @@ -import java.util.ArrayList +import test.ToBeImportedJava.staticMethod +import test.ToBeImportedJava.TO_BE_IMPORTED_CONST import test.ToBeImportedJava import test.ToBeImportedKotlin import java.util.HashMap -import test.ToBeImportedJava.TO_BE_IMPORTED_CONST -import test.ToBeImportedJava.staticMethod +import java.util.ArrayList class Target { var listOfPlatformType: List = ArrayList() diff --git a/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/TextJavaToKotlinCopyPasteConversionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/TextJavaToKotlinCopyPasteConversionTestGenerated.java index 5fbcafb3b91..f6657f0f455 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/TextJavaToKotlinCopyPasteConversionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/TextJavaToKotlinCopyPasteConversionTestGenerated.java @@ -48,6 +48,12 @@ public class TextJavaToKotlinCopyPasteConversionTestGenerated extends AbstractTe doTest(fileName); } + @TestMetadata("ImportFromTarget.txt") + public void testImportFromTarget() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/plainTextConversion/ImportFromTarget.txt"); + doTest(fileName); + } + @TestMetadata("ImportResolve.txt") public void testImportResolve() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/plainTextConversion/ImportResolve.txt");