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,54 +55,50 @@ 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 {
ApplicationManager.getApplication().runReadAction(Computable { val (results, externalCodeProcessing, context) =
elementsToKotlin(files, withProgressProcessor) ApplicationManager.getApplication().runReadAction(Computable {
}) elementsToKotlin(files, withProgressProcessor)
}
val texts = results.mapIndexed { i, result ->
try {
val kotlinFile = ApplicationManager.getApplication().runReadAction(Computable {
KtPsiFactory(project).createFileWithLightClassSupport("dummy.kt", result!!.text, files[i])
}) })
runBlocking(EDT.ModalityStateElement(ModalityState.defaultModalityState())) { val texts = results.mapIndexed { i, result ->
withContext(EDT) { try {
CommandProcessor.getInstance().runUndoTransparentAction { val kotlinFile = ApplicationManager.getApplication().runReadAction(Computable {
result!!.importsToAdd.forEach { KtPsiFactory(project).createFileWithLightClassSupport("dummy.kt", result!!.text, files[i])
postProcessor.insertImport(kotlinFile, it) })
runBlocking(EDT.ModalityStateElement(ModalityState.defaultModalityState())) {
withContext(EDT) {
CommandProcessor.getInstance().runUndoTransparentAction {
result!!.importsToAdd.forEach {
postProcessor.insertImport(kotlinFile, it)
}
} }
} }
} }
}
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
} catch (e: ProcessCanceledException) {
throw e
} catch (t: Throwable) {
LOG.error(t)
result!!.text
} }
kotlinFile.text
} catch (e: ProcessCanceledException) {
throw e
} catch (t: Throwable) {
LOG.error(t)
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,11 +108,9 @@ 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(
@@ -127,28 +121,25 @@ 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 = asts.mapIndexed { i, elementWithAst ->
val results = processor.process { processor.updateState(i, 1, phaseDescription)
asts.mapIndexed { i, elementWithAst -> val (element, ast) = elementWithAst
processor.updateState(i, 1, phaseDescription) if (ast == null) return@mapIndexed null
val (element, ast) = elementWithAst val code = NewCodeBuilder(context).run { printCodeOut(ast) }
if (ast == null) return@mapIndexed null val parseContext = when (element) {
val code = NewCodeBuilder(context).run { printCodeOut(ast) } is PsiStatement, is PsiExpression -> ParseContext.CODE_BLOCK
val parseContext = when (element) { else -> ParseContext.TOP_LEVEL
is PsiStatement, is PsiExpression -> ParseContext.CODE_BLOCK
else -> ParseContext.TOP_LEVEL
}
ElementResult(
code,
importsToAdd = importStorage.getImports(),
parseContext = parseContext
)
} }
ElementResult(
code,
importsToAdd = importStorage.getImports(),
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!!
} }