diff --git a/idea/idea-j2k/src/org/jetbrains/kotlin/idea/j2k/JavaToKotlinConverterFactory.kt b/idea/idea-j2k/src/org/jetbrains/kotlin/idea/j2k/JavaToKotlinConverterFactory.kt index a5d04473575..9c87e7a3a71 100644 --- a/idea/idea-j2k/src/org/jetbrains/kotlin/idea/j2k/JavaToKotlinConverterFactory.kt +++ b/idea/idea-j2k/src/org/jetbrains/kotlin/idea/j2k/JavaToKotlinConverterFactory.kt @@ -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) } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt index 8a33c3d5a95..27cec0f1e4d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt @@ -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) { diff --git a/j2k/src/org/jetbrains/kotlin/j2k/J2KConverterExtension.kt b/j2k/src/org/jetbrains/kotlin/j2k/J2KConverterExtension.kt index 387891a33a9..3c3bc848894 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/J2KConverterExtension.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/J2KConverterExtension.kt @@ -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) diff --git a/nj2k/nj2k-services/build.gradle.kts b/nj2k/nj2k-services/build.gradle.kts index b19961a183f..ca80b31aa04 100644 --- a/nj2k/nj2k-services/build.gradle.kts +++ b/nj2k/nj2k-services/build.gradle.kts @@ -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")) diff --git a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/NewJ2kConveterExtension.kt b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/NewJ2kConveterExtension.kt index 84a5ad300da..8432a278957 100644 --- a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/NewJ2kConveterExtension.kt +++ b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/NewJ2kConveterExtension.kt @@ -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 + } } \ No newline at end of file