New J2K: use proper progress indicator for showing progress
#KT-33854 fixed
This commit is contained in:
@@ -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!!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user