From d4f6558e8a16efa66f1665fee201a82488657d37 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 8 Apr 2019 18:55:00 +0300 Subject: [PATCH] New J2K: Split convert file method in converters --- .../kotlin/j2k/JavaToKotlinConverter.kt | 64 +++++++------------ .../kotlin/nj2k/NewJavaToKotlinConverter.kt | 64 +++++++++++++++---- 2 files changed, 77 insertions(+), 51 deletions(-) diff --git a/j2k/src/org/jetbrains/kotlin/j2k/JavaToKotlinConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/JavaToKotlinConverter.kt index bee0fb1bab3..2f6879a7c9b 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/JavaToKotlinConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/JavaToKotlinConverter.kt @@ -16,23 +16,16 @@ package org.jetbrains.kotlin.j2k -import com.intellij.codeInsight.documentation.DocumentationManager import com.intellij.lang.java.JavaLanguage import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.application.ModalityState -import com.intellij.openapi.command.CommandProcessor import com.intellij.openapi.diagnostic.Logger -import com.intellij.openapi.editor.Document import com.intellij.openapi.editor.RangeMarker import com.intellij.openapi.progress.* import com.intellij.openapi.project.Project import com.intellij.openapi.util.Computable import com.intellij.psi.* import com.intellij.psi.impl.source.DummyHolder -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withContext import org.jetbrains.kotlin.idea.KotlinLanguage -import org.jetbrains.kotlin.idea.core.util.EDT import org.jetbrains.kotlin.j2k.ast.Element import org.jetbrains.kotlin.j2k.usageProcessing.ExternalCodeProcessor import org.jetbrains.kotlin.j2k.usageProcessing.UsageProcessing @@ -42,8 +35,6 @@ import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.psiUtil.isAncestor import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import java.util.* -import org.jetbrains.kotlin.idea.util.application.executeWriteCommand -import org.jetbrains.kotlin.idea.util.application.runWriteAction interface PostProcessor { @@ -69,39 +60,46 @@ data class Result(val results: List, val externalCodeProcessing: data class FilesResult(val results: List, val externalCodeProcessing: ExternalCodeProcessing?) -abstract class JavaToKotlinConverter(private val project: Project) { +abstract class JavaToKotlinConverter { protected abstract fun elementsToKotlin(inputElements: List, processor: WithProgressProcessor): Result - protected abstract fun createDummyKtFile(text: String, project: Project, context: PsiElement): KtFile - - private val LOG = Logger.getInstance("#org.jetbrains.kotlin.j2k.JavaToKotlinConverter") - - fun filesToKotlin( + abstract fun filesToKotlin( files: List, postProcessor: PostProcessor, progress: ProgressIndicator = EmptyProgressIndicator() + ): FilesResult + + fun elementsToKotlin(inputElements: List): Result { + return elementsToKotlin(inputElements, WithProgressProcessor.DEFAULT) + } +} + +class OldJavaToKotlinConverter( + private val project: Project, + private val settings: ConverterSettings, + private val services: JavaToKotlinConverterServices +) : JavaToKotlinConverter() { + + private val LOG = Logger.getInstance("#org.jetbrains.kotlin.j2k.JavaToKotlinConverter") + + override fun filesToKotlin( + files: List, + postProcessor: PostProcessor, + progress: ProgressIndicator ): FilesResult { val withProgressProcessor = WithProgressProcessor(progress, files) val (results, externalCodeProcessing) = ApplicationManager.getApplication().runReadAction(Computable { elementsToKotlin(files, withProgressProcessor) }) + val texts = withProgressProcessor.processItems(0.5, results.withIndex()) { pair -> val (i, result) = pair try { val kotlinFile = ApplicationManager.getApplication().runReadAction(Computable { - createDummyKtFile(result!!.text, project, files[i]) + KtPsiFactory(project).createAnalyzableFile("dummy.kt", result!!.text, files[i]) }) - - CommandProcessor.getInstance().runUndoTransparentAction { - runBlocking(EDT.ModalityStateElement(ModalityState.defaultModalityState())) { - withContext(EDT) { - result!!.importsToAdd.forEach { - postProcessor.insertImport(kotlinFile, it) - } - } - } - } + result!!.importsToAdd.forEach { postProcessor.insertImport(kotlinFile, it) } AfterConversionPass(project, postProcessor).run(kotlinFile, range = null) @@ -117,20 +115,6 @@ abstract class JavaToKotlinConverter(private val project: Project) { return FilesResult(texts, externalCodeProcessing) } - fun elementsToKotlin(inputElements: List): Result { - return elementsToKotlin(inputElements, WithProgressProcessor.DEFAULT) - } -} - -class OldJavaToKotlinConverter( - project: Project, - private val settings: ConverterSettings, - private val services: JavaToKotlinConverterServices -) : JavaToKotlinConverter(project) { - - override fun createDummyKtFile(text: String, project: Project, context: PsiElement): KtFile = - KtPsiFactory(project).createAnalyzableFile("dummy.kt", text, context) - override fun elementsToKotlin(inputElements: List, processor: WithProgressProcessor): Result { try { val usageProcessings = LinkedHashMap>() diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverter.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverter.kt index 2145d3e166b..122c66303de 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverter.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverter.kt @@ -16,34 +16,76 @@ package org.jetbrains.kotlin.nj2k +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.ModalityState +import com.intellij.openapi.command.CommandProcessor +import com.intellij.openapi.diagnostic.Logger +import com.intellij.openapi.progress.ProcessCanceledException +import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Computable import com.intellij.psi.PsiElement import com.intellij.psi.PsiExpression +import com.intellij.psi.PsiJavaFile import com.intellij.psi.PsiStatement +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext +import org.jetbrains.kotlin.idea.core.util.EDT import org.jetbrains.kotlin.j2k.* -import org.jetbrains.kotlin.nj2k.tree.JKTreeElement -import org.jetbrains.kotlin.nj2k.tree.prettyDebugPrintTree -import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtPsiFactory class NewJavaToKotlinConverter( val project: Project, val settings: ConverterSettings, val oldConverterServices: JavaToKotlinConverterServices -) : JavaToKotlinConverter(project) { +) : JavaToKotlinConverter() { val converterServices = object : NewJavaToKotlinServices { override val oldServices = oldConverterServices } - override fun createDummyKtFile(text: String, project: Project, context: PsiElement): KtFile = - KtPsiFactory(project).createFileWithLightClassSupport("dummy.kt", text, context) + private val LOG = Logger.getInstance("#org.jetbrains.kotlin.j2k.JavaToKotlinConverter") - private fun List.prettyPrintTrees() = buildString { - for (tree in this@prettyPrintTrees) { - appendln() - appendln(tree.prettyDebugPrintTree()) - appendln() + override fun filesToKotlin( + files: List, + postProcessor: PostProcessor, + progress: ProgressIndicator + ): FilesResult { + val withProgressProcessor = WithProgressProcessor(progress, files) + val (results, externalCodeProcessing) = ApplicationManager.getApplication().runReadAction(Computable { + elementsToKotlin(files, withProgressProcessor) + }) + + val texts = withProgressProcessor.processItems(0.5, results.withIndex()) { pair -> + val (i, result) = pair + try { + val kotlinFile = ApplicationManager.getApplication().runReadAction(Computable { + KtPsiFactory(project).createFileWithLightClassSupport("dummy.kt", result!!.text, files[i]) + }) + + runBlocking(EDT.ModalityStateElement(ModalityState.defaultModalityState())) { + withContext(EDT) { + CommandProcessor.getInstance().runUndoTransparentAction { + result!!.importsToAdd.forEach { + postProcessor.insertImport(kotlinFile, it) + } + } + } + } + + CommandProcessor.getInstance().runUndoTransparentAction { + AfterConversionPass(project, postProcessor).run(kotlinFile, range = null) + } + + kotlinFile.text + } catch (e: ProcessCanceledException) { + throw e + } catch (t: Throwable) { + LOG.error(t) + result!!.text + } } + + return FilesResult(texts, externalCodeProcessing) } override fun elementsToKotlin(inputElements: List, processor: WithProgressProcessor): Result {