From 70a5540c001d09cb4b72d99410c97b5b871751e7 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 10 May 2016 18:23:55 +0300 Subject: [PATCH] Minor changes after code review --- .../copy/ConvertJavaCopyPasteProcessor.kt | 30 ++++++++------- .../copy/ConvertTextJavaCopyPasteProcessor.kt | 37 ++++--------------- .../InsideIdentifier.to.kt | 3 ++ .../InsideIdentifier.to.kt.after | 3 ++ .../plainTextConversion/InsideIdentifier.txt | 2 + ...TextJavaToKotlinCopyPasteConversionTest.kt | 13 +++++-- ...otlinCopyPasteConversionTestGenerated.java | 6 +++ 7 files changed, 48 insertions(+), 46 deletions(-) create mode 100644 idea/testData/copyPaste/plainTextConversion/InsideIdentifier.to.kt create mode 100644 idea/testData/copyPaste/plainTextConversion/InsideIdentifier.to.kt.after create mode 100644 idea/testData/copyPaste/plainTextConversion/InsideIdentifier.txt diff --git a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/ConvertJavaCopyPasteProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/ConvertJavaCopyPasteProcessor.kt index 99f96b97a8c..2567fe26e88 100644 --- a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/ConvertJavaCopyPasteProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/ConvertJavaCopyPasteProcessor.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.KtStringTemplateEntryWithExpression import org.jetbrains.kotlin.psi.KtStringTemplateExpression +import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import java.awt.datatransfer.Transferable import java.util.* @@ -71,11 +72,9 @@ class ConvertJavaCopyPasteProcessor : CopyPastePostProcessor, values: List) { if (DumbService.getInstance(project).isDumb) return - val jetEditorOptions = KotlinEditorOptions.getInstance() - if (!jetEditorOptions.isEnableJavaToKotlinConversion) return + if (!KotlinEditorOptions.getInstance().isEnableJavaToKotlinConversion) return - val data = values.single() - if (data !is CopiedJavaCode) return + val data = values.single() as CopiedJavaCode val document = editor.document val targetFile = PsiDocumentManager.getInstance(project).getPsiFile(document) as? KtFile ?: return @@ -128,8 +127,7 @@ class ConvertJavaCopyPasteProcessor : CopyPastePostProcessor, projec internal fun isNoConversionPosition(file: KtFile, offset: Int): Boolean { if (offset == 0) return false val token = file.findElementAt(offset - 1)!! + + if (token !is PsiWhiteSpace && token.endOffset != offset) return true // pasting into the middle of token + for (element in token.parentsWithSelf) { if (element is PsiComment) return true if (element is KtStringTemplateEntryWithExpression) return false if (element is KtStringTemplateExpression) return true } return false -} \ No newline at end of file +} + +internal fun confirmConvertJavaOnPaste(project: Project, isPlainText: Boolean): Boolean { + if (KotlinEditorOptions.getInstance().isDonTShowConversionDialog) return true + + val dialog = KotlinPasteFromJavaDialog(project, isPlainText) + dialog.show() + return dialog.isOK +} + diff --git a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/ConvertTextJavaCopyPasteProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/ConvertTextJavaCopyPasteProcessor.kt index 1fff1ea6c21..56ad406c7e1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/ConvertTextJavaCopyPasteProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/ConvertTextJavaCopyPasteProcessor.kt @@ -48,18 +48,6 @@ import org.jetbrains.kotlin.utils.addToStdlib.check import java.awt.datatransfer.DataFlavor import java.awt.datatransfer.Transferable -class CopiedKotlinCodeTransferableData : TextBlockTransferableData { - override fun getFlavor() = DATA_FLAVOR - override fun getOffsetCount() = 0 - - override fun getOffsets(offsets: IntArray?, index: Int) = index - override fun setOffsets(offsets: IntArray?, index: Int) = index - - companion object { - val DATA_FLAVOR: DataFlavor = DataFlavor(CopiedKotlinCodeTransferableData::class.java, "class: KotlinCodeTransferableData") - } -} - class ConvertTextJavaCopyPasteProcessor : CopyPastePostProcessor() { private val LOG = Logger.getInstance(ConvertTextJavaCopyPasteProcessor::class.java) @@ -77,17 +65,16 @@ class ConvertTextJavaCopyPasteProcessor : CopyPastePostProcessor { - if (file is KtFile) { - return listOf(CopiedKotlinCodeTransferableData()) - } return emptyList() } override fun extractTransferableData(content: Transferable): List { try { if (content.isDataFlavorSupported(DataFlavor.stringFlavor)) { - if (content.isDataFlavorSupported(CopiedJavaCode.DATA_FLAVOR)) return emptyList() // it's handled by ConvertJavaCopyPasteProcessor - if (content.isDataFlavorSupported(CopiedKotlinCodeTransferableData.DATA_FLAVOR)) return emptyList() // just an optimization + // check if it's copied from within IDEA + if (!Companion.convertOnCopyInsideIDE && content.transferDataFlavors.any { TextBlockTransferableData::class.java.isAssignableFrom(it.representationClass) }) { + return emptyList() + } val text = content.getTransferData(DataFlavor.stringFlavor) as String return listOf(MyTransferableData(text)) @@ -101,11 +88,9 @@ class ConvertTextJavaCopyPasteProcessor : CopyPastePostProcessor, values: List) { if (DumbService.getInstance(project).isDumb) return - val options = KotlinEditorOptions.getInstance() - if (!options.isEnableJavaToKotlinConversion) return //TODO: use another option? + if (!KotlinEditorOptions.getInstance().isEnableJavaToKotlinConversion) return //TODO: use another option? - val data = values.single() as MyTransferableData - val text = data.text + val text = (values.single() as MyTransferableData).text val psiDocumentManager = PsiDocumentManager.getInstance(project) psiDocumentManager.commitDocument(editor.document) @@ -115,8 +100,7 @@ class ConvertTextJavaCopyPasteProcessor : CopyPastePostProcessorar() +} diff --git a/idea/testData/copyPaste/plainTextConversion/InsideIdentifier.to.kt.after b/idea/testData/copyPaste/plainTextConversion/InsideIdentifier.to.kt.after new file mode 100644 index 00000000000..eb0412a03dd --- /dev/null +++ b/idea/testData/copyPaste/plainTextConversion/InsideIdentifier.to.kt.after @@ -0,0 +1,3 @@ +fun foo() { + bar() +} diff --git a/idea/testData/copyPaste/plainTextConversion/InsideIdentifier.txt b/idea/testData/copyPaste/plainTextConversion/InsideIdentifier.txt new file mode 100644 index 00000000000..2934e0d0dee --- /dev/null +++ b/idea/testData/copyPaste/plainTextConversion/InsideIdentifier.txt @@ -0,0 +1,2 @@ +ArrayList list = new ArrayList(); +// NO_CONVERSION_EXPECTED \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/AbstractTextJavaToKotlinCopyPasteConversionTest.kt b/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/AbstractTextJavaToKotlinCopyPasteConversionTest.kt index 42864498416..7a925c71c03 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/AbstractTextJavaToKotlinCopyPasteConversionTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/AbstractTextJavaToKotlinCopyPasteConversionTest.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.test.InTextDirectivesUtils import org.jetbrains.kotlin.test.KotlinTestUtils import java.io.File -import kotlin.test.assertEquals abstract class AbstractTextJavaToKotlinCopyPasteConversionTest : AbstractCopyPasteTest() { private val BASE_PATH = PluginTestCaseBase.getTestDataPathBase() + "/copyPaste/plainTextConversion" @@ -61,11 +60,17 @@ abstract class AbstractTextJavaToKotlinCopyPasteConversionTest : AbstractCopyPas configureTargetFile(testName + ".to.kt") ConvertTextJavaCopyPasteProcessor.conversionPerformed = false + ConvertTextJavaCopyPasteProcessor.convertOnCopyInsideIDE = true - myFixture.performEditorAction(IdeActions.ACTION_PASTE) + try { + myFixture.performEditorAction(IdeActions.ACTION_PASTE) + } + finally { + ConvertTextJavaCopyPasteProcessor.convertOnCopyInsideIDE = false + } - assertEquals(noConversionExpected, !ConvertTextJavaCopyPasteProcessor.conversionPerformed, - if (noConversionExpected) "Conversion to Kotlin should not be suggested" else "No conversion to Kotlin suggested") + kotlin.test.assertEquals(noConversionExpected, !ConvertTextJavaCopyPasteProcessor.conversionPerformed, + if (noConversionExpected) "Conversion to Kotlin should not be suggested" else "No conversion to Kotlin suggested") KotlinTestUtils.assertEqualsToFile(File(path.replace(".txt", ".expected.kt")), myFixture.file.text) } 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 3586a8a1226..642c80bf163 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/TextJavaToKotlinCopyPasteConversionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/TextJavaToKotlinCopyPasteConversionTestGenerated.java @@ -47,6 +47,12 @@ public class TextJavaToKotlinCopyPasteConversionTestGenerated extends AbstractTe doTest(fileName); } + @TestMetadata("InsideIdentifier.txt") + public void testInsideIdentifier() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/plainTextConversion/InsideIdentifier.txt"); + doTest(fileName); + } + @TestMetadata("IntoComment.txt") public void testIntoComment() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/plainTextConversion/IntoComment.txt");