From 927fe9d2cb5f3df612be5f879383e6a51ea61b3d Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 21 Oct 2014 13:53:35 +0400 Subject: [PATCH] JavaToKotlinAction converts all files at once with cross usage processing --- .../jet/plugin/actions/JavaToKotlinAction.kt | 44 +++++++++---------- .../copy/ConvertJavaCopyPastePostProcessor.kt | 2 +- .../jet/j2k/JavaToKotlinConverter.kt | 4 +- .../jet/j2k/JavaToKotlinTranslator.kt | 2 +- ...tractJavaToKotlinConverterMultiFileTest.kt | 2 +- ...ractJavaToKotlinConverterSingleFileTest.kt | 4 +- 6 files changed, 27 insertions(+), 31 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/actions/JavaToKotlinAction.kt b/idea/src/org/jetbrains/jet/plugin/actions/JavaToKotlinAction.kt index dff1a4c70d8..80c740e33d3 100644 --- a/idea/src/org/jetbrains/jet/plugin/actions/JavaToKotlinAction.kt +++ b/idea/src/org/jetbrains/jet/plugin/actions/JavaToKotlinAction.kt @@ -26,7 +26,6 @@ import org.jetbrains.jet.j2k.ConverterSettings import org.jetbrains.jet.j2k.FilesConversionScope import org.jetbrains.jet.j2k.IdeaReferenceSearcher import org.jetbrains.jet.j2k.JavaToKotlinConverter -import java.util.LinkedList import com.intellij.openapi.project.Project import com.intellij.psi.PsiJavaFile import com.intellij.psi.PsiManager @@ -35,10 +34,7 @@ import com.intellij.openapi.application.ApplicationManager import com.intellij.psi.codeStyle.CodeStyleManager import java.io.IOException import com.intellij.openapi.ui.ex.MessagesEx -import com.intellij.psi.PsiFile import org.jetbrains.jet.plugin.j2k.J2kPostProcessor -import com.intellij.psi.PsiElement -import org.jetbrains.jet.j2k.PostProcessor import com.intellij.openapi.vfs.CharsetToolkit import org.jetbrains.jet.lang.psi.JetFile @@ -49,10 +45,9 @@ public class JavaToKotlinAction : AnAction() { val selectedJavaFiles = allJavaFiles(virtualFiles, project) if (selectedJavaFiles.isEmpty()) return - val converter = JavaToKotlinConverter(project, ConverterSettings.defaultSettings, FilesConversionScope(selectedJavaFiles), IdeaReferenceSearcher) CommandProcessor.getInstance().executeCommand(project, object : Runnable { override fun run() { - val newFiles = convertFiles(converter, selectedJavaFiles) + val newFiles = convertFiles(selectedJavaFiles, project) deleteFiles(selectedJavaFiles) reformatFiles(newFiles, project) @@ -109,11 +104,15 @@ public class JavaToKotlinAction : AnAction() { } } - private fun convertFiles(converter: JavaToKotlinConverter, javaFiles: List): List { + private fun convertFiles(javaFiles: List, project: Project): List { + val converter = JavaToKotlinConverter(project, ConverterSettings.defaultSettings, FilesConversionScope(javaFiles), IdeaReferenceSearcher) + + val convertedTexts = converter.elementsToKotlin(javaFiles.map { it to J2kPostProcessor(it) }) + val result = ArrayList() - for (psiFile in javaFiles) { + for ((i, psiFile) in javaFiles.withIndices()) { ApplicationManager.getApplication().runWriteAction { - val file = convertOneFile(converter, psiFile) + val file = saveConversionResult(psiFile.getVirtualFile(), convertedTexts[i], project) if (file != null) { result.add(file) } @@ -122,6 +121,18 @@ public class JavaToKotlinAction : AnAction() { return result } + private fun saveConversionResult(javaFile: VirtualFile, text: String, project: Project): VirtualFile? { + try { + val kotlinFile = javaFile.copy(this, javaFile.getParent(), javaFile.getNameWithoutExtension() + ".kt") + kotlinFile.setBinaryContent(CharsetToolkit.getUtf8Bytes(text)) + return kotlinFile + } + catch (e: IOException) { + MessagesEx.error(project, e.getMessage()).showLater() + return null + } + } + private fun deleteFiles(javaFiles: List) { for (psiFile in javaFiles) { ApplicationManager.getApplication().runWriteAction { @@ -134,19 +145,4 @@ public class JavaToKotlinAction : AnAction() { } } } - - private fun convertOneFile(converter: JavaToKotlinConverter, psiFile: PsiJavaFile): VirtualFile? { - try { - val virtualFile = psiFile.getVirtualFile()!! - val postProcessor = J2kPostProcessor(psiFile) - val result = converter.elementsToKotlin(Pair(psiFile, postProcessor)).get(0) //TODO: convert all files in one call! - val kotlinFile = virtualFile.copy(this, virtualFile.getParent(), virtualFile.getNameWithoutExtension() + ".kt") - kotlinFile.setBinaryContent(CharsetToolkit.getUtf8Bytes(result)) - return kotlinFile - } - catch (e: IOException) { - MessagesEx.error(psiFile.getProject(), e.getMessage()).showLater() - return null - } - } } diff --git a/idea/src/org/jetbrains/jet/plugin/conversion/copy/ConvertJavaCopyPastePostProcessor.kt b/idea/src/org/jetbrains/jet/plugin/conversion/copy/ConvertJavaCopyPastePostProcessor.kt index d8d13934933..4efcf5e9318 100644 --- a/idea/src/org/jetbrains/jet/plugin/conversion/copy/ConvertJavaCopyPastePostProcessor.kt +++ b/idea/src/org/jetbrains/jet/plugin/conversion/copy/ConvertJavaCopyPastePostProcessor.kt @@ -120,7 +120,7 @@ public class ConvertJavaCopyPastePostProcessor() : CopyPastePostProcessor): List { + public fun elementsToKotlin(psiElementsAndProcessors: List>): List { try { val intermediateResults = ArrayList(psiElementsAndProcessors.size) val usageProcessings = ArrayList() @@ -89,7 +89,7 @@ public class JavaToKotlinConverter(private val project: Project, // if we got this exception then we need to turn element creation stack traces on to get better diagnostic Element.saveCreationStacktraces = true try { - return elementsToKotlin(*psiElementsAndProcessors) + return elementsToKotlin(psiElementsAndProcessors) } finally { Element.saveCreationStacktraces = false diff --git a/j2k/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.kt b/j2k/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.kt index 9d30da71d50..a2a67a71f8a 100644 --- a/j2k/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.kt +++ b/j2k/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.kt @@ -91,7 +91,7 @@ public object JavaToKotlinTranslator { val file = createFile(javaCode) if (file is PsiJavaFile) { val converter = JavaToKotlinConverter(file.getProject(), ConverterSettings.defaultSettings, FilesConversionScope(listOf(file)), EmptyReferenceSearcher) - return prettify(converter.elementsToKotlin(file to null)[0]) + return prettify(converter.elementsToKotlin(listOf(file to null))[0]) } return "" } diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterMultiFileTest.kt b/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterMultiFileTest.kt index ce82cdaae38..a1425529989 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterMultiFileTest.kt +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterMultiFileTest.kt @@ -45,7 +45,7 @@ public abstract class AbstractJavaToKotlinConverterMultiFileTest() : AbstractJav } val converter = JavaToKotlinConverter(project, ConverterSettings.defaultSettings, FilesConversionScope(psiFiles), IdeaReferenceSearcher) - val results: List = converter.elementsToKotlin(*psiFiles.map { it to J2kPostProcessor(it) }.copyToArray()) + val results: List = converter.elementsToKotlin(psiFiles.map { it to J2kPostProcessor(it) }) .map { reformat(it, project) } for ((i, javaFile) in javaFiles.withIndices()) { diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterSingleFileTest.kt b/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterSingleFileTest.kt index 3dbcbbf7491..44f51ca8db8 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterSingleFileTest.kt +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterSingleFileTest.kt @@ -106,13 +106,13 @@ public abstract class AbstractJavaToKotlinConverterSingleFileTest() : AbstractJa val fileWithText = createJavaFile(text) val converter = JavaToKotlinConverter(project, settings, FilesConversionScope(listOf(fileWithText)), IdeaReferenceSearcher) val element = fileWithText.getFirstChild()!! - return converter.elementsToKotlin(element to J2kPostProcessor(fileWithText))[0] + return converter.elementsToKotlin(listOf(element to J2kPostProcessor(fileWithText)))[0] } private fun fileToKotlin(text: String, settings: ConverterSettings, project: Project): String { val file = createJavaFile(text) val converter = JavaToKotlinConverter(project, settings, FilesConversionScope(listOf(file)), IdeaReferenceSearcher) - return converter.elementsToKotlin(file to J2kPostProcessor(file))[0] + return converter.elementsToKotlin(listOf(file to J2kPostProcessor(file)))[0] } private fun methodToKotlin(text: String, settings: ConverterSettings, project: Project): String {