KT-5289 J2K: Should show progress when conversion takes time
#KT-5289 Fixed
This commit is contained in:
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.psi.JetProperty
|
||||
|
||||
class AfterConversionPass(val project: Project, val postProcessor: PostProcessor) {
|
||||
public fun run(kotlinCode: String): String {
|
||||
//TODO: it's more correct to analyze all converted files together
|
||||
val kotlinFile = JetPsiFactory(project).createAnalyzableFile(
|
||||
"fileForAfterConversionPass.kt", kotlinCode, postProcessor.contextToAnalyzeIn
|
||||
)
|
||||
|
||||
@@ -17,9 +17,13 @@
|
||||
package org.jetbrains.kotlin.j2k
|
||||
|
||||
import com.intellij.openapi.diagnostic.Logger
|
||||
import com.intellij.openapi.progress.EmptyProgressIndicator
|
||||
import com.intellij.openapi.progress.ProcessCanceledException
|
||||
import com.intellij.openapi.progress.ProgressIndicator
|
||||
import com.intellij.openapi.progress.ProgressManager
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiFile
|
||||
import com.intellij.psi.PsiJavaFile
|
||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||
import org.jetbrains.kotlin.diagnostics.Errors
|
||||
@@ -73,29 +77,68 @@ public class JavaToKotlinConverter(private val project: Project,
|
||||
private val resolverForConverter: ResolverForConverter) {
|
||||
private val LOG = Logger.getInstance("#org.jetbrains.kotlin.j2k.JavaToKotlinConverter")
|
||||
|
||||
public fun elementsToKotlin(psiElementsAndProcessors: List<Pair<PsiElement, PostProcessor?>>): List<String> {
|
||||
public fun elementsToKotlin(
|
||||
psiElementsAndProcessors: List<Pair<PsiElement, PostProcessor?>>,
|
||||
progress: ProgressIndicator = EmptyProgressIndicator()
|
||||
): List<String> {
|
||||
try {
|
||||
val intermediateResults = ArrayList<((Map<PsiElement, UsageProcessing>) -> String)?>(psiElementsAndProcessors.size())
|
||||
val elementCount = psiElementsAndProcessors.size()
|
||||
val intermediateResults = ArrayList<((Map<PsiElement, UsageProcessing>) -> String)?>(elementCount)
|
||||
val usageProcessings = HashMap<PsiElement, UsageProcessing>()
|
||||
val usageProcessingCollector: (UsageProcessing) -> Unit = { usageProcessing ->
|
||||
assert(!usageProcessings.containsKey(usageProcessing.targetElement))
|
||||
{ "Duplicated UsageProcessing for target element ${usageProcessing.targetElement}" }
|
||||
usageProcessings.put(usageProcessing.targetElement, usageProcessing)
|
||||
}
|
||||
for ((psiElement, postProcessor) in psiElementsAndProcessors) {
|
||||
|
||||
val progressText = "Converting Java to Kotlin"
|
||||
val fileCountText = elementCount.toString() + " " + if (elementCount > 1) "files" else "file"
|
||||
var fraction = 0.0
|
||||
var pass = 1
|
||||
|
||||
fun processFilesWithProgress(passFraction: Double, processFile: (Int) -> Unit) {
|
||||
// we use special process with EmptyProgressIndicator to avoid changing text in our progress by inheritors search inside etc
|
||||
ProgressManager.getInstance().runProcess(
|
||||
{
|
||||
progress.setText("$progressText ($fileCountText) - pass $pass of 3")
|
||||
|
||||
val filesCount = psiElementsAndProcessors.indices
|
||||
for (i in filesCount) {
|
||||
progress.checkCanceled()
|
||||
progress.setFraction(fraction + passFraction * i / elementCount)
|
||||
|
||||
val psiFile = psiElementsAndProcessors[i].first as? PsiFile
|
||||
if (psiFile != null) {
|
||||
progress.setText2(psiFile.getVirtualFile().getPresentableUrl())
|
||||
}
|
||||
|
||||
processFile(i)
|
||||
}
|
||||
|
||||
pass++
|
||||
fraction += passFraction
|
||||
},
|
||||
EmptyProgressIndicator())
|
||||
}
|
||||
|
||||
processFilesWithProgress(0.25) { i ->
|
||||
val psiElement = psiElementsAndProcessors[i].first
|
||||
val postProcessor = psiElementsAndProcessors[i].second
|
||||
val converter = Converter.create(psiElement, settings, conversionScope, referenceSearcher, resolverForConverter, postProcessor, usageProcessingCollector)
|
||||
val result = converter.convert()
|
||||
intermediateResults.add(result)
|
||||
}
|
||||
|
||||
val results = ArrayList<String>(psiElementsAndProcessors.size())
|
||||
for ((i, result) in intermediateResults.withIndex()) {
|
||||
val results = ArrayList<String>(elementCount)
|
||||
processFilesWithProgress(0.25) { i ->
|
||||
val result = intermediateResults[i]
|
||||
results.add(if (result != null) result(usageProcessings) else "")
|
||||
intermediateResults[i] = null // to not hold unused objects in the heap
|
||||
}
|
||||
|
||||
val finalResults = ArrayList<String>(psiElementsAndProcessors.size())
|
||||
for ((i, result) in results.withIndex()) {
|
||||
val finalResults = ArrayList<String>(elementCount)
|
||||
processFilesWithProgress(0.5) { i ->
|
||||
val result = results[i]
|
||||
val postProcessor = psiElementsAndProcessors[i].second
|
||||
if (postProcessor != null) {
|
||||
try {
|
||||
@@ -113,6 +156,7 @@ public class JavaToKotlinConverter(private val project: Project,
|
||||
finalResults.add(result)
|
||||
}
|
||||
}
|
||||
|
||||
return finalResults
|
||||
}
|
||||
catch(e: ElementCreationStackTraceRequiredException) {
|
||||
|
||||
@@ -35,7 +35,7 @@ public abstract class AbstractJavaToKotlinConverterMultiFileTest : AbstractJavaT
|
||||
val project = LightPlatformTestCase.getProject()!!
|
||||
val psiManager = PsiManager.getInstance(project)
|
||||
|
||||
val javaFiles = File(dirPath).listFiles {(file, name): Boolean -> name.endsWith(".java") }
|
||||
val javaFiles = File(dirPath).listFiles { file, name -> name.endsWith(".java") }
|
||||
val psiFiles = ArrayList<PsiJavaFile>()
|
||||
for (javaFile: File in javaFiles) {
|
||||
val virtualFile = addFile(javaFile, "test")
|
||||
@@ -44,8 +44,7 @@ public abstract class AbstractJavaToKotlinConverterMultiFileTest : AbstractJavaT
|
||||
}
|
||||
|
||||
val converter = JavaToKotlinConverter(project, ConverterSettings.defaultSettings, FilesConversionScope(psiFiles), IdeaReferenceSearcher, IdeaResolverForConverter)
|
||||
val results: List<String> = converter.elementsToKotlin(psiFiles.map { it to J2kPostProcessor(it) })
|
||||
.map { reformat(it, project) }
|
||||
val results: List<String> = converter.elementsToKotlin(psiFiles.map { it to J2kPostProcessor(it, formatCode = true) })
|
||||
|
||||
fun expectedFile(i: Int) = File(javaFiles[i].getPath().replace(".java", ".kt"))
|
||||
|
||||
@@ -61,14 +60,6 @@ public abstract class AbstractJavaToKotlinConverterMultiFileTest : AbstractJavaT
|
||||
}
|
||||
}
|
||||
|
||||
private fun reformat(text: String, project: Project): String {
|
||||
val convertedFile = JetTestUtils.createFile("converted", text, project)
|
||||
WriteCommandAction.runWriteCommandAction(project) {
|
||||
CodeStyleManager.getInstance(project)!!.reformat(convertedFile)
|
||||
}
|
||||
return convertedFile.getText()!!
|
||||
}
|
||||
|
||||
override fun getProjectDescriptor()
|
||||
= JetWithJdkAndRuntimeLightProjectDescriptor.INSTANCE
|
||||
}
|
||||
|
||||
@@ -66,7 +66,6 @@ public abstract class AbstractJavaToKotlinConverterSingleFileTest : AbstractJava
|
||||
}
|
||||
|
||||
val rawConverted = when (prefix) {
|
||||
"element" -> elementToKotlin(javaCode, settings, project)
|
||||
"expression" -> expressionToKotlin(javaCode, settings, project)
|
||||
"statement" -> statementToKotlin(javaCode, settings, project)
|
||||
"method" -> methodToKotlin(javaCode, settings, project)
|
||||
@@ -105,17 +104,10 @@ public abstract class AbstractJavaToKotlinConverterSingleFileTest : AbstractJava
|
||||
reformattedText
|
||||
}
|
||||
|
||||
private fun elementToKotlin(text: String, settings: ConverterSettings, project: Project): String {
|
||||
val fileWithText = createJavaFile(text)
|
||||
val converter = JavaToKotlinConverter(project, settings, FilesConversionScope(listOf(fileWithText)), IdeaReferenceSearcher, IdeaResolverForConverter)
|
||||
val element = fileWithText.getFirstChild()!!
|
||||
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, IdeaResolverForConverter)
|
||||
return converter.elementsToKotlin(listOf(file to J2kPostProcessor(file)))[0]
|
||||
return converter.elementsToKotlin(listOf(file to J2kPostProcessor(file, formatCode = false)))[0]
|
||||
}
|
||||
|
||||
private fun methodToKotlin(text: String, settings: ConverterSettings, project: Project): String {
|
||||
|
||||
Reference in New Issue
Block a user