diff --git a/plugins/kotlin/compiler-plugins/allopen/maven/src/org/jetbrains/kotlin/idea/compilerPlugin/allopen/maven/AllOpenMavenProjectImportHandler.kt b/plugins/kotlin/compiler-plugins/allopen/maven/src/org/jetbrains/kotlin/idea/compilerPlugin/allopen/maven/AllOpenMavenProjectImportHandler.kt index f9df693caff8..32b66f0140c7 100644 --- a/plugins/kotlin/compiler-plugins/allopen/maven/src/org/jetbrains/kotlin/idea/compilerPlugin/allopen/maven/AllOpenMavenProjectImportHandler.kt +++ b/plugins/kotlin/compiler-plugins/allopen/maven/src/org/jetbrains/kotlin/idea/compilerPlugin/allopen/maven/AllOpenMavenProjectImportHandler.kt @@ -3,6 +3,7 @@ package org.jetbrains.kotlin.idea.compilerPlugin.allopen.maven import com.intellij.openapi.project.Project +import com.intellij.util.text.VersionComparatorUtil import org.jetbrains.idea.maven.project.MavenProject import org.jetbrains.kotlin.allopen.AllOpenPluginNames.ANNOTATION_OPTION_NAME import org.jetbrains.kotlin.allopen.AllOpenPluginNames.PLUGIN_ID @@ -11,6 +12,7 @@ import org.jetbrains.kotlin.idea.base.plugin.artifacts.KotlinArtifacts import org.jetbrains.kotlin.idea.compilerPlugin.CompilerPluginSetup.PluginOption import org.jetbrains.kotlin.idea.maven.compilerPlugin.AbstractMavenImportHandler import java.nio.file.Path +import org.jetbrains.kotlin.idea.maven.getKotlinPlugin class AllOpenMavenProjectImportHandler(project: Project) : AbstractMavenImportHandler(project) { override val compilerPluginId: String = PLUGIN_ID @@ -23,7 +25,10 @@ class AllOpenMavenProjectImportHandler(project: Project) : AbstractMavenImportHa enabledCompilerPlugins: List, compilerPluginOptions: List ): List? { - if ("all-open" !in enabledCompilerPlugins && "spring" !in enabledCompilerPlugins) { + if ("all-open" !in enabledCompilerPlugins && + "spring" !in enabledCompilerPlugins && + !mavenProject.isJpaWithAllOpenEnabled(enabledCompilerPlugins) + ) { return null } @@ -42,6 +47,15 @@ class AllOpenMavenProjectImportHandler(project: Project) : AbstractMavenImportHa return annotations.map { PluginOption(ANNOTATION_OPTION_NAME, it) } } + + private fun MavenProject.isJpaWithAllOpenEnabled( + enabledCompilerPlugins: List + ): Boolean { + val kotlinPluginVersion = getKotlinPlugin().version + + return "jpa" in enabledCompilerPlugins && + VersionComparatorUtil.compare(kotlinPluginVersion, "2.3.20-Beta2") >= 0 + } } private const val ANNOTATION_PARAMETER_PREFIX = "all-open:$ANNOTATION_OPTION_NAME=" diff --git a/plugins/kotlin/compiler-plugins/compiler-plugin-support/maven/src/org/jetbrains/kotlin/idea/maven/compilerPlugin/AbstractMavenImportHandler.kt b/plugins/kotlin/compiler-plugins/compiler-plugin-support/maven/src/org/jetbrains/kotlin/idea/maven/compilerPlugin/AbstractMavenImportHandler.kt index cbf30e73423f..b1e00afc4523 100644 --- a/plugins/kotlin/compiler-plugins/compiler-plugin-support/maven/src/org/jetbrains/kotlin/idea/maven/compilerPlugin/AbstractMavenImportHandler.kt +++ b/plugins/kotlin/compiler-plugins/compiler-plugin-support/maven/src/org/jetbrains/kotlin/idea/maven/compilerPlugin/AbstractMavenImportHandler.kt @@ -11,10 +11,9 @@ import org.jetbrains.kotlin.idea.compiler.configuration.KotlinPluginLayoutServic import org.jetbrains.kotlin.idea.compilerPlugin.CompilerPluginSetup import org.jetbrains.kotlin.idea.compilerPlugin.CompilerPluginSetup.PluginOption import org.jetbrains.kotlin.idea.compilerPlugin.modifyCompilerArgumentsForPluginWithFacetSettings -import org.jetbrains.kotlin.idea.maven.KotlinMavenImporter.Companion.KOTLIN_PLUGIN_ARTIFACT_ID -import org.jetbrains.kotlin.idea.maven.KotlinMavenImporter.Companion.KOTLIN_PLUGIN_GROUP_ID import org.jetbrains.kotlin.idea.maven.MavenProjectImportHandler import java.nio.file.Path +import org.jetbrains.kotlin.idea.maven.findKotlinPlugin abstract class AbstractMavenImportHandler(protected val project: Project) : MavenProjectImportHandler { abstract val compilerPluginId: String @@ -37,9 +36,7 @@ abstract class AbstractMavenImportHandler(protected val project: Project) : Mave ): List? private fun getPluginSetup(mavenProject: MavenProject): CompilerPluginSetup? { - val kotlinPlugin = mavenProject.plugins.firstOrNull { - it.groupId == KOTLIN_PLUGIN_GROUP_ID && it.artifactId == KOTLIN_PLUGIN_ARTIFACT_ID - } ?: return null + val kotlinPlugin = mavenProject.findKotlinPlugin() ?: return null val configuration = kotlinPlugin.configurationElement ?: return null diff --git a/plugins/kotlin/maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt b/plugins/kotlin/maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt index 6d5a6bb19de7..5c8c0857fac7 100644 --- a/plugins/kotlin/maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt +++ b/plugins/kotlin/maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt @@ -201,7 +201,7 @@ open class KotlinMavenImporter : MavenApplicableConfigurator(KOTLIN_PLUGIN_GROUP detectPlatformByExecutions(mavenProject) ?: detectPlatformByLibraries(mavenProject) private fun detectPlatformByExecutions(mavenProject: MavenProject): IdePlatformKind? { - return mavenProject.findPlugin(KOTLIN_PLUGIN_GROUP_ID, KOTLIN_PLUGIN_ARTIFACT_ID)?.executions?.flatMap { it.goals } + return mavenProject.findKotlinPlugin()?.executions?.flatMap { it.goals } ?.mapNotNull { goal -> when (goal) { PomFile.KotlinGoals.Compile, PomFile.KotlinGoals.TestCompile -> JvmIdePlatformKind @@ -245,6 +245,10 @@ open class KotlinMavenImporter : MavenApplicableConfigurator(KOTLIN_PLUGIN_GROUP } } +fun MavenProject.findKotlinPlugin() = plugins.firstOrNull { it.isKotlinPlugin() } + +fun MavenProject.getKotlinPlugin() = plugins.single { it.isKotlinPlugin() } + fun MavenPlugin.isKotlinPlugin(): Boolean = groupId == KotlinMavenImporter.KOTLIN_PLUGIN_GROUP_ID && artifactId == KotlinMavenImporter.KOTLIN_PLUGIN_ARTIFACT_ID diff --git a/plugins/kotlin/maven/tests/test/org/jetbrains/kotlin/idea/maven/AbstractKotlinMavenImporterTest.kt b/plugins/kotlin/maven/tests/test/org/jetbrains/kotlin/idea/maven/AbstractKotlinMavenImporterTest.kt index 8bf317f8b99a..65b7221d0f0c 100644 --- a/plugins/kotlin/maven/tests/test/org/jetbrains/kotlin/idea/maven/AbstractKotlinMavenImporterTest.kt +++ b/plugins/kotlin/maven/tests/test/org/jetbrains/kotlin/idea/maven/AbstractKotlinMavenImporterTest.kt @@ -3921,4 +3921,13 @@ abstract class AbstractKotlinMavenImporterTest(private val createStdProjectFolde } } } + + object TestVersions { + object Kotlin { + const val KOTLIN_2_3_10 = "2.3.10" + const val KOTLIN_2_3_20 = "2.3.20-Beta2" + + const val LATEST_STABLE = "2.3.10" + } + } } diff --git a/plugins/kotlin/maven/tests/test/org/jetbrains/kotlin/idea/maven/importer/AllOpenKotlinMavenImporterTest.kt b/plugins/kotlin/maven/tests/test/org/jetbrains/kotlin/idea/maven/importer/AllOpenKotlinMavenImporterTest.kt new file mode 100644 index 000000000000..2b9cbb368b90 --- /dev/null +++ b/plugins/kotlin/maven/tests/test/org/jetbrains/kotlin/idea/maven/importer/AllOpenKotlinMavenImporterTest.kt @@ -0,0 +1,110 @@ +// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.idea.maven.importer + +import kotlinx.coroutines.runBlocking +import org.jetbrains.kotlin.idea.base.plugin.artifacts.KotlinArtifacts +import org.jetbrains.kotlin.idea.maven.AbstractKotlinMavenImporterTest +import org.junit.Assert.assertArrayEquals +import org.junit.Test + +class AllOpenKotlinMavenImporterTest : AbstractKotlinMavenImporterTest() { + + @Test + fun testAllOpenIsNotEnabledViaJpaPluginInOldKotlinVersions() = runBlocking { + createProjectSubDirs("src/main/kotlin", "src/test/kotlin") + + importProjectAsync(projectWithJpaPlugin(TestVersions.Kotlin.KOTLIN_2_3_10)) + + assertModules("project") + + with(facetSettings) { + assertNotNull(compilerArguments?.pluginClasspaths) + assertFalse(compilerArguments!!.pluginClasspaths!!.any { it.endsWith(KotlinArtifacts.allopenCompilerPluginPath.fileName.toString()) }) + assertTrue(compilerArguments!!.pluginClasspaths!!.any { it.endsWith(KotlinArtifacts.noargCompilerPluginPath.fileName.toString()) }) + } + } + + @Test + fun testAllOpenIsEnabledViaJpaPlugin() = runBlocking { + createProjectSubDirs("src/main/kotlin", "src/test/kotlin") + + importProjectAsync(projectWithJpaPlugin(TestVersions.Kotlin.KOTLIN_2_3_20)) + + assertModules("project") + + with(facetSettings) { + assertNotNull(compilerArguments?.pluginClasspaths) + assertTrue(compilerArguments!!.pluginClasspaths!!.any { it.endsWith(KotlinArtifacts.allopenCompilerPluginPath.fileName.toString()) }) + assertTrue(compilerArguments!!.pluginClasspaths!!.any { it.endsWith(KotlinArtifacts.noargCompilerPluginPath.fileName.toString()) }) + assertArrayEquals( + compilerArguments!!.pluginOptions!!, + arrayOf( + "plugin:org.jetbrains.kotlin.noarg:annotation=javax.persistence.Entity", + "plugin:org.jetbrains.kotlin.noarg:annotation=javax.persistence.Embeddable", + "plugin:org.jetbrains.kotlin.noarg:annotation=javax.persistence.MappedSuperclass", + "plugin:org.jetbrains.kotlin.noarg:annotation=jakarta.persistence.Entity", + "plugin:org.jetbrains.kotlin.noarg:annotation=jakarta.persistence.Embeddable", + "plugin:org.jetbrains.kotlin.noarg:annotation=jakarta.persistence.MappedSuperclass", + "plugin:org.jetbrains.kotlin.allopen:annotation=javax.persistence.Entity", + "plugin:org.jetbrains.kotlin.allopen:annotation=javax.persistence.Embeddable", + "plugin:org.jetbrains.kotlin.allopen:annotation=javax.persistence.MappedSuperclass", + "plugin:org.jetbrains.kotlin.allopen:annotation=jakarta.persistence.Entity", + "plugin:org.jetbrains.kotlin.allopen:annotation=jakarta.persistence.Embeddable", + "plugin:org.jetbrains.kotlin.allopen:annotation=jakarta.persistence.MappedSuperclass", + ) + ) + } + } + + private fun projectWithJpaPlugin(kotlinVersion: String) = + //language=xml + """ + |test + |project + |1.0.0 + | + | + | ${kotlinVersion} + | + | + | + | src/main/kotlin + | src/test/kotlin + | + | + | org.jetbrains.kotlin + | kotlin-maven-plugin + | ${'$'}{kotlin.version} + | + | + | jpa + | + | + | + | + | compile + | compile + | + | compile + | + | + | + | test-compile + | test-compile + | + | test-compile + | + | + | + | + | + | org.jetbrains.kotlin + | kotlin-maven-noarg + | ${'$'}{kotlin.version} + | + | + | + | + | + """.trimMargin() +}