IDEA-53817 (Environment variable is red (not set) despite the fact it is used in profile <activation>.)

This commit is contained in:
Sergey Evdokimov
2012-04-05 12:54:27 +04:00
parent 4f7c4ea8c0
commit a671fdf9eb
2 changed files with 34 additions and 3 deletions
@@ -23,6 +23,7 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.Navigatable;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlDocument;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
@@ -74,7 +75,12 @@ public class MavenPropertyPsiReference extends MavenPsiReference {
@Nullable
public PsiElement resolve() {
PsiElement result = doResolve();
if (result == null) return result;
if (result == null) {
if (MavenDomUtil.isMavenFile(getElement())) {
result = tryResolveToActivationSection();
if (result == null) return null;
}
}
if (result instanceof XmlTag) {
XmlTagChild[] children = ((XmlTag)result).getValue().getChildren();
@@ -85,6 +91,30 @@ public class MavenPropertyPsiReference extends MavenPsiReference {
return result;
}
private PsiElement tryResolveToActivationSection() {
XmlTag xmlTag = PsiTreeUtil.getParentOfType(getElement(), XmlTag.class);
while (xmlTag != null) {
if (xmlTag.getName().equals("profile")) {
XmlTag activation = xmlTag.findFirstSubTag("activation");
if (activation != null) {
for (XmlTag propertyTag : activation.findSubTags("property")) {
XmlTag nameTag = propertyTag.findFirstSubTag("name");
if (nameTag != null) {
if (nameTag.getValue().getTrimmedText().equals(myText)) {
return nameTag;
}
}
}
}
break;
}
xmlTag = xmlTag.getParentTag();
}
return null;
}
// See org.apache.maven.project.interpolation.AbstractStringBasedModelInterpolator.createValueSources()
@Nullable
protected PsiElement doResolve() {
@@ -49,8 +49,9 @@ class MavenPropertyInActivationSectionTest extends MavenDomTestCase {
</properties>
""");
assert getReference(myProjectPom, "env.GLASSFISH_HOME_123", 1).isSoft()
assert !getReference(myProjectPom, "env.GLASSFISH_HOME_123", 2).isSoft()
assert getReference(myProjectPom, "env.GLASSFISH_HOME_123", 1).resolve() != null
assert getReference(myProjectPom, "env.GLASSFISH_HOME_123", 2).resolve() == null
}
}