mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-78960 (Filtered Resources: @ delimeter and custom delimeters are not supported)
This commit is contained in:
+71
@@ -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()]);
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+7
-24
@@ -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()]);
|
||||
|
||||
+26
-3
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user