From 1a5bf9a27b19630c1e033a0d867cb45ee3bfb367 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Tue, 30 Aug 2011 20:13:15 +0200 Subject: [PATCH] correctly determine antfile path for the 'ant' task (IDEA-72209) --- .../com/intellij/lang/ant/dom/AntDomAnt.java | 36 +++++++++++++++++-- .../intellij/lang/ant/dom/AntDomProject.java | 19 ++++++++++ .../lang/ant/dom/AntPathConverter.java | 14 ++++++-- .../AntPathRelativeToAntFileConverter.java | 3 +- 4 files changed, 66 insertions(+), 6 deletions(-) diff --git a/plugins/ant/src/com/intellij/lang/ant/dom/AntDomAnt.java b/plugins/ant/src/com/intellij/lang/ant/dom/AntDomAnt.java index e21d674af30b..eac6e0b77fba 100644 --- a/plugins/ant/src/com/intellij/lang/ant/dom/AntDomAnt.java +++ b/plugins/ant/src/com/intellij/lang/ant/dom/AntDomAnt.java @@ -15,9 +15,11 @@ */ package com.intellij.lang.ant.dom; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFileSystemItem; import com.intellij.util.xml.Attribute; import com.intellij.util.xml.Convert; +import com.intellij.util.xml.ConvertContext; import com.intellij.util.xml.GenericAttributeValue; /** @@ -25,9 +27,10 @@ import com.intellij.util.xml.GenericAttributeValue; * Date: Aug 3, 2010 */ public abstract class AntDomAnt extends AntDomElement { - + public static final String DEFAULT_ANTFILE_NAME = "build.xml"; + @Attribute("antfile") - @Convert(value = AntPathValidatingConverter.class) + @Convert(value = AntFilePathConverter.class) public abstract GenericAttributeValue getAntFilePath(); @Attribute("dir") @@ -53,4 +56,33 @@ public abstract class AntDomAnt extends AntDomElement { @Attribute("usenativebasedir") @Convert(value = AntBooleanConverterDefaultFalse.class) public abstract GenericAttributeValue isUseNativeBasedir(); + + public static class AntFilePathConverter extends AntPathConverter { + public AntFilePathConverter() { + super(true); + } + + protected String getPathResolveRoot(ConvertContext context, AntDomProject antProject) { + final AntDomAnt antElement = context.getInvocationElement().getParentOfType(AntDomAnt.class, false); + if (antElement != null) { + PsiFileSystemItem dir = antElement.getAntFileDir().getValue(); + if (dir == null) { + if (antElement.isInheritAllProperties().getValue()) { + dir = antProject.getProjectBasedir(); + } + } + if (dir != null) { + final VirtualFile vFile = dir.getVirtualFile(); + if (vFile != null) { + return vFile.getPath(); + } + } + } + return super.getPathResolveRoot(context, antProject); + } + + protected String getAttributeDefaultValue(ConvertContext context, GenericAttributeValue attribValue) { + return DEFAULT_ANTFILE_NAME; + } + } } diff --git a/plugins/ant/src/com/intellij/lang/ant/dom/AntDomProject.java b/plugins/ant/src/com/intellij/lang/ant/dom/AntDomProject.java index 5f989530c666..ea74435e3085 100644 --- a/plugins/ant/src/com/intellij/lang/ant/dom/AntDomProject.java +++ b/plugins/ant/src/com/intellij/lang/ant/dom/AntDomProject.java @@ -32,6 +32,7 @@ import com.intellij.pom.references.PomService; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileSystemItem; +import com.intellij.psi.PsiManager; import com.intellij.psi.xml.XmlElement; import com.intellij.psi.xml.XmlTag; import com.intellij.util.containers.HashMap; @@ -67,6 +68,24 @@ public abstract class AntDomProject extends AntDomNamedElement implements Proper @Convert(value = AntPathConverter.class) public abstract GenericAttributeValue getBasedir(); + @Nullable + public final PsiFileSystemItem getProjectBasedir() { + final PsiFileSystemItem basedir = getBasedir().getValue(); + if (basedir != null) { + return basedir; + } + final XmlTag tag = getXmlTag(); + final VirtualFile containingFile = tag.getContainingFile().getOriginalFile().getVirtualFile(); + if (containingFile == null) { + return null; + } + final VirtualFile parent = containingFile.getParent(); + if (parent == null) { + return null; + } + return PsiManager.getInstance(tag.getProject()).findDirectory(parent); + } + @Nullable public final String getProjectBasedirPath() { final String basedir = getBasedir().getStringValue(); diff --git a/plugins/ant/src/com/intellij/lang/ant/dom/AntPathConverter.java b/plugins/ant/src/com/intellij/lang/ant/dom/AntPathConverter.java index cc05b2122900..e19291b15a7a 100644 --- a/plugins/ant/src/com/intellij/lang/ant/dom/AntPathConverter.java +++ b/plugins/ant/src/com/intellij/lang/ant/dom/AntPathConverter.java @@ -51,7 +51,10 @@ public class AntPathConverter extends Converter implements Cu if (attribValue == null) { return null; } - final String path = attribValue.getStringValue(); + String path = attribValue.getStringValue(); + if (path == null) { + path = getAttributeDefaultValue(context, attribValue); + } if (path == null) { return null; } @@ -61,7 +64,7 @@ public class AntPathConverter extends Converter implements Cu if (antProject == null) { return null; } - file = new File(getPathResolveRoot(antProject), path); + file = new File(getPathResolveRoot(context, antProject), path); } VirtualFile vFile = LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(file.getAbsolutePath())); if (vFile == null) { @@ -81,10 +84,15 @@ public class AntPathConverter extends Converter implements Cu } @Nullable - protected String getPathResolveRoot(AntDomProject antProject) { + protected String getPathResolveRoot(ConvertContext context, AntDomProject antProject) { return antProject.getProjectBasedirPath(); } + @Nullable + protected String getAttributeDefaultValue(ConvertContext context, GenericAttributeValue attribValue) { + return null; + } + @Override public String toString(@Nullable PsiFileSystemItem file, ConvertContext context) { final GenericAttributeValue attribValue = context.getInvocationElement().getParentOfType(GenericAttributeValue.class, false); diff --git a/plugins/ant/src/com/intellij/lang/ant/dom/AntPathRelativeToAntFileConverter.java b/plugins/ant/src/com/intellij/lang/ant/dom/AntPathRelativeToAntFileConverter.java index 6f35be2843b7..549a2823e56f 100644 --- a/plugins/ant/src/com/intellij/lang/ant/dom/AntPathRelativeToAntFileConverter.java +++ b/plugins/ant/src/com/intellij/lang/ant/dom/AntPathRelativeToAntFileConverter.java @@ -15,6 +15,7 @@ */ package com.intellij.lang.ant.dom; +import com.intellij.util.xml.ConvertContext; import com.intellij.util.xml.GenericAttributeValue; import org.jetbrains.annotations.Nullable; @@ -28,7 +29,7 @@ public class AntPathRelativeToAntFileConverter extends AntPathConverter { } @Nullable - protected String getPathResolveRoot(AntDomProject antProject) { + protected String getPathResolveRoot(ConvertContext context, AntDomProject antProject) { return antProject.getContainingFileDir(); } }