New J2K: use proper progress indicator for showing progress

#KT-33854 fixed
This commit is contained in:
Ilya Kirillov
2019-09-16 20:06:49 +03:00
parent 2916be6a53
commit 1b3c5f5d37
@@ -55,20 +55,20 @@ class NewJavaToKotlinConverter(
postProcessor: PostProcessor, postProcessor: PostProcessor,
progress: ProgressIndicator progress: ProgressIndicator
): FilesResult { ): FilesResult {
progress.isIndeterminate = false
val phasesCount = postProcessor.phasesCount + 1 val phasesCount = postProcessor.phasesCount + 1
val withProgressProcessor = NewJ2kWithProgressProcessor(progress, files, phasesCount) val withProgressProcessor = NewJ2kWithProgressProcessor(progress, files, phasesCount)
val (results, externalCodeProcessing, context) = withProgressProcessor.process { return withProgressProcessor.process {
val (results, externalCodeProcessing, context) =
ApplicationManager.getApplication().runReadAction(Computable { ApplicationManager.getApplication().runReadAction(Computable {
elementsToKotlin(files, withProgressProcessor) elementsToKotlin(files, withProgressProcessor)
}) })
}
val texts = results.mapIndexed { i, result -> val texts = results.mapIndexed { i, result ->
try { try {
val kotlinFile = ApplicationManager.getApplication().runReadAction(Computable { val kotlinFile = ApplicationManager.getApplication().runReadAction(Computable {
KtPsiFactory(project).createFileWithLightClassSupport("dummy.kt", result!!.text, files[i]) KtPsiFactory(project).createFileWithLightClassSupport("dummy.kt", result!!.text, files[i])
}) })
runBlocking(EDT.ModalityStateElement(ModalityState.defaultModalityState())) { runBlocking(EDT.ModalityStateElement(ModalityState.defaultModalityState())) {
withContext(EDT) { withContext(EDT) {
CommandProcessor.getInstance().runUndoTransparentAction { CommandProcessor.getInstance().runUndoTransparentAction {
@@ -78,15 +78,14 @@ class NewJavaToKotlinConverter(
} }
} }
} }
withProgressProcessor.process {
AfterConversionPass(project, postProcessor).run( AfterConversionPass(project, postProcessor).run(
kotlinFile, kotlinFile,
context, context,
range = null, range = null,
onPhaseChanged = { phase, description -> onPhaseChanged = { phase, description ->
withProgressProcessor.updateState(i, phase + 1, description) withProgressProcessor.updateState(i, phase + 1, description)
})
} }
)
kotlinFile.text kotlinFile.text
} catch (e: ProcessCanceledException) { } catch (e: ProcessCanceledException) {
throw e throw e
@@ -95,14 +94,11 @@ class NewJavaToKotlinConverter(
result!!.text result!!.text
} }
} }
FilesResult(texts, externalCodeProcessing)
return FilesResult(texts, externalCodeProcessing) }
} }
override fun elementsToKotlin(inputElements: List<PsiElement>, processor: WithProgressProcessor): Result { override fun elementsToKotlin(inputElements: List<PsiElement>, processor: WithProgressProcessor): Result {
@Suppress("NAME_SHADOWING")
val processor = processor as NewJ2kWithProgressProcessor
val phaseDescription = "Converting Java code to Kotlin code" val phaseDescription = "Converting Java code to Kotlin code"
val module = targetModule ?: error("Module should not be null for new J2K") val module = targetModule ?: error("Module should not be null for new J2K")
val contextElement = inputElements.firstOrNull() ?: return Result(emptyList(), null, null) val contextElement = inputElements.firstOrNull() ?: return Result(emptyList(), null, null)
@@ -112,12 +108,10 @@ class NewJavaToKotlinConverter(
symbolProvider.preBuildTree(inputElements) symbolProvider.preBuildTree(inputElements)
val importStorage = ImportStorage() val importStorage = ImportStorage()
val treeBuilder = JavaToJKTreeBuilder(symbolProvider, typeFactory, converterServices, importStorage) val treeBuilder = JavaToJKTreeBuilder(symbolProvider, typeFactory, converterServices, importStorage)
val asts = processor.process { val asts = inputElements.mapIndexed { i, element ->
inputElements.mapIndexed { i, element ->
processor.updateState(i, 1, phaseDescription) processor.updateState(i, 1, phaseDescription)
element to treeBuilder.buildTree(element) element to treeBuilder.buildTree(element)
} }
}
val context = NewJ2kConverterContext( val context = NewJ2kConverterContext(
symbolProvider, symbolProvider,
@@ -127,14 +121,12 @@ class NewJavaToKotlinConverter(
importStorage, importStorage,
JKElementInfoStorage() JKElementInfoStorage()
) )
processor.process {
ConversionsRunner.doApply(asts.withIndex().mapNotNull { (i, ast) -> ConversionsRunner.doApply(asts.withIndex().mapNotNull { (i, ast) ->
processor.updateState(i, 1, phaseDescription) processor.updateState(i, 1, phaseDescription)
ast.second ast.second
}, context) }, context)
}
val results = processor.process { val results = asts.mapIndexed { i, elementWithAst ->
asts.mapIndexed { i, elementWithAst ->
processor.updateState(i, 1, phaseDescription) processor.updateState(i, 1, phaseDescription)
val (element, ast) = elementWithAst val (element, ast) = elementWithAst
if (ast == null) return@mapIndexed null if (ast == null) return@mapIndexed null
@@ -149,7 +141,6 @@ class NewJavaToKotlinConverter(
parseContext = parseContext parseContext = parseContext
) )
} }
}
return Result(results, null, context) return Result(results, null, context)
} }
@@ -186,9 +177,8 @@ class NewJ2kWithProgressProcessor(
} }
override fun <T> process(action: () -> T): T { override fun <T> process(action: () -> T): T {
// we use special process with EmptyProgressIndicator to avoid changing text in our progress by inheritors search inside etc
var result: T? = null var result: T? = null
ProgressManager.getInstance().runProcess({ result = action() }, EmptyProgressIndicator()) ProgressManager.getInstance().runProcess({ result = action() }, progress)
return result!! return result!!
} }