From fe1653dea954cb83c46eb38fcdfe1c44360bf872 Mon Sep 17 00:00:00 2001 From: Nikita Biriukov Date: Wed, 9 Oct 2024 17:59:19 +0200 Subject: [PATCH] [maven] IDEA-132097 Resolve properties like ${parsedVersion.majorVersion} to a PsiElement of the tag GitOrigin-RevId: 0163710ed249bb92dbebc659e593ab238225881e --- .../references/MavenPropertyPsiReference.java | 34 +++++++++++++++---- ...avenPropertyCompletionAndResolutionTest.kt | 13 ++++--- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java index 43fa60b8324d..96714f12193d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java @@ -273,8 +273,9 @@ public class MavenPropertyPsiReference extends MavenPsiReference implements Loca return resolveSettingsModelProperty(); } - if (couldBeResolvedByBuildHelper(myText)) { - return myElement; + PsiElement resolved = resolveAsParsedVersion(myText, mavenProject); + if (resolved != null) { + return resolved; } return null; @@ -610,17 +611,36 @@ public class MavenPropertyPsiReference extends MavenPsiReference implements Loca } /** - * Some properties could be resolved by "build-helper-maven-plugin" (e.g., `${parsedVersion.majorVersion}` property) + * If "build-helper-maven-plugin" has `parse-version` goal, probably it could resolve properties starting with a defined prefix + * to something related to the version from the `version` tag (e.g., `${parsedVersion.majorVersion}`) * @see mojohaus documentation */ - private boolean couldBeResolvedByBuildHelper(@NotNull String propertyText) { + @Nullable + private PsiElement resolveAsParsedVersion(@NotNull String propertyText, @NotNull MavenProject mavenProject) { + String prefix = getBuildHelperParseablePrefix(); + if (prefix == null || !propertyText.startsWith(prefix + ".")) return null; + + MavenDomProjectModel domProjectModel = MavenDomUtil.getMavenDomProjectModel(myProject, mavenProject.getFile()); + if (domProjectModel == null) { + return myElement; + } + XmlTag versionTag = MavenDomUtil.findTag(domProjectModel, "project.version"); + if (versionTag == null) { + return myElement; + } + else { + return versionTag; + } + } + + private @Nullable String getBuildHelperParseablePrefix() { MavenPlugin buildHelperPlugin = myMavenProject.findPlugin("org.codehaus.mojo", "build-helper-maven-plugin"); - if (buildHelperPlugin == null) return false; + if (buildHelperPlugin == null) return null; Optional execution = buildHelperPlugin.getExecutions().stream() .filter(it -> it.getGoals().contains("parse-version")) .findFirst(); - if (execution.isEmpty()) return false; + if (execution.isEmpty()) return null; String propertyPrefix = "parsedVersion"; // default value Element configuration = execution.get().getConfigurationElement(); @@ -630,6 +650,6 @@ public class MavenPropertyPsiReference extends MavenPsiReference implements Loca propertyPrefix = customPrefix.getText(); } } - return propertyText.startsWith(propertyPrefix + "."); + return propertyPrefix; } } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPropertyCompletionAndResolutionTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPropertyCompletionAndResolutionTest.kt index 50cfdc405bec..b04606515503 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPropertyCompletionAndResolutionTest.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPropertyCompletionAndResolutionTest.kt @@ -6,7 +6,6 @@ import com.intellij.lang.properties.IProperty import com.intellij.maven.testFramework.MavenDomTestCase import com.intellij.openapi.application.readAction import com.intellij.openapi.util.SystemInfo -import com.intellij.openapi.util.registry.Registry import com.intellij.psi.PsiManager import com.intellij.psi.xml.XmlTag import kotlinx.coroutines.runBlocking @@ -926,10 +925,10 @@ class MavenPropertyCompletionAndResolutionTest : MavenDomTestCase() { """.trimIndent()) - val ref = getReferenceAtCaret(projectPom)!! - // reimport to add build-helper-maven-plugin into the MavenProject. The property should be resolved if this plugin exists in pom. + fixture.configureFromExistingVirtualFile(projectPom) + // Resolving this property depends on the presence of the build-helper-maven-plugin in pom. Reimport to add the plugin in MavenProject. runBlocking { importProjectAsync() } - assertResolved(projectPom, ref.element) + assertResolved(projectPom, findTag(projectPom, "project.version")) } @Test @@ -958,10 +957,10 @@ class MavenPropertyCompletionAndResolutionTest : MavenDomTestCase() { """.trimIndent()) - val ref = getReferenceAtCaret(projectPom)!! - // reimport to add build-helper-maven-plugin into the MavenProject. The property should be resolved if this plugin exists in pom. + fixture.configureFromExistingVirtualFile(projectPom) + // Resolving this property depends on the presence of the build-helper-maven-plugin in pom. Reimport to add the plugin in MavenProject. runBlocking { importProjectAsync() } - assertResolved(projectPom, ref.element) + assertResolved(projectPom, findTag(projectPom, "project.version")) } @Test