From dc1919ccee7999167867d5888f8dc3e44fd955cd Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Fri, 13 Jan 2012 20:16:09 +0300 Subject: [PATCH] IDEA-78960 (Filtered Resources: @ delimeter and custom delimeters are not supported) --- ...nFilteredPropertyPsiReferenceProvider.java | 71 +++++++++++++++++++ .../MavenPropertyPsiReferenceContributor.java | 4 +- .../MavenPropertyPsiReferenceProvider.java | 31 ++------ ...PropertiesCompletionAndResolutionTest.java | 29 +++++++- 4 files changed, 106 insertions(+), 29 deletions(-) create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenFilteredPropertyPsiReferenceProvider.java diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenFilteredPropertyPsiReferenceProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenFilteredPropertyPsiReferenceProvider.java new file mode 100644 index 000000000000..72f4282a6ad2 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenFilteredPropertyPsiReferenceProvider.java @@ -0,0 +1,71 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.dom.references; + +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.ElementManipulators; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.psi.PsiReferenceProvider; +import com.intellij.util.ProcessingContext; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.maven.dom.MavenDomUtil; +import org.jetbrains.idea.maven.dom.MavenPropertyResolver; +import org.jetbrains.idea.maven.project.MavenProject; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class MavenFilteredPropertyPsiReferenceProvider extends PsiReferenceProvider { + + private static final Pattern PATTERN = Pattern.compile("\\$\\{([^\\}]+?)\\}|@([^@]+?)@"); + + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { + if (!MavenDomUtil.isFilteredResourceFile(element)) return PsiReference.EMPTY_ARRAY; + + String text = element.getText(); + if (StringUtil.isEmptyOrSpaces(text)) return PsiReference.EMPTY_ARRAY; + + MavenProject mavenProject = MavenDomUtil.findContainingProject(element); + if (mavenProject == null) return PsiReference.EMPTY_ARRAY; + + List result = new ArrayList(); + + Matcher matcher = PATTERN.matcher(text); + while (matcher.find()) { + String propertyName = matcher.group(1); + int from; + if (propertyName == null) { + propertyName = matcher.group(2); + from = matcher.start(2); + } + else { + from = matcher.start(1); + } + + TextRange range = TextRange.from(from, propertyName.length()); + + result.add(new MavenFilteredPropertyPsiReference(mavenProject, element, propertyName, range, MavenPropertyPsiReferenceProvider.SOFT_DEFAULT)); + } + + return result.toArray(new PsiReference[result.size()]); + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReferenceContributor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReferenceContributor.java index 56f722fc3e71..2ce633c361e4 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReferenceContributor.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReferenceContributor.java @@ -27,9 +27,9 @@ public class MavenPropertyPsiReferenceContributor extends PsiReferenceContributo @Override public void registerReferenceProviders(PsiReferenceRegistrar registrar) { ElementPattern pattern = XmlPatterns.xmlTag().withParent(DomPatterns.withDom(DomPatterns.domElement(MavenDomProperties.class))); - registrar.registerReferenceProvider(pattern, new MavenPropertyPsiReferenceProvider(false), PsiReferenceRegistrar.DEFAULT_PRIORITY); + registrar.registerReferenceProvider(pattern, new MavenPropertyPsiReferenceProvider(), PsiReferenceRegistrar.DEFAULT_PRIORITY); registrar.registerReferenceProvider(PlatformPatterns.psiElement(), - new MavenPropertyPsiReferenceProvider(true), + new MavenFilteredPropertyPsiReferenceProvider(), PsiReferenceRegistrar.DEFAULT_PRIORITY); } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReferenceProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReferenceProvider.java index e747d920631b..e9bc5d13ae8f 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReferenceProvider.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReferenceProvider.java @@ -33,29 +33,19 @@ import java.util.regex.Matcher; public class MavenPropertyPsiReferenceProvider extends PsiReferenceProvider { public static final boolean SOFT_DEFAULT = false; - private final boolean myFiltered; - - public MavenPropertyPsiReferenceProvider(boolean filtered) { - myFiltered = filtered; - } @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { - if (myFiltered) { - if (!MavenDomUtil.isFilteredResourceFile(element)) return PsiReference.EMPTY_ARRAY; - return getReferences(element, element.getText(), 0, true, SOFT_DEFAULT); - } return getReferences(element, SOFT_DEFAULT); } public static PsiReference[] getReferences(PsiElement element, boolean isSoft) { - String text = ElementManipulators.getValueText(element); - int textStart = ElementManipulators.getValueTextRange(element).getStartOffset(); - return getReferences(element, text, textStart, false, isSoft); - } + TextRange textRange = ElementManipulators.getValueTextRange(element); + if (textRange.isEmpty()) return PsiReference.EMPTY_ARRAY; + + String text = element.getText(); - private static PsiReference[] getReferences(PsiElement element, String text, int textStart, boolean isFiltered, boolean isSoft) { if (StringUtil.isEmptyOrSpaces(text)) return PsiReference.EMPTY_ARRAY; MavenProject mavenProject = MavenDomUtil.findContainingProject(element); @@ -63,20 +53,13 @@ public class MavenPropertyPsiReferenceProvider extends PsiReferenceProvider { List result = new ArrayList(); - Matcher matcher = MavenPropertyResolver.PATTERN.matcher(text); + Matcher matcher = MavenPropertyResolver.PATTERN.matcher(textRange.substring(text)); while (matcher.find()) { String propertyName = matcher.group(1); - int from = textStart + matcher.start(1); + int from = textRange.getStartOffset() + matcher.start(1); TextRange range = TextRange.from(from, propertyName.length()); - MavenPropertyPsiReference ref; - if (isFiltered) { - ref = new MavenFilteredPropertyPsiReference(mavenProject, element, propertyName, range, isSoft); - } - else { - ref = new MavenPropertyPsiReference(mavenProject, element, propertyName, range, isSoft); - } - result.add(ref); + result.add(new MavenPropertyPsiReference(mavenProject, element, propertyName, range, isSoft)); } return result.toArray(new PsiReference[result.size()]); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenFilteredPropertiesCompletionAndResolutionTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenFilteredPropertiesCompletionAndResolutionTest.java index c013bf6ef819..a369a26811fa 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenFilteredPropertiesCompletionAndResolutionTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenFilteredPropertiesCompletionAndResolutionTest.java @@ -47,6 +47,28 @@ public class MavenFilteredPropertiesCompletionAndResolutionTest extends MavenDom assertResolved(f, findTag("project.version")); } + public void testBasicAt() throws Exception { + createProjectSubDir("res"); + + importProject("test" + + "project" + + "1" + + + "" + + " " + + " " + + " res" + + " true" + + " " + + " " + + ""); + + VirtualFile f = createProjectSubFile("res/foo.properties", + "foo=abc@project.version@abc"); + + assertResolved(f, findTag("project.version")); + } + public void testCorrectlyCalculatingBaseDir() throws Exception { createProjectSubDir("res"); @@ -136,7 +158,7 @@ public class MavenFilteredPropertiesCompletionAndResolutionTest extends MavenDom importProjectWithProfiles("one"); VirtualFile f = createProjectSubFile("res/foo.properties", - "foo=${profileProp}"); + "foo=@profileProp@"); assertResolved(f, findTag(profiles, "profilesXml.profiles[0].properties.profileProp", MavenDomProfilesModel.class)); } @@ -258,10 +280,11 @@ public class MavenFilteredPropertiesCompletionAndResolutionTest extends MavenDom ""); VirtualFile f = createProjectSubFile("res/foo.properties", - "foo=${xxx}"); + "foo=${xxx}\n" + + "foo2=@xxx@"); VirtualFile filter = createProjectSubFile("filters/filter.properties", "xxx=1"); - assertSearchResultsInclude(filter, MavenDomUtil.findPropertyValue(myProject, f, "foo")); + assertSearchResultsInclude(filter, MavenDomUtil.findPropertyValue(myProject, f, "foo"), MavenDomUtil.findPropertyValue(myProject, f, "foo2")); } public void testCompletionAfterOpenBrace() throws Exception {