diff --git a/docs/manual/CoreTasks/macrodef.html b/docs/manual/CoreTasks/macrodef.html index 0fb7e384b..38820023e 100644 --- a/docs/manual/CoreTasks/macrodef.html +++ b/docs/manual/CoreTasks/macrodef.html @@ -43,6 +43,16 @@ No + + textname + + The textname attribute value becomes a macrodef + attribute that + gets set to the value of the text contents of the macro. + since ant 1.6.1 + + No +

Parameters specified as nested elements

attribute

@@ -88,6 +98,7 @@ description This contains a description of the attribute. + since ant 1.6.1 No @@ -127,6 +138,7 @@ This contains a description informing the user what the contents of the element are expected to be. + since ant 1.6.1 No @@ -196,6 +208,21 @@ <linker refid="linker-libs"/> </cc-elements> </call-cc> + + +

+ The following shows the use of the textname attribute. +

+
+
+<macrodef name="echotest" textname="text">
+   <sequential>
+      <echo>@{text}</echo>
+   </sequential>
+</macrodef>
+<echotest>
+   Hello world
+</echotest>
 

diff --git a/src/etc/testcases/taskdefs/macrodef.xml b/src/etc/testcases/taskdefs/macrodef.xml index 671bdad35..01dcd12b5 100644 --- a/src/etc/testcases/taskdefs/macrodef.xml +++ b/src/etc/testcases/taskdefs/macrodef.xml @@ -101,4 +101,24 @@ + + + + + @{text} + + + + Hello world + + + + + + + + @{text} + + + diff --git a/src/main/org/apache/tools/ant/taskdefs/MacroDef.java b/src/main/org/apache/tools/ant/taskdefs/MacroDef.java index 69d9353b8..80c72a1ed 100644 --- a/src/main/org/apache/tools/ant/taskdefs/MacroDef.java +++ b/src/main/org/apache/tools/ant/taskdefs/MacroDef.java @@ -81,6 +81,7 @@ public class MacroDef extends AntlibDefinition { private String name; private List attributes = new ArrayList(); private Map elements = new HashMap(); + private String textName = null; /** * Name of the definition @@ -90,6 +91,25 @@ public class MacroDef extends AntlibDefinition { this.name = name; } + /** + * Name of the text attribute. + * @param textName the name of the attribute to use for the + * text content of the macro. + * @since ant 1.6.1 + */ + public void setTextName(String textName) { + this.textName = textName; + } + + /** + * @return the name of the text content attribute + * @since ant 1.6.1 + */ + + public String getTextName() { + return textName; + } + /** * This is the sequential nested element of the macrodef. * @@ -222,6 +242,11 @@ public class MacroDef extends AntlibDefinition { throw new BuildException( "the attribute nested element needed a \"name\" attribute"); } + if (attribute.getName().equals(textName)) { + throw new BuildException( + "the attribute name \"" + attribute.getName() + + "\" has already been used by the textname attribute"); + } for (int i = 0; i < attributes.size(); ++i) { if (((Attribute) attributes.get(i)).getName().equals( attribute.getName())) { @@ -324,14 +349,16 @@ public class MacroDef extends AntlibDefinition { /** * @param desc Description of the element. + * @since ant 1.6.1 */ public void setDescription(String desc) { description = desc; } /** - * @return the description of the element, or null if + * @return the description of the element, or null if * no description is available. + * @since ant 1.6.1 */ public String getDescription() { return description; @@ -383,7 +410,7 @@ public class MacroDef extends AntlibDefinition { public static class TemplateElement { private String name; private boolean optional = false; - private String description; + private String description; /** * The name of the element. @@ -424,14 +451,16 @@ public class MacroDef extends AntlibDefinition { /** * @param desc Description of the element. + * @since ant 1.6.1 */ public void setDescription(String desc) { description = desc; } /** - * @return the description of the element, or null if + * @return the description of the element, or null if * no description is available. + * @since ant 1.6.1 */ public String getDescription() { return description; @@ -490,6 +519,15 @@ public class MacroDef extends AntlibDefinition { if (!name.equals(other.name)) { return false; } + if (textName == null) { + if (other.textName != null) { + return false; + } + } else { + if (!textName.equals(other.textName)) { + return false; + } + } if (getURI() == null || getURI().equals("") || getURI().equals(ProjectHelper.ANT_CORE_URI)) { if (!(other.getURI() == null || other.getURI().equals("") diff --git a/src/main/org/apache/tools/ant/taskdefs/MacroInstance.java b/src/main/org/apache/tools/ant/taskdefs/MacroInstance.java index b37762380..d02dcff02 100644 --- a/src/main/org/apache/tools/ant/taskdefs/MacroInstance.java +++ b/src/main/org/apache/tools/ant/taskdefs/MacroInstance.java @@ -88,6 +88,7 @@ public class MacroInstance extends Task implements DynamicConfigurator { private Map nsElements = null; private Map presentElements = new HashMap(); private Hashtable localProperties = new Hashtable(); + private String text = ""; /** * Called from MacroDef.MyAntTypeDefinition#create() @@ -246,6 +247,14 @@ public class MacroInstance extends Task implements DynamicConfigurator { return ret.toString(); } + /** + * Set the text contents for the macro. + * @param text the text to be added to the macro. + */ + public void addText(String text) { + this.text = text; + } + private UnknownElement copy(UnknownElement ue) { UnknownElement ret = new UnknownElement(ue.getTag()); ret.setNamespace(ue.getNamespace()); @@ -331,6 +340,10 @@ public class MacroInstance extends Task implements DynamicConfigurator { if (copyKeys.contains("id")) { copyKeys.remove("id"); } + if (macroDef.getTextName() != null) { + localProperties.put(macroDef.getTextName(), text); + } + if (copyKeys.size() != 0) { throw new BuildException( "Unknown attribute" + (copyKeys.size() > 1 ? "s " : " ") diff --git a/src/testcases/org/apache/tools/ant/taskdefs/MacroDefTest.java b/src/testcases/org/apache/tools/ant/taskdefs/MacroDefTest.java index edebf6c9e..a7290704e 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/MacroDefTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/MacroDefTest.java @@ -115,5 +115,16 @@ public class MacroDefTest extends BuildFileTest { "ignore-element-case", "nested elementnested element"); } + + public void testTextName() { + expectLogContaining( + "textname", "Hello world"); + } + + public void testDuplicateTextName() { + expectBuildException( + "duplicatetextname", + "the attribute text has already been specified"); + } }