New J2K: disable additional post-formatting for J2K

As there is a formatting processing, it's not needed but takes some time
This commit is contained in:
Ilya Kirillov
2020-02-16 15:30:24 +03:00
parent 85be0450ba
commit 6c1e2cc196
6 changed files with 48 additions and 4 deletions
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.nj2k.postProcessing
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.psi.impl.source.PostprocessReformattingAspect
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference
import org.jetbrains.kotlin.idea.formatter.commitAndUnblockDocument
@@ -30,6 +31,7 @@ import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.postProcessing.processings.*
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.parents
import sun.java2d.loops.FillRect
class NewJ2kPostProcessor : PostProcessor {
@Suppress("PrivatePropertyName")
@@ -50,11 +52,12 @@ class NewJ2kPostProcessor : PostProcessor {
converterContext: ConverterContext?,
onPhaseChanged: ((Int, String) -> Unit)?
) {
if (converterContext !is NewJ2kConverterContext) error("Invalid converter context for new J2K")
for ((i, group) in processings.withIndex()) {
onPhaseChanged?.invoke(i + 1, group.description)
for (processing in group.processings) {
try {
processing.runProcessing(target, converterContext as NewJ2kConverterContext)
processing.runProcessingConsideringOptions(target, converterContext)
} catch (e: ProcessCanceledException) {
throw e
} catch (t: Throwable) {
@@ -66,6 +69,20 @@ class NewJ2kPostProcessor : PostProcessor {
}
}
private fun GeneralPostProcessing.runProcessingConsideringOptions(
target: JKPostProcessingTarget,
converterContext: NewJ2kConverterContext
) {
if (options.disablePostprocessingFormatting) {
PostprocessReformattingAspect.getInstance(converterContext.project).disablePostprocessFormattingInside {
runProcessing(target, converterContext)
}
} else {
runProcessing(target, converterContext)
}
}
private fun commitFile(file: KtFile) {
runUndoTransparentActionInEdt(inWriteAction = true) {
file.commitAndUnblockDocument()
@@ -119,6 +119,8 @@ abstract class InspectionLikeProcessing {
// Running it in outer write action may lead to UI freezes
// So we let that post-processings to handle write actions by themselves
open val writeActionNeeded = true
val processingOptions: PostProcessingOptions = PostProcessingOptions.DEFAULT
}
abstract class InspectionLikeProcessingForElement<E : PsiElement>(private val classTag: Class<E>) : InspectionLikeProcessing() {
@@ -16,9 +16,20 @@ import org.jetbrains.kotlin.psi.KtFile
interface GeneralPostProcessing {
val options: PostProcessingOptions
get() = PostProcessingOptions.DEFAULT
fun runProcessing(target: JKPostProcessingTarget, converterContext: NewJ2kConverterContext)
}
data class PostProcessingOptions(
val disablePostprocessingFormatting: Boolean = true
) {
companion object {
val DEFAULT = PostProcessingOptions()
}
}
abstract class FileBasedPostProcessing : GeneralPostProcessing {
final override fun runProcessing(target: JKPostProcessingTarget, converterContext: NewJ2kConverterContext) = when (target) {
@@ -41,8 +52,6 @@ abstract class ElementsBasedPostProcessing : GeneralPostProcessing {
abstract fun runProcessing(elements: List<PsiElement>, converterContext: NewJ2kConverterContext)
}
interface ProcessingGroup : GeneralPostProcessing
data class NamedPostProcessingGroup(
val description: String,
val processings: List<GeneralPostProcessing>
@@ -55,6 +55,11 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import org.jetbrains.kotlin.utils.mapToIndex
class ConvertGettersAndSettersToPropertyProcessing : ElementsBasedPostProcessing() {
override val options: PostProcessingOptions =
PostProcessingOptions(
disablePostprocessingFormatting = false // without it comment saver will make the file invalid :(
)
override fun runProcessing(elements: List<PsiElement>, converterContext: NewJ2kConverterContext) {
val ktElements = elements.filterIsInstance<KtElement>()
val resolutionFacade = runReadAction {
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.nj2k.JKImportStorage
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.postProcessing.FileBasedPostProcessing
import org.jetbrains.kotlin.nj2k.postProcessing.GeneralPostProcessing
import org.jetbrains.kotlin.nj2k.postProcessing.PostProcessingOptions
import org.jetbrains.kotlin.nj2k.postProcessing.runUndoTransparentActionInEdt
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtQualifiedExpression
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.idea.util.CommentSaver
import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.idea.util.getResolutionScope
import org.jetbrains.kotlin.j2k.ConverterSettings
import org.jetbrains.kotlin.j2k.isInSingleLine
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.nj2k.postProcessing.InspectionLikeProcessingForElement
@@ -43,6 +44,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class RemoveExplicitPropertyTypeProcessing : InspectionLikeProcessingForElement<KtProperty>(KtProperty::class.java) {
override fun isApplicableTo(element: KtProperty, settings: ConverterSettings?): Boolean {
if (element.typeReference == null) return false
val needFieldTypes = settings?.specifyFieldTypeByDefault == true
val needLocalVariablesTypes = settings?.specifyLocalVariableTypeByDefault == true
@@ -56,7 +58,15 @@ class RemoveExplicitPropertyTypeProcessing : InspectionLikeProcessingForElement<
}
override fun apply(element: KtProperty) {
element.typeReference = null
val typeReference = element.typeReference ?: return
element.colon?.let { colon ->
val followingWhiteSpace = colon.nextSibling?.takeIf { following ->
following is PsiWhiteSpace && following.isInSingleLine()
}
followingWhiteSpace?.delete()
colon.delete()
}
typeReference.delete()
}
}