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.diagnostic.Logger
import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.psi.impl.source.PostprocessReformattingAspect
import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference
import org.jetbrains.kotlin.idea.formatter.commitAndUnblockDocument 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.nj2k.postProcessing.processings.*
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.parents import org.jetbrains.kotlin.psi.psiUtil.parents
import sun.java2d.loops.FillRect
class NewJ2kPostProcessor : PostProcessor { class NewJ2kPostProcessor : PostProcessor {
@Suppress("PrivatePropertyName") @Suppress("PrivatePropertyName")
@@ -50,11 +52,12 @@ class NewJ2kPostProcessor : PostProcessor {
converterContext: ConverterContext?, converterContext: ConverterContext?,
onPhaseChanged: ((Int, String) -> Unit)? onPhaseChanged: ((Int, String) -> Unit)?
) { ) {
if (converterContext !is NewJ2kConverterContext) error("Invalid converter context for new J2K")
for ((i, group) in processings.withIndex()) { for ((i, group) in processings.withIndex()) {
onPhaseChanged?.invoke(i + 1, group.description) onPhaseChanged?.invoke(i + 1, group.description)
for (processing in group.processings) { for (processing in group.processings) {
try { try {
processing.runProcessing(target, converterContext as NewJ2kConverterContext) processing.runProcessingConsideringOptions(target, converterContext)
} catch (e: ProcessCanceledException) { } catch (e: ProcessCanceledException) {
throw e throw e
} catch (t: Throwable) { } 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) { private fun commitFile(file: KtFile) {
runUndoTransparentActionInEdt(inWriteAction = true) { runUndoTransparentActionInEdt(inWriteAction = true) {
file.commitAndUnblockDocument() file.commitAndUnblockDocument()
@@ -119,6 +119,8 @@ abstract class InspectionLikeProcessing {
// Running it in outer write action may lead to UI freezes // Running it in outer write action may lead to UI freezes
// So we let that post-processings to handle write actions by themselves // So we let that post-processings to handle write actions by themselves
open val writeActionNeeded = true open val writeActionNeeded = true
val processingOptions: PostProcessingOptions = PostProcessingOptions.DEFAULT
} }
abstract class InspectionLikeProcessingForElement<E : PsiElement>(private val classTag: Class<E>) : InspectionLikeProcessing() { abstract class InspectionLikeProcessingForElement<E : PsiElement>(private val classTag: Class<E>) : InspectionLikeProcessing() {
@@ -16,9 +16,20 @@ import org.jetbrains.kotlin.psi.KtFile
interface GeneralPostProcessing { interface GeneralPostProcessing {
val options: PostProcessingOptions
get() = PostProcessingOptions.DEFAULT
fun runProcessing(target: JKPostProcessingTarget, converterContext: NewJ2kConverterContext) fun runProcessing(target: JKPostProcessingTarget, converterContext: NewJ2kConverterContext)
} }
data class PostProcessingOptions(
val disablePostprocessingFormatting: Boolean = true
) {
companion object {
val DEFAULT = PostProcessingOptions()
}
}
abstract class FileBasedPostProcessing : GeneralPostProcessing { abstract class FileBasedPostProcessing : GeneralPostProcessing {
final override fun runProcessing(target: JKPostProcessingTarget, converterContext: NewJ2kConverterContext) = when (target) { 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) abstract fun runProcessing(elements: List<PsiElement>, converterContext: NewJ2kConverterContext)
} }
interface ProcessingGroup : GeneralPostProcessing
data class NamedPostProcessingGroup( data class NamedPostProcessingGroup(
val description: String, val description: String,
val processings: List<GeneralPostProcessing> val processings: List<GeneralPostProcessing>
@@ -55,6 +55,11 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import org.jetbrains.kotlin.utils.mapToIndex import org.jetbrains.kotlin.utils.mapToIndex
class ConvertGettersAndSettersToPropertyProcessing : ElementsBasedPostProcessing() { 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) { override fun runProcessing(elements: List<PsiElement>, converterContext: NewJ2kConverterContext) {
val ktElements = elements.filterIsInstance<KtElement>() val ktElements = elements.filterIsInstance<KtElement>()
val resolutionFacade = runReadAction { val resolutionFacade = runReadAction {
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.nj2k.JKImportStorage
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.postProcessing.FileBasedPostProcessing import org.jetbrains.kotlin.nj2k.postProcessing.FileBasedPostProcessing
import org.jetbrains.kotlin.nj2k.postProcessing.GeneralPostProcessing 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.nj2k.postProcessing.runUndoTransparentActionInEdt
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtQualifiedExpression 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.application.runWriteAction
import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.idea.util.getResolutionScope
import org.jetbrains.kotlin.j2k.ConverterSettings import org.jetbrains.kotlin.j2k.ConverterSettings
import org.jetbrains.kotlin.j2k.isInSingleLine
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.nj2k.postProcessing.InspectionLikeProcessingForElement 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) { class RemoveExplicitPropertyTypeProcessing : InspectionLikeProcessingForElement<KtProperty>(KtProperty::class.java) {
override fun isApplicableTo(element: KtProperty, settings: ConverterSettings?): Boolean { override fun isApplicableTo(element: KtProperty, settings: ConverterSettings?): Boolean {
if (element.typeReference == null) return false
val needFieldTypes = settings?.specifyFieldTypeByDefault == true val needFieldTypes = settings?.specifyFieldTypeByDefault == true
val needLocalVariablesTypes = settings?.specifyLocalVariableTypeByDefault == true val needLocalVariablesTypes = settings?.specifyLocalVariableTypeByDefault == true
@@ -56,7 +58,15 @@ class RemoveExplicitPropertyTypeProcessing : InspectionLikeProcessingForElement<
} }
override fun apply(element: KtProperty) { 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()
} }
} }