New J2K: suggest user to configure Kotlin in a project before nj2k conversion

This commit is contained in:
Ilya Kirillov
2019-06-04 16:42:14 +03:00
parent 3792c44378
commit aaab1fe134
5 changed files with 59 additions and 3 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.idea.j2k
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.j2k.*
@@ -18,4 +19,7 @@ object JavaToKotlinConverterFactory {
fun createPostProcessor(formatCode: Boolean): PostProcessor =
J2kConverterExtension.extension.createPostProcessor(formatCode)
fun doCheckBeforeConversion(project: Project, module: Module): Boolean =
J2kConverterExtension.extension.doCheckBeforeConversion(project, module)
}
@@ -21,9 +21,7 @@ import com.intellij.ide.highlighter.ArchiveFileType
import com.intellij.ide.highlighter.JavaFileType
import com.intellij.ide.scratch.ScratchFileService
import com.intellij.ide.scratch.ScratchRootType
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.actionSystem.*
import com.intellij.openapi.command.CommandProcessor
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.fileEditor.FileEditorManager
@@ -182,6 +180,10 @@ class JavaToKotlinAction : AnAction() {
.showInCenterOf(statusBar.component)
}
val module = e.getData(LangDataKeys.MODULE)!!
if (!JavaToKotlinConverterFactory.doCheckBeforeConversion(project, module)) return
val firstSyntaxError = javaFiles.asSequence().map { PsiTreeUtil.findChildOfType(it, PsiErrorElement::class.java) }.firstOrNull()
if (firstSyntaxError != null) {
@@ -2,6 +2,7 @@ package org.jetbrains.kotlin.j2k
import com.intellij.openapi.extensions.AbstractExtensionPointBean
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.registry.Registry
@@ -16,6 +17,8 @@ abstract class J2kConverterExtension : AbstractExtensionPointBean() {
abstract fun createPostProcessor(formatCode: Boolean): PostProcessor
open fun doCheckBeforeConversion(project: Project, module: Module): Boolean =
true
companion object {
private fun useNewJ2k() = Registry.`is`("kotlin.use.new.j2k", false)
+1
View File
@@ -31,6 +31,7 @@ dependencies {
compile(project(":idea:fir-view"))
compile(project(":idea:idea-core"))
compile(project(":idea:ide-common"))
compile(project(":idea:idea-jvm"))
compile(project(":idea:idea-jps-common"))
compile(project(":idea:kotlin-gradle-tooling"))
compile(project(":plugins:uast-kotlin"))
@@ -1,8 +1,15 @@
package org.jetbrains.kotlin.nj2k
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.Messages
import org.jetbrains.kotlin.idea.configuration.getAbleToRunConfigurators
import org.jetbrains.kotlin.idea.configuration.hasAnyKotlinRuntimeInScope
import org.jetbrains.kotlin.idea.configuration.isModuleConfigured
import org.jetbrains.kotlin.idea.configuration.toModuleGroup
import org.jetbrains.kotlin.j2k.*
import org.jetbrains.kotlin.nj2k.postProcessing.NewJ2kPostProcessor
import org.jetbrains.kotlin.platform.jvm.isJvm
class NewJ2kConverterExtension : J2kConverterExtension() {
override val isNewJ2k = true
@@ -16,4 +23,43 @@ class NewJ2kConverterExtension : J2kConverterExtension() {
override fun createPostProcessor(formatCode: Boolean): PostProcessor =
NewJ2kPostProcessor()
override fun doCheckBeforeConversion(project: Project, module: Module): Boolean =
checkKotlinIsConfigured(project, module)
private fun checkKotlinIsConfigured(project: Project, module: Module): Boolean {
val kotlinIsConfigured =
hasAnyKotlinRuntimeInScope(module) || isModuleConfigured(module.toModuleGroup())
if (kotlinIsConfigured) return true
val title = "Kotlin is not configured in the project"
if (Messages.showOkCancelDialog(
project,
"You will have to configure Kotlin in project before performing a conversion.",
title,
"OK, configure Kotlin in the project",
"No, cancel conversion",
Messages.getWarningIcon()
) == Messages.OK
) {
val configurators = getAbleToRunConfigurators(module).filter { it.targetPlatform.isJvm() }
when {
configurators.isEmpty() -> Messages.showErrorDialog("There aren't configurators available", title)
configurators.size == 1 -> configurators.single().configure(project, emptyList())
else -> {
val resultIndex = Messages.showChooseDialog(//TODO a better dialog?
project,
"Choose Configurator",
title,
null,
configurators.map { it.presentableText }.toTypedArray(),
configurators.first().presentableText
)
configurators.getOrNull(resultIndex)?.configure(project, emptyList())
}
}
}
return false
}
}