[maven] IDEA-163551 Adds resolve and autocomplete for properties in pom.xml, supported in Maven Model interpolation

Resolving and autocomplete were already implemented before for the most part of such properties. These changes add support for some cases were not considered yet:
- ${maven.home}
- ${maven.version}
- ${maven.build.version}
- ${build.timestamp}

These properties will be resolved to their PsiElement's, just to remove the red highlighting.

More about Maven Model interpolation:
https://maven.apache.org/components/ref/3-LATEST/maven-model-builder/#model-interpolation

GitOrigin-RevId: ae75a11de118b305fc33ee73511fc2f10671ecea
This commit is contained in:
Nikita Biriukov
2024-10-10 13:06:44 +02:00
committed by intellij-monorepo-bot
parent 1e3ca1555f
commit eea037b50b
2 changed files with 22 additions and 17 deletions

View File

@@ -60,6 +60,8 @@ import static icons.OpenapiIcons.RepositoryLibraryLogo;
public class MavenPropertyPsiReference extends MavenPsiReference implements LocalQuickFixProvider {
public static final String TIMESTAMP_PROP = "maven.build.timestamp";
public static final String MULTIPROJECT_DIR_PROP = "maven.multiModuleProjectDirectory";
public static final Set<String> PROPS_RESOLVING_TO_MY_ELEMENT = Set.of(
TIMESTAMP_PROP, "build.timestamp", "maven.home", "maven.version", "maven.build.version");
@Nullable
protected final MavenDomProjectModel myProjectDom;
@@ -153,8 +155,7 @@ public class MavenPropertyPsiReference extends MavenPsiReference implements Loca
return getBaseDir(mavenProject);
}
if (myText.equals(TIMESTAMP_PROP)) {
if (PROPS_RESOLVING_TO_MY_ELEMENT.contains(myText)) {
return myElement;
}
@@ -219,10 +220,6 @@ public class MavenPropertyPsiReference extends MavenPsiReference implements Loca
if (result != null) return result;
}
if ("maven.home".equals(myText)) {
return myElement;
}
if ("java.home".equals(myText)) {
PsiElement element = resolveToCustomSystemProperty("java.home", MavenUtil.getModuleJreHome(myProjectsManager, mavenProject));
if (element != null) {
@@ -408,8 +405,10 @@ public class MavenPropertyPsiReference extends MavenPsiReference implements Loca
if (prefix == null) {
result.add(createLookupElement(baseDir, "project.baseUri", RepositoryLibraryLogo));
result.add(createLookupElement(baseDir, "pom.baseUri", RepositoryLibraryLogo));
result.add(LookupElementBuilder.create(TIMESTAMP_PROP).withIcon(RepositoryLibraryLogo));
result.add(LookupElementBuilder.create(MULTIPROJECT_DIR_PROP).withIcon(RepositoryLibraryLogo));
for (String property : PROPS_RESOLVING_TO_MY_ELEMENT) {
result.add(LookupElementBuilder.create(property).withIcon(RepositoryLibraryLogo));
}
}
processSchema(MavenSchemaProvider.MAVEN_PROJECT_SCHEMA_URL, (property, descriptor) -> {

View File

@@ -11,6 +11,7 @@ import com.intellij.psi.xml.XmlTag
import kotlinx.coroutines.runBlocking
import org.jetbrains.idea.maven.dom.model.MavenDomProfiles
import org.jetbrains.idea.maven.dom.model.MavenDomSettingsModel
import org.jetbrains.idea.maven.dom.references.MavenPropertyPsiReference
import org.jetbrains.idea.maven.model.MavenExplicitProfiles
import org.jetbrains.idea.maven.server.MavenServerManager
import org.jetbrains.idea.maven.utils.MavenUtil
@@ -890,16 +891,17 @@ class MavenPropertyCompletionAndResolutionTest : MavenDomTestCase() {
}
@Test
fun testMavenHome() = runBlocking {
updateProjectPom("""
<groupId>test</groupId>
<artifactId>project</artifactId>
<version>1</version>
<name>${'$'}{<caret>maven.home}</name>
""".trimIndent())
val ref = getReferenceAtCaret(projectPom)!!
// the reference for maven.home property resolves to its PsiElement
assertResolved(projectPom, ref.element)
fun testResolvingPropertiesToThemselves() = runBlocking {
MavenPropertyPsiReference.PROPS_RESOLVING_TO_MY_ELEMENT.forEach { propertyName ->
updateProjectPom("""
<groupId>test</groupId>
<artifactId>project</artifactId>
<version>1</version>
<name>${'$'}{<caret>$propertyName}</name>
""".trimIndent())
val ref = getReferenceAtCaret(projectPom)!!
assertResolved(projectPom, ref.element)
}
}
@Test
@@ -1111,8 +1113,12 @@ class MavenPropertyCompletionAndResolutionTest : MavenDomTestCase() {
assertContain(variants, "artifactId", "project.artifactId", "pom.artifactId")
assertContain(variants, "basedir", "project.basedir", "pom.basedir", "project.baseUri", "pom.basedir")
assertDoNotContain(variants, "baseUri")
assertContain(variants, "build.timestamp")
assertContain(variants, "maven.build.timestamp")
assertContain(variants, "maven.multiModuleProjectDirectory")
assertContain(variants, "maven.home")
assertContain(variants, "maven.version")
assertContain(variants, "maven.build.version")
assertDoNotContain(variants, "project.maven.build.timestamp")
assertContain(variants, "settingsXmlProp")
assertContain(variants, "settings.localRepository")