IDEA-78960 (Filtered Resources: @ delimeter and custom delimeters are not supported)

This commit is contained in:
Sergey Evdokimov
2012-01-13 20:16:31 +03:00
parent a7eb73a2b8
commit dc1919ccee
4 changed files with 106 additions and 29 deletions
@@ -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<PsiReference> result = new ArrayList<PsiReference>();
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()]);
}
}
@@ -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);
}
}
@@ -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<PsiReference> result = new ArrayList<PsiReference>();
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()]);
@@ -47,6 +47,28 @@ public class MavenFilteredPropertiesCompletionAndResolutionTest extends MavenDom
assertResolved(f, findTag("project.version"));
}
public void testBasicAt() throws Exception {
createProjectSubDir("res");
importProject("<groupId>test</groupId>" +
"<artifactId>project</artifactId>" +
"<version>1</version>" +
"<build>" +
" <resources>" +
" <resource>" +
" <directory>res</directory>" +
" <filtering>true</filtering>" +
" </resource>" +
" </resources>" +
"</build>");
VirtualFile f = createProjectSubFile("res/foo.properties",
"foo=abc@project<caret>.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<caret>}");
"foo=@profileProp<caret>@");
assertResolved(f, findTag(profiles, "profilesXml.profiles[0].properties.profileProp", MavenDomProfilesModel.class));
}
@@ -258,10 +280,11 @@ public class MavenFilteredPropertiesCompletionAndResolutionTest extends MavenDom
"</build>");
VirtualFile f = createProjectSubFile("res/foo.properties",
"foo=${xxx}");
"foo=${xxx}\n" +
"foo2=@xxx@");
VirtualFile filter = createProjectSubFile("filters/filter.properties", "xx<caret>x=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 {