New J2K: use old J2K for evaluate expression instead of new one

#KT-32693 fixed
This commit is contained in:
Ilya Kirillov
2019-07-25 00:25:05 +03:00
parent e795e4b73d
commit 4e5e14046d
5 changed files with 38 additions and 64 deletions
@@ -1,39 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.j2k
import com.intellij.openapi.module.Module
import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiJavaFile
import org.jetbrains.kotlin.j2k.*
object JavaToKotlinConverterFactory {
fun createJavaToKotlinConverter(
project: Project,
targetModule: Module?,
settings: ConverterSettings,
services: JavaToKotlinConverterServices
): JavaToKotlinConverter =
J2kConverterExtension.extension.createJavaToKotlinConverter(project, targetModule, settings, services)
fun createPostProcessor(formatCode: Boolean): PostProcessor =
J2kConverterExtension.extension.createPostProcessor(formatCode)
fun createWithProgressIndicator(
progress: ProgressIndicator?,
files: List<PsiJavaFile>?,
phasesCount: Int
): WithProgressProcessor =
J2kConverterExtension.extension.createWithProgressProcessor(progress, files, phasesCount)
fun doCheckBeforeConversion(project: Project, module: Module): Boolean =
J2kConverterExtension.extension.doCheckBeforeConversion(project, module)
val isNewJ2k: Boolean
get() = J2kConverterExtension.extension.isNewJ2k
}
@@ -50,7 +50,6 @@ import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.core.util.toPsiFile
import org.jetbrains.kotlin.idea.j2k.IdeaJavaToKotlinServices
import org.jetbrains.kotlin.idea.j2k.J2kPostProcessor
import org.jetbrains.kotlin.idea.j2k.JavaToKotlinConverterFactory
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.idea.util.isRunningInCidrIde
@@ -123,7 +122,7 @@ class JavaToKotlinAction : AnAction() {
project,
ConverterSettings.defaultSettings,
IdeaJavaToKotlinServices
) else JavaToKotlinConverterFactory.createJavaToKotlinConverter(
) else J2kConverterExtension.extension().createJavaToKotlinConverter(
project,
module,
ConverterSettings.defaultSettings,
@@ -132,7 +131,7 @@ class JavaToKotlinAction : AnAction() {
converterResult = converter.filesToKotlin(
javaFiles,
if (forceUsingOldJ2k) J2kPostProcessor(formatCode = true)
else JavaToKotlinConverterFactory.createPostProcessor(formatCode = true),
else J2kConverterExtension.extension().createPostProcessor(formatCode = true),
progress = ProgressManager.getInstance().progressIndicator!!
)
}
@@ -144,7 +143,7 @@ class JavaToKotlinAction : AnAction() {
val linesCount = javaFiles.sumBy { StringUtil.getLineBreakCount(it.text) }
logJ2kConversionStatistics(
ConversionType.FILES,
JavaToKotlinConverterFactory.isNewJ2k,
J2kConverterExtension.isNewJ2k,
conversionTime,
linesCount,
javaFiles.size
@@ -220,7 +219,7 @@ class JavaToKotlinAction : AnAction() {
val module = e.getData(LangDataKeys.MODULE)!!
if (!JavaToKotlinConverterFactory.doCheckBeforeConversion(project, module)) return
if (!J2kConverterExtension.extension().doCheckBeforeConversion(project, module)) return
val firstSyntaxError = javaFiles.asSequence().map { PsiTreeUtil.findChildOfType(it, PsiErrorElement::class.java) }.firstOrNull()
@@ -39,7 +39,6 @@ import org.jetbrains.kotlin.idea.core.util.range
import org.jetbrains.kotlin.idea.core.util.start
import org.jetbrains.kotlin.idea.editor.KotlinEditorOptions
import org.jetbrains.kotlin.idea.j2k.IdeaJavaToKotlinServices
import org.jetbrains.kotlin.idea.j2k.JavaToKotlinConverterFactory
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.idea.util.application.runWriteAction
@@ -83,6 +82,8 @@ class ConvertJavaCopyPasteProcessor : CopyPastePostProcessor<TextBlockTransferab
val document = editor.document
val targetFile = PsiDocumentManager.getInstance(project).getPsiFile(document) as? KtFile ?: return
val useNewJ2k = checkUseNewJ2k(targetFile)
val targetModule = targetFile.module
if (isNoConversionPosition(targetFile, bounds.startOffset)) return
@@ -97,7 +98,7 @@ class ConvertJavaCopyPasteProcessor : CopyPastePostProcessor<TextBlockTransferab
val dataForConversion = DataForConversion.prepare(data, project)
fun doConversion(): Result {
val result = dataForConversion.elementsAndTexts.convertCodeToKotlin(project, targetModule)
val result = dataForConversion.elementsAndTexts.convertCodeToKotlin(project, targetModule, useNewJ2k)
val referenceData = buildReferenceData(result.text, result.parseContext, dataForConversion.importsAndPackage, targetFile)
val text = if (result.textChanged) result.text else null
return Result(text, referenceData, result.importsToAdd, result.converterContext)
@@ -161,7 +162,7 @@ class ConvertJavaCopyPasteProcessor : CopyPastePostProcessor<TextBlockTransferab
val newBounds = insertImports(boundsAfterReplace, referenceData, explicitImports)
PsiDocumentManager.getInstance(project).commitAllDocuments()
runPostProcessing(project, targetFile, newBounds, conversionResult?.converterContext)
runPostProcessing(project, targetFile, newBounds, conversionResult?.converterContext, useNewJ2k)
conversionPerformed = true
}
@@ -172,7 +173,7 @@ class ConvertJavaCopyPasteProcessor : CopyPastePostProcessor<TextBlockTransferab
}
logJ2kConversionStatistics(
ConversionType.PSI_EXPRESSION,
JavaToKotlinConverterFactory.isNewJ2k,
J2kConverterExtension.isNewJ2k,
conversionTime,
dataForConversion.elementsAndTexts.linesCount(),
filesCount = 1
@@ -227,9 +228,9 @@ internal class ConversionResult(
val converterContext: ConverterContext?
)
internal fun ElementAndTextList.convertCodeToKotlin(project: Project, targetModule: Module?): ConversionResult {
internal fun ElementAndTextList.convertCodeToKotlin(project: Project, targetModule: Module?, useNewJ2k: Boolean): ConversionResult {
val converter =
JavaToKotlinConverterFactory.createJavaToKotlinConverter(
J2kConverterExtension.extension(useNewJ2k).createJavaToKotlinConverter(
project,
targetModule,
ConverterSettings.defaultSettings,
@@ -319,13 +320,24 @@ fun ElementAndTextList.linesCount() =
.filterIsInstance<PsiElement>()
.sumBy { StringUtil.getLineBreakCount(it.text) }
fun runPostProcessing(project: Project, file: KtFile, bounds: TextRange?, converterContext: ConverterContext?) {
val postProcessor = JavaToKotlinConverterFactory.createPostProcessor(formatCode = true)
if (JavaToKotlinConverterFactory.isNewJ2k) {
fun checkUseNewJ2k(targetFile: KtFile): Boolean {
if (targetFile is KtCodeFragment) return false
return J2kConverterExtension.isNewJ2k
}
fun runPostProcessing(
project: Project,
file: KtFile,
bounds: TextRange?,
converterContext: ConverterContext?,
useNewJ2k: Boolean
) {
val postProcessor = J2kConverterExtension.extension(useNewJ2k).createPostProcessor(formatCode = true)
if (useNewJ2k) {
ProgressManager.getInstance().runProcessWithProgressSynchronously(
{
val processor =
JavaToKotlinConverterFactory.createWithProgressIndicator(
J2kConverterExtension.extension(useNewJ2k).createWithProgressProcessor(
ProgressManager.getInstance().progressIndicator!!,
emptyList(),
postProcessor.phasesCount
@@ -34,7 +34,6 @@ import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.editor.KotlinEditorOptions
import org.jetbrains.kotlin.idea.j2k.JavaToKotlinConverterFactory
import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.idea.util.projectStructure.module
import org.jetbrains.kotlin.j2k.ConversionType
@@ -98,6 +97,8 @@ class ConvertTextJavaCopyPasteProcessor : CopyPastePostProcessor<TextBlockTransf
val psiDocumentManager = PsiDocumentManager.getInstance(project)
psiDocumentManager.commitDocument(editor.document)
val targetFile = psiDocumentManager.getPsiFile(editor.document) as? KtFile ?: return
val useNewJ2k = checkUseNewJ2k(targetFile)
val targetModule = targetFile.module
val pasteTarget = detectPasteTarget(targetFile, bounds.startOffset, bounds.endOffset) ?: return
@@ -111,9 +112,9 @@ class ConvertTextJavaCopyPasteProcessor : CopyPastePostProcessor<TextBlockTransf
fun convert() {
val additionalImports = dataForConversion.tryResolveImports(targetFile)
var convertedImportsText = additionalImports.convertCodeToKotlin(project, targetModule).text
var convertedImportsText = additionalImports.convertCodeToKotlin(project, targetModule, useNewJ2k).text
val convertedResult = dataForConversion.convertCodeToKotlin(project, targetModule)
val convertedResult = dataForConversion.convertCodeToKotlin(project, targetModule, useNewJ2k)
val convertedText = convertedResult.text
val newBounds = runWriteAction {
@@ -133,7 +134,7 @@ class ConvertTextJavaCopyPasteProcessor : CopyPastePostProcessor<TextBlockTransf
}
psiDocumentManager.commitAllDocuments()
runPostProcessing(project, targetFile, newBounds, convertedResult.converterContext)
runPostProcessing(project, targetFile, newBounds, convertedResult.converterContext, useNewJ2k)
conversionPerformed = true
}
@@ -143,15 +144,15 @@ class ConvertTextJavaCopyPasteProcessor : CopyPastePostProcessor<TextBlockTransf
}
logJ2kConversionStatistics(
ConversionType.TEXT_EXPRESSION,
JavaToKotlinConverterFactory.isNewJ2k,
checkUseNewJ2k(targetFile),
conversionTime,
dataForConversion.elementsAndTexts.linesCount(),
filesCount = 1
)
}
private fun DataForConversion.convertCodeToKotlin(project: Project, targetModule: Module?): ConversionResult {
return elementsAndTexts.convertCodeToKotlin(project, targetModule)
private fun DataForConversion.convertCodeToKotlin(project: Project, targetModule: Module?,useNewJ2k: Boolean): ConversionResult {
return elementsAndTexts.convertCodeToKotlin(project, targetModule, useNewJ2k)
}
private val KtElement.pasteContext: KotlinContext
@@ -30,12 +30,13 @@ abstract class J2kConverterExtension : AbstractExtensionPointBean() {
): WithProgressProcessor
companion object {
private fun useNewJ2k() = Registry.`is`("kotlin.use.new.j2k", true)
val isNewJ2k
get() = Registry.`is`("kotlin.use.new.j2k", true)
val EP_NAME = ExtensionPointName.create<J2kConverterExtension>("org.jetbrains.kotlin.j2kConverterExtension")
val extension: J2kConverterExtension
get() = EP_NAME.extensions.first { it.isNewJ2k == useNewJ2k() }
fun extension(useNewJ2k: Boolean = isNewJ2k): J2kConverterExtension =
EP_NAME.extensions.first { it.isNewJ2k == useNewJ2k }
}
}