Yesterday I said that macrodef attributes should be implemented as
properties and not as textual substitution.

On overnight reflection, I have changed by mind.

MacroDef has been using textual substitution in the ant beta
builds without much problems (*.. well not quite see below).
The only issue is the notation used is the same as for properties.

The proposed new notation is @{x} where x is the attribute.

I have implemented the new notation and added the following:

 * the escape sequence @@{x} is used to allow @{x} to be
   placed in the text without substitution of x. - this
   corresponds to the $${x} escape sequence for properties.
 * the macro replacement is now done on the default values for
   the attributes - this allows Jan's use case to work:

  <target name="jan">
    <macrodef name="dep">
      <attribute name="root"/>
      <attribute name="file" default="@{root}.dep"/>
      <sequential>
        <script language="javascript"> <![CDATA[
            // attribute expansion from macrodef (script canĀ“t reach the
            //   values)
            root     = "@{root}";
            file     = "@{file}";
            importClass(java.lang.System);
            System.out.println(
               "root is " + root + " and file is " + file);
                                         ]]>
        </script>
      </sequential>
    </macrodef>
    
    <dep root="foo"/>
  </target>

This prints out
jan:
   [script] root is foo and file is foo.dep

The order of the attributes is important - 
    <macrodef name="dep">
      <attribute name="file" default="@{root}.dep"/>
      <attribute name="root"/>
will set file to @{root}.dep.


A problem encountered in using macrodef for any not trivial macros
is the need to isolate the use of properties.
For this I have proposed using the local property patch, but if
macrodef properties are to be implemented as textual substitution
and not as local properties, the two issues can be separated.



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to