stevel      2002/10/07 22:53:44

  Modified:    src/main/org/apache/tools/ant/taskdefs/optional/dotnet
                        CSharp.java
  Added:       src/main/org/apache/tools/ant/taskdefs/optional/dotnet
                        DotnetCompile.java VisualBasicCompile.java
  Log:
  Refactoring and extension of the .net compiler tasks
  
  This stuff is unfinished. The tests are passing, but the new stuff is not 
tested yet and I want to do references better. But I wanted to put this in so 
Brian Felden and others can play with it,
  
  Revision  Changes    Path
  1.28      +96 -777   
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/dotnet/CSharp.java
  
  Index: CSharp.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/dotnet/CSharp.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- CSharp.java       23 Jul 2002 07:54:52 -0000      1.27
  +++ CSharp.java       8 Oct 2002 05:53:43 -0000       1.28
  @@ -69,10 +69,12 @@
   // ====================================================================
   
   import java.io.File;
  +import java.util.Vector;
  +import java.util.Enumeration;
  +
   import org.apache.tools.ant.BuildException;
   import org.apache.tools.ant.DirectoryScanner;
   import org.apache.tools.ant.Project;
  -import org.apache.tools.ant.taskdefs.MatchingTask;
   import org.apache.tools.ant.types.Path;
   
   // ====================================================================
  @@ -153,45 +155,19 @@
    *        </table>
    *
    *
  - [EMAIL PROTECTED]      Steve Loughran [EMAIL PROTECTED]
  - [EMAIL PROTECTED]     0.5
  - [EMAIL PROTECTED]    name="csc" category="dotnet"
  + * @author      Steve Loughran [EMAIL PROTECTED]
  + * @version     0.5
  + * @ant.task    name="csc" category="dotnet"
    * @since Ant 1.3
    */
   
  -public class CSharp
  -         extends MatchingTask {
  -
  -    /**
  -     *  Name of the executable. The .exe suffix is deliberately not included 
in
  -     *  anticipation of the unix version
  -     */
  -    private static final String csc_exe_name = "csc";
  -
  -    /**
  -     *  what is the file extension we search on?
  -     */
  -    private static final String csc_file_ext = "cs";
  +public class CSharp extends DotnetCompile {
   
       /**
  -     *  derive the search pattern from the extension
  +     *  defines list: RELEASE;WIN32;NO_SANITY_CHECKS;;SOMETHING_ELSE'
        */
  -    private static final String csc_file_pattern = "**/*." + csc_file_ext;
  -
  -    /**
  -     *  list of reference classes. (pretty much a classpath equivalent)
  -     */
  -    private String references;
  +    String definitions;
   
  -    /**
  -     *  flag to enable automatic reference inclusion
  -     */
  -    private boolean includeDefaultReferences;
  -
  -    /**
  -     *  incremental build flag
  -     */
  -    private boolean incremental;
   
       /**
        *  output XML documentation flag
  @@ -199,101 +175,19 @@
       private File docFile;
   
       /**
  -     *  icon for incorporation into apps
  -     */
  -    private File win32icon;
  -
  -    /**
  -     *  icon for incorporation into apps
  -     */
  -    private File win32res;
  -
  -    /**
  -     * A flag that tells the compiler not to read in the compiler 
  -     * settings files 'csc.rsp' in its bin directory and then the local 
directory
  -     */
  -    private boolean noconfig = false;
  -
  -    /**
  -     *  use full paths to things
  -     */
  -    private boolean fullpaths = false;
  -
  -    /**
  -     *  output file. If not supplied this is derived from the source file
  -     */
  -    private File outputFile;
  -
  -    /**
  -     *  flag to control action on execution trouble
  -     */
  -    private boolean failOnError;
  -
  -    /**
  -     *  using the path approach didnt work as it could not handle the 
implicit
  -     *  execution path. Perhaps that could be extracted from the runtime and
  -     *  then the path approach would be viable
  -     */
  -    private Path referenceFiles;
  -
  -    /**
  -     *  optimise flag
  -     */
  -    private boolean optimize;
  -
  -    /**
        *  file alignment; 0 means let the compiler decide
        */
       private int fileAlign = 0;
   
       /**
  -     *  Fix C# reference inclusion. C# is really dumb in how it handles
  -     *  inclusion. You have to list every 'assembly' -read DLL that is 
imported.
  -     *  So already you are making a platform assumption -shared libraries 
have a
  -     *  .dll;"+ extension and the poor developer has to know every library 
which
  -     *  is included why the compiler cant find classes on the path or in a
  -     *  directory, is a mystery. To reduce the need to be explicit, here is a
  -     *  long list of the core libraries used in Beta-1 of .NET ommitting the
  -     *  blatantly non portable (MS.win32.interop) and the .designer 
libraries.
  -     *  (ripping out Com was tempting) Casing is chosen to match that of the
  -     *  file system <i>exactly</i> so may work on a unix box too. there is no
  -     *  need to reference mscorlib.dll, cos it is always there
  -     */
  -
  -    protected static final String DEFAULT_REFERENCE_LIST =
  -            "Accessibility.dll;" +
  -            "cscompmgd.dll;" +
  -            "CustomMarshalers.dll;" +
  -            "Mscorcfg.dll;" +
  -            "System.Configuration.Install.dll;" +
  -            "System.Data.dll;" +
  -            "System.Design.dll;" +
  -            "System.DirectoryServices.dll;" +
  -            "System.EnterpriseServices.dll;" +
  -            "System.dll;" +
  -            "System.Drawing.Design.dll;" +
  -            "System.Drawing.dll;" +
  -            "System.Management.dll;" +
  -            "System.Messaging.dll;" +
  -            "System.Runtime.Remoting.dll;" +
  -            "System.Runtime.Serialization.Formatters.Soap.dll;" +
  -            "System.Security.dll;" +
  -            "System.ServiceProcess.dll;" +
  -            "System.Web.dll;" +
  -            "System.Web.RegularExpressions.dll;" +
  -            "System.Web.Services.dll;" +
  -            "System.Windows.Forms.dll;" +
  -            "System.XML.dll;";
  -
  -    /**
  -     *  debug flag. Controls generation of debug information.
  +     *  use full paths to things
        */
  -    protected boolean debug;
  +    private boolean fullpaths = false;
   
       /**
  -     *  warning level: 0-4, with 4 being most verbose
  +     *  incremental build flag
        */
  -    private int warnLevel;
  +    private boolean incremental;
   
       /**
        *  enable unsafe code flag. Clearly set to false by default
  @@ -301,43 +195,10 @@
       protected boolean unsafe;
   
       /**
  -     *  main class (or null for automatic choice)
  -     */
  -    protected String mainClass;
  -
  -    /**
  -     *  any extra command options?
  -     */
  -    protected String extraOptions;
  -
  -    /**
  -     *  source directory upon which the search pattern is applied
  -     */
  -    private File srcDir;
  -
  -    /**
  -     *  type of target. Should be one of exe|library|module|winexe|(null)
  -     *  default is exe; the actual value (if not null) is fed to the command
  -     *  line. <br>
  -     *  See /target
  -     */
  -    protected String targetType;
  -
  -    /**
  -     *  utf out flag
  -     */
  -
  -    protected boolean utf8output = false;
  -
  -    /**
  -     *  defines list something like 
'RELEASE;WIN32;NO_SANITY_CHECKS;;SOMETHING_ELSE'
  -     */
  -    String definitions;
  -
  -    /**
  -     *  list of extra modules to refer to
  +     * A flag that tells the compiler not to read in the compiler
  +     * settings files 'csc.rsp' in its bin directory and then the local 
directory
        */
  -    String additionalModules;
  +    private boolean noconfig = false;
   
   
       /**
  @@ -345,164 +206,98 @@
        */
   
       public CSharp() {
  -        Clear();
  -        setIncludes(csc_file_pattern);
       }
   
  -
       /**
  -     * Semicolon separated list of DLLs to refer to.
  -     *
  -     [EMAIL PROTECTED]  s  The new References value
  +     * full cleanup
        */
  -    public void setReferences(String s) {
  -        references = s;
  -    }
  -
  +    public void clear() {
  +        super.clear();
  +        docFile = null;
  +        fileAlign = 0;
  +        fullpaths = true;
  +        incremental = false;
  +        unsafe = false;
  +        noconfig = false;
  +        definitions = null;
   
  -    /**
  -     *  get the reference string or null for no argument needed
  -     *
  -     [EMAIL PROTECTED]    The References Parameter to CSC
  -     */
  -    protected String getReferencesParameter() {
  -        //bail on no references
  -        if (notEmpty(references)) {
  -            return "/reference:" + references;
  -        } else {
  -            return null;
  -        }
       }
   
  -    /**
  -     * Path of references to include.
  -     * Wildcards should work.
  -     *
  -     [EMAIL PROTECTED]  path  another path to append
  -     */
  -    public void setReferenceFiles(Path path) {
  -        //demand create pathlist
  -        if (referenceFiles == null) {
  -            referenceFiles = new Path(this.getProject());
  -        }
  -        referenceFiles.append(path);
  -    }
   
   
       /**
  -     *  turn the path list into a list of files and a /references argument
  +     *  file for generated XML documentation
        *
  -     [EMAIL PROTECTED]    null or a string of references.
  +     [EMAIL PROTECTED]  f  output file
        */
  -    protected String getReferenceFilesParameter() {
  -        //bail on no references
  -        if (references == null) {
  -            return null;
  -        }
  -        //iterate through the ref list & generate an entry for each
  -        //or just rely on the fact that the toString operator does this, but
  -        //noting that the separator is ';' on windows, ':' on unix
  -        String refpath = references.toString();
  -
  -        //bail on no references listed
  -        if (refpath.length() == 0) {
  -            return null;
  -        }
  -
  -        StringBuffer s = new StringBuffer("/reference:");
  -        s.append(refpath);
  -        return new String(s);
  +    public void setDocFile(File f) {
  +        docFile = f;
       }
   
   
       /**
  -     *  get default reference list
  +     *  get the argument or null for no argument needed
        *
  -     [EMAIL PROTECTED]    null or a string of references.
  +     [EMAIL PROTECTED]    The DocFile Parameter to CSC
        */
  -    protected String getDefaultReferenceParameter() {
  -        if (includeDefaultReferences) {
  -            StringBuffer s = new StringBuffer("/reference:");
  -            s.append(DEFAULT_REFERENCE_LIST);
  -            return new String(s);
  +    protected String getDocFileParameter() {
  +        if (docFile != null) {
  +            return "/doc:" + docFile.toString();
           } else {
               return null;
           }
       }
   
  -
  -    /**
  -     * If true, automatically includes the common assemblies
  -     * in dotnet, and tells the compiler to link in mscore.dll.
  -     *
  -     *  set the automatic reference inclusion flag on or off this flag 
controls
  -     *  the string of references and the /nostdlib option in CSC
  -     *
  -     [EMAIL PROTECTED]  f  on/off flag
  -     */
  -    public void setIncludeDefaultReferences(boolean f) {
  -        includeDefaultReferences = f;
  -    }
  -
  -
       /**
  -     *  query automatic reference inclusion flag
  -     *
  -     [EMAIL PROTECTED]    true if flag is turned on
  -     */
  -    public boolean getIncludeDefaultReferences() {
  -        return includeDefaultReferences;
  -    }
  -
  -
  -    /**
  -     *  get the include default references flag or null for no argument 
needed
  -     *
  -     [EMAIL PROTECTED]    The Parameter to CSC
  +     * Set the file alignment.
  +     * Valid values are 0,512, 1024, 2048, 4096, 8192,
  +     * and 16384, 0 means 'leave to the compiler'
        */
  -    protected String getIncludeDefaultReferencesParameter() {
  -        return "/nostdlib" + (includeDefaultReferences ? "-" : "+");
  +    public void setFileAlign(int fileAlign) {
  +        this.fileAlign = fileAlign;
       }
   
  -
  -
       /**
  -     * If true, enables optimization flag.
  +     *  get the argument or null for no argument needed
        *
  -     [EMAIL PROTECTED]  f  on/off flag
  +     [EMAIL PROTECTED]    The OutputFile Parameter to CSC
        */
  -    public void setOptimize(boolean f) {
  -        optimize = f;
  +    protected String getFileAlignParameter() {
  +        if (fileAlign != 0) {
  +            return "/filealign:" + fileAlign;
  +        } else {
  +            return null;
  +        }
       }
   
   
       /**
  -     *  query the optimise flag
  +     * If true, print the full path of files on errors.
        *
  -     [EMAIL PROTECTED]    true if optimise is turned on
  +     [EMAIL PROTECTED]  enabled  The new fullPaths value
        */
  -    public boolean getOptimize() {
  -        return optimize;
  +    public void setFullPaths(boolean enabled) {
  +        fullpaths = enabled;
       }
   
   
       /**
  -     *  get the optimise flag or null for no argument needed
  +     *  Gets the fullPathsParameter attribute of the CSharp object
        *
  -     [EMAIL PROTECTED]    The Optimize Parameter to CSC
  +     [EMAIL PROTECTED]    The fullPathsParameter value or null if unset
        */
  -    protected String getOptimizeParameter() {
  -        return "/optimize" + (optimize ? "+" : "-");
  +    protected String getFullPathsParameter() {
  +        return fullpaths ? "/fullpaths" : null;
       }
   
   
       /**
        *  set the incremental compilation flag on or off.
        *
  -     [EMAIL PROTECTED]  f  on/off flag
  +     [EMAIL PROTECTED]  incremental  on/off flag
        */
  -    public void setIncremental(boolean f) {
  -        incremental = f;
  +    public void setIncremental(boolean incremental) {
  +        this.incremental = incremental;
       }
   
   
  @@ -525,91 +320,13 @@
           return "/incremental" + (incremental ? "+" : "-");
       }
   
  -
  -    /**
  -     *  set the debug flag on or off.
  -     *
  -     [EMAIL PROTECTED]  f  on/off flag
  -     */
  -    public void setDebug(boolean f) {
  -        debug = f;
  -    }
  -
  -
  -    /**
  -     *  query the debug flag
  -     *
  -     [EMAIL PROTECTED]    true if debug is turned on
  -     */
  -    public boolean getDebug() {
  -        return debug;
  -    }
  -
  -
  -    /**
  -     *  get the debug switch argument
  -     *
  -     [EMAIL PROTECTED]    The Debug Parameter to CSC
  -     */
  -    protected String getDebugParameter() {
  -        return "/debug" + (debug ? "+" : "-");
  -    }
  -
  -
  -
  -    /**
  -     *  file for generated XML documentation
  -     *
  -     [EMAIL PROTECTED]  f  output file
  -     */
  -    public void setDocFile(File f) {
  -        docFile = f;
  -    }
  -
  -
       /**
  -     *  get the argument or null for no argument needed
  +     *  The output file. This is identical to the destFile attribute.
        *
  -     [EMAIL PROTECTED]    The DocFile Parameter to CSC
  -     */
  -    protected String getDocFileParameter() {
  -        if (docFile != null) {
  -            return "/doc:" + docFile.toString();
  -        } else {
  -            return null;
  -        }
  -    }
  -
  -
  -    /**
  -     * Level of warning currently between 1 and 4
  -     * with 4 being the strictest.
  -     *
  -     [EMAIL PROTECTED]  warnLevel  warn level -see .net docs for valid range 
(probably
  -     *      0-4)
  -     */
  -    public void setWarnLevel(int warnLevel) {
  -        this.warnLevel = warnLevel;
  -    }
  -
  -
  -    /**
  -     *  query warn level
  -     *
  -     [EMAIL PROTECTED]    current value
  -     */
  -    public int getWarnLevel() {
  -        return warnLevel;
  -    }
  -
  -
  -    /**
  -     *  get the warn level switch
  -     *
  -     [EMAIL PROTECTED]    The WarnLevel Parameter to CSC
  +     [EMAIL PROTECTED]  params  The new outputFile value
        */
  -    protected String getWarnLevelParameter() {
  -        return "/warn:" + warnLevel;
  +    public void setOutputFile(File params) {
  +        setDestFile(params);
       }
   
   
  @@ -644,209 +361,7 @@
   
   
       /**
  -     *  Sets the name of main class for executables.
  -     *
  -     [EMAIL PROTECTED]  mainClass  The new MainClass value
  -     */
  -    public void setMainClass(String mainClass) {
  -        this.mainClass = mainClass;
  -    }
  -
  -
  -    /**
  -     *  Gets the MainClass attribute
  -     *
  -     [EMAIL PROTECTED]    The MainClass value
  -     */
  -    public String getMainClass() {
  -        return this.mainClass;
  -    }
  -
  -
  -    /**
  -     *  get the /main argument or null for no argument needed
  -     *
  -     [EMAIL PROTECTED]    The MainClass Parameter to CSC
  -     */
  -    protected String getMainClassParameter() {
  -        if (mainClass != null && mainClass.length() != 0) {
  -            return "/main:" + mainClass;
  -        } else {
  -            return null;
  -        }
  -    }
  -
  -
  -    /**
  -     * Any extra options which are not explicitly supported
  -     * by this task.
  -     *
  -     [EMAIL PROTECTED]  extraOptions  The new ExtraOptions value
  -     */
  -    public void setExtraOptions(String extraOptions) {
  -        this.extraOptions = extraOptions;
  -    }
  -
  -
  -    /**
  -     *  Gets the ExtraOptions attribute
  -     *
  -     [EMAIL PROTECTED]    The ExtraOptions value
  -     */
  -    public String getExtraOptions() {
  -        return this.extraOptions;
  -    }
  -
  -
  -    /**
  -     *  get any extra options or null for no argument needed
  -     *
  -     [EMAIL PROTECTED]    The ExtraOptions Parameter to CSC
  -     */
  -    protected String getExtraOptionsParameter() {
  -        if (extraOptions != null && extraOptions.length() != 0) {
  -            return extraOptions;
  -        } else {
  -            return null;
  -        }
  -    }
  -
  -
  -    /**
  -     *  Set the source directory of the files to be compiled.
  -     *
  -     [EMAIL PROTECTED]  srcDirName  The new SrcDir value
  -     */
  -    public void setSrcDir(File srcDirName) {
  -        this.srcDir = srcDirName;
  -    }
  -
  -
  -    /**
  -     * Set the destination directory of files to be compiled.
  -     *
  -     [EMAIL PROTECTED]  dirName  The new DestDir value
  -     */
  -    public void setDestDir(File dirName) {
  -        log( "DestDir currently unused", Project.MSG_WARN );
  -    }
  -
  -
  -    /**
  -     * Set the type of target.
  -     *
  -     [EMAIL PROTECTED]  ttype          The new TargetType value
  -     [EMAIL PROTECTED]  BuildException  if target is not one of
  -     *      exe|library|module|winexe
  -     */
  -    public void setTargetType(String ttype)
  -             throws BuildException {
  -        targetType = ttype.toLowerCase();
  -        if (targetType.equals("exe") || targetType.equals("library") ||
  -                targetType.equals("module") || targetType.equals("winexe")) {
  -            targetType = targetType;
  -        } else {
  -            throw new BuildException("targetType " + targetType 
  -                    + " is not one of 'exe', 'module', 'winexe' or 
'library'" );
  -        }
  -    }
  -
  -
  -    /**
  -     *  Gets the TargetType attribute
  -     *
  -     [EMAIL PROTECTED]    The TargetType value
  -     */
  -    public String getTargetType() {
  -        return targetType;
  -    }
  -
  -
  -    /**
  -     *  get the argument or null for no argument needed
  -     *
  -     [EMAIL PROTECTED]    The TargetType Parameter to CSC
  -     */
  -    protected String getTargetTypeParameter() {
  -        if (notEmpty(targetType)) {
  -            return "/target:" + targetType;
  -        } else {
  -            return null;
  -        }
  -    }
  -
  -
  -    /**
  -     *  Set the filename of icon to include.
  -     *
  -     [EMAIL PROTECTED]  fileName  path to the file. Can be relative, 
absolute, whatever.
  -     */
  -    public void setWin32Icon(File fileName) {
  -        win32icon = fileName;
  -    }
  -
  -
  -    /**
  -     *  get the argument or null for no argument needed
  -     *
  -     [EMAIL PROTECTED]    The Win32Icon Parameter to CSC
  -     */
  -    protected String getWin32IconParameter() {
  -        if (win32icon != null) {
  -            return "/win32icon:" + win32icon.toString();
  -        } else {
  -            return null;
  -        }
  -    }
  -
  -
  -    /**
  -     * Sets the filename of a win32 resource (.RES) file to include.
  -     * This is not a .NET resource, but what Windows is used to.
  -     *
  -     [EMAIL PROTECTED]  fileName  path to the file. Can be relative, 
absolute, whatever.
  -     */
  -    public void setWin32Res(File fileName) {
  -        win32res = fileName;
  -    }
  -
  -
  -    /**
  -     *  get the argument or null for no argument needed
  -     *
  -     [EMAIL PROTECTED]    The Win32Res Parameter to CSC
  -     */
  -    protected String getWin32ResParameter() {
  -        if (win32res != null) {
  -            return "/win32res:" + win32res.toString();
  -        } else {
  -            return null;
  -        }
  -    }
  -
  -
  -    /**
  -     * If true, require all compiler output to be in UTF8 format.
  -     *
  -     [EMAIL PROTECTED]  enabled  The new utf8Output value
  -     */
  -    public void setUtf8Output(boolean enabled) {
  -        utf8output = enabled;
  -    }
  -
  -
  -    /**
  -     *  Gets the utf8OutpuParameter attribute of the CSharp object
  -     *
  -     [EMAIL PROTECTED]    The utf8OutpuParameter value
  -     */
  -    protected String getUtf8OutputParameter() {
  -        return utf8output ? "/utf8output" : null;
  -    }
  -
  -
  -    /**
  -     * A flag that tells the compiler not to read in the compiler 
  +     * A flag that tells the compiler not to read in the compiler
        * settings files 'csc.rsp' in its bin directory and then the local 
directory
        *
        [EMAIL PROTECTED]  enabled  The new noConfig value
  @@ -867,26 +382,6 @@
   
   
       /**
  -     * If true, print the full path of files on errors.
  -     *
  -     [EMAIL PROTECTED]  enabled  The new fullPaths value
  -     */
  -    public void setFullPaths(boolean enabled) {
  -        fullpaths = enabled;
  -    }
  -
  -
  -    /**
  -     *  Gets the fullPathsParameter attribute of the CSharp object
  -     *
  -     [EMAIL PROTECTED]    The fullPathsParameter value
  -     */
  -    protected String getFullPathsParameter() {
  -        return fullpaths ? "/fullpaths" : null;
  -    }
  -
  -
  -    /**
        *  Semicolon separated list of defined constants.
        *
        [EMAIL PROTECTED]  params  The new definitions value
  @@ -895,240 +390,64 @@
           definitions = params;
       }
   
  -
       /**
  -     *  get the argument or null for no argument needed
  -     *
  +     * override the superclasses version of this method (which we call)
  +     * with a check for a definitions attribute, the contents of which
  +     * are appended to the list.
        [EMAIL PROTECTED]    The Definitions Parameter to CSC
        */
       protected String getDefinitionsParameter() {
  +        String predecessors=super.getDefinitionsParameter();
           if (notEmpty(definitions)) {
  -            return "/define:" + definitions;
  -        } else {
  -            return null;
  -        }
  -    }
  -
  -
  -    /**
  -     * Semicolon separated list of modules to refer to.
  -     *
  -     [EMAIL PROTECTED]  params  The new additionalModules value
  -     */
  -    public void setAdditionalModules(String params) {
  -        additionalModules = params;
  -    }
  -
  -
  -    /**
  -     *  get the argument or null for no argument needed
  -     *
  -     [EMAIL PROTECTED]    The AdditionalModules Parameter to CSC
  -     */
  -    protected String getAdditionalModulesParameter() {
  -        if (notEmpty(additionalModules)) {
  -            return "/addmodule:" + additionalModules;
  -        } else {
  -            return null;
  -        }
  -    }
  -
  -
  -    /**
  -     *  Set the output file
  -     *
  -     [EMAIL PROTECTED]  params  The new outputFile value
  -     */
  -    public void setOutputFile(File params) {
  -        outputFile = params;
  -    }
  -
  -    /**
  -     *  Set the name of exe/library to create.
  -     *
  -     [EMAIL PROTECTED]  file  The new outputFile value
  -     */
  -    public void setDestFile(File file) {
  -        outputFile = file;
  -    }
  -    
  -
  -    /**
  -     *  get the argument or null for no argument needed
  -     *
  -     [EMAIL PROTECTED]    The OutputFile Parameter to CSC
  -     */
  -    protected String getOutputFileParameter() {
  -        if (outputFile != null) {
  -            File f = outputFile;
  -            return "/out:" + f.toString();
  +            if(predecessors==null) {
  +                predecessors= "/define:";
  +            }
  +            return  predecessors+ definitions;
           } else {
  -            return null;
  +            return predecessors;
           }
       }
   
   
       /**
  -     * If true, fail on compilation errors.
  -     *
  -     [EMAIL PROTECTED]  b  The new FailOnError value
  -     */
  -    public void setFailOnError(boolean b) {
  -        failOnError = b;
  -    }
  -
  -
  -    /**
  -     *  query fail on error flag
  -     *
  -     [EMAIL PROTECTED]    The FailFailOnError value
  +     * add Commands unique to C#.
  +     * @param command ongoing command
        */
  -    public boolean getFailOnError() {
  -        return failOnError;
  +    public void addCompilerSpecificOptions(NetCommand command) {
  +        command.addArgument(getIncludeDefaultReferencesParameter());
  +        command.addArgument(getWarnLevelParameter());
  +        command.addArgument(getDocFileParameter());
  +        command.addArgument(getFullPathsParameter());
  +        command.addArgument(getFileAlignParameter());
  +        command.addArgument(getIncrementalParameter());
  +        command.addArgument(getNoConfigParameter());
  +        command.addArgument(getUnsafeParameter());
       }
   
  -    /**
  -     * Set the file alignment.
  -     * Valid values are 0,512, 1024, 2048, 4096, 8192,
  -     * and 16384, 0 means 'leave to the compiler'
  -     */
  -    public void setFileAlign(int fileAlign) {
  -        this.fileAlign = fileAlign;
  -    }
  +    // end execute
   
       /**
  -     *  get the argument or null for no argument needed
  -     *
  -     [EMAIL PROTECTED]    The OutputFile Parameter to CSC
  +     * how does C# separate references? with a semi colon
        */
  -    protected String getFileAlignParameter() {
  -        if (fileAlign != 0) {
  -            return "/filealign:" + fileAlign;
  -        } else {
  -            return null;
  -        }
  +    public String getReferenceDelimiter() {
  +        return ";";
       }
  -    /**
  -     *  reset all contents.
  -     */
  -    public void Clear() {
  -        targetType = null;
  -        win32icon = null;
  -        srcDir = null;
  -        mainClass = null;
  -        unsafe = false;
  -        warnLevel = 3;
  -        docFile = null;
  -        incremental = false;
  -        optimize = false;
  -        debug = true;
  -        references = null;
  -        failOnError = true;
  -        definitions = null;
  -        additionalModules = null;
  -        includeDefaultReferences = true;
  -        extraOptions = null;
  -        fullpaths = true;
  -        fileAlign = 0;
  -    }
  -
   
       /**
  -     *  test for a string containing something useful
  -     *
  -     [EMAIL PROTECTED]  s  string in
  -     [EMAIL PROTECTED]    true if the argument is not null or empty
  +     * compiler is 'csc'
  +     * @return
        */
  -    protected boolean notEmpty(String s) {
  -        return s != null && s.length() != 0;
  -    }
  -
  -    /**
  -     * validation code
  -     * @throws  BuildException  if validation failed
  -     */ 
  -    protected void validate() 
  -            throws BuildException {
  -        if (outputFile != null && outputFile.isDirectory()) {
  -            throw new BuildException("destFile cannot be a directory");
  -        }
  +    public String getCompilerExeName() {
  +        return "csc";
       }
   
       /**
  -     *  do the work by building the command line and then calling it
  -     *
  -     [EMAIL PROTECTED]  BuildException  if validation or execution failed
  +     * extension is '.cs'
  +     * @return
        */
  -    public void execute()
  -             throws BuildException {
  -        if (srcDir == null) {
  -            srcDir = getProject().resolveFile(".");
  -        }
  -        log("CSC working from source directory " + srcDir, 
Project.MSG_VERBOSE);
  -        validate();
  -
  -        NetCommand command = new NetCommand(this, "CSC", csc_exe_name);
  -        command.setFailOnError(getFailOnError());
  -        //DEBUG helper
  -        command.setTraceCommandLine(true);
  -        //fill in args
  -        command.addArgument("/nologo");
  -        command.addArgument(getAdditionalModulesParameter());
  -        command.addArgument(getDefinitionsParameter());
  -        command.addArgument(getDebugParameter());
  -        command.addArgument(getDocFileParameter());
  -        command.addArgument(getIncrementalParameter());
  -        command.addArgument(getMainClassParameter());
  -        command.addArgument(getOptimizeParameter());
  -        command.addArgument(getReferencesParameter());
  -        command.addArgument(getTargetTypeParameter());
  -        command.addArgument(getUnsafeParameter());
  -        command.addArgument(getWarnLevelParameter());
  -        command.addArgument(getWin32IconParameter());
  -        command.addArgument(getOutputFileParameter());
  -        command.addArgument(getIncludeDefaultReferencesParameter());
  -        command.addArgument(getDefaultReferenceParameter());
  -        command.addArgument(getWin32ResParameter());
  -        command.addArgument(getUtf8OutputParameter());
  -        command.addArgument(getNoConfigParameter());
  -        command.addArgument(getFullPathsParameter());
  -        command.addArgument(getExtraOptionsParameter());
  -        command.addArgument(getFileAlignParameter());
  -
  -        long outputTimestamp;
  -        if (outputFile != null && outputFile.exists()) {
  -            outputTimestamp = outputFile.lastModified();
  -        } else {
  -            outputTimestamp = 0;
  -        }
  -        int filesOutOfDate = 0;
  -        //get dependencies list.
  -        DirectoryScanner scanner = super.getDirectoryScanner(srcDir);
  -        String[] dependencies = scanner.getIncludedFiles();
  -        log("compiling " + dependencies.length + " file" + 
((dependencies.length == 1) ? "" : "s"));
  -        File base = scanner.getBasedir();
  -        //add to the command
  -        for (int i = 0; i < dependencies.length; i++) {
  -            File targetFile = new File(base, dependencies[i]);
  -            log(targetFile.toString(), Project.MSG_VERBOSE);
  -            command.addArgument(targetFile.toString());
  -            if (targetFile.lastModified() > outputTimestamp) {
  -                filesOutOfDate++;
  -                log("Source file " + targetFile.toString() + " is out of 
date",
  -                        Project.MSG_VERBOSE);
  -            } else {
  -                log("Source file " + targetFile.toString() + " is up to 
date",
  -                        Project.MSG_VERBOSE);
  -            }
  -            
  -        }
  -
  -        //now run the command of exe + settings + files
  -        if (filesOutOfDate > 0) {
  -            command.runCommand();
  -        }
  +    public String getFileExtension() {
  +        return "cs";
       }
  -    // end execute
   
   }
   
  
  
  
  1.1                  
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/dotnet/DotnetCompile.java
  
  Index: DotnetCompile.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Ant", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  /*
   *  build notes
   *  -The reference CD to listen to while editing this file is
   *  nap:Cream+Live+2001+CD+2
   */
  
  // place in the optional ant tasks package
  // but in its own dotnet group
  
  package org.apache.tools.ant.taskdefs.optional.dotnet;
  
  // imports
  
  import java.io.File;
  import java.util.Vector;
  import java.util.Enumeration;
  import java.util.Hashtable;
  
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.DirectoryScanner;
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.Task;
  import org.apache.tools.ant.taskdefs.MatchingTask;
  import org.apache.tools.ant.types.Path;
  import org.apache.tools.ant.types.FileSet;
  import org.apache.tools.ant.types.EnumeratedAttribute;
  
  
  /**
   *  Abstract superclass for dotnet compiler tasks.
   *
   *  History
   *  <table>
   *    <tr>
   *      <td>
   *        0.1
   *      </td>
   *      <td>
   *        First creation
   *      </td>
   *      <td>
   *        Most of the code here was copied verbatim from v0.3 of 
   *        Steve Loughran's CSharp optional task. Abstracted functionality
   *        to allow subclassing of other dotnet compiler types.
   *      </td>
   *    </tr>
   *
   *  </table>
   *
   *
   * @author      Brian Felder [EMAIL PROTECTED]
   * @author      Steve Loughran
   * @version     0.1
   */
  
  public abstract class DotnetCompile
           extends MatchingTask {
  
      /**
       *  list of reference classes. (pretty much a classpath equivalent)
       */
      private String references;
  
      /**
       *  flag to enable automatic reference inclusion
       */
      private boolean includeDefaultReferences;
  
      /**
       *  icon for incorporation into apps
       */
      private File win32icon;
  
      /**
       *  icon for incorporation into apps
       */
      private File win32res;
  
      /**
       *  output file. If not supplied this is derived from the source file
       */
      private File outputFile;
  
      /**
       *  flag to control action on execution trouble
       */
      private boolean failOnError;
  
      /**
       *  using the path approach didnt work as it could not handle the implicit
       *  execution path. Perhaps that could be extracted from the runtime and
       *  then the path approach would be viable
       */
      private Path referenceFiles;
  
      /**
       *  optimise flag
       */
      private boolean optimize;
  
      /**
       * sets of file to compile
       */
      protected Vector filesets = new Vector();
  
      /**
       * a list of definitions to support;
       */
      protected Vector definitionList = new Vector();
  
  
      /**
       *  Fix .NET reference inclusion. .NET is really dumb in how it handles
       *  inclusion. You have to list every 'assembly' -read DLL that is 
imported.
       *  So already you are making a platform assumption -shared libraries 
have a
       *  .dll;"+ extension and the poor developer has to know every library 
which
       *  is included why the compiler cant find classes on the path or in a
       *  directory, is a mystery. To reduce the need to be explicit, here is a
       *  long list of the core libraries used in Beta-1 of .NET ommitting the
       *  blatantly non portable (MS.win32.interop) and the .designer libraries.
       *  (ripping out Com was tempting) Casing is chosen to match that of the
       *  file system <i>exactly</i> so may work on a unix box too. there is no
       *  need to reference mscorlib.dll, cos it is always there
       */
  
      protected static final String [] DEFAULT_REFERENCE_LIST_DOTNET_10 =
             {"Accessibility.dll",
              "cscompmgd.dll",
              "CustomMarshalers.dll",
              "Mscorcfg.dll",
              "System.Configuration.Install.dll",
              "System.Data.dll",
              "System.Design.dll",
              "System.DirectoryServices.dll",
              "System.EnterpriseServices.dll",
              "System.dll",
              "System.Drawing.Design.dll",
              "System.Drawing.dll",
              "System.Management.dll",
              "System.Messaging.dll",
              "System.Runtime.Remoting.dll",
              "System.Runtime.Serialization.Formatters.Soap.dll",
              "System.Security.dll",
              "System.ServiceProcess.dll",
              "System.Web.dll",
              "System.Web.RegularExpressions.dll",
              "System.Web.Services.dll",
              "System.Windows.Forms.dll",
              "System.XML.dll"};
  
      /**
       *  debug flag. Controls generation of debug information.
       */
      protected boolean debug;
  
      /**
       *  warning level: 0-4, with 4 being most verbose
       */
      private int warnLevel;
  
      /**
       *  main class (or null for automatic choice)
       */
      protected String mainClass;
  
      /**
       *  any extra command options?
       */
      protected String extraOptions;
  
      /**
       *  source directory upon which the search pattern is applied
       */
      private File srcDir;
  
      /**
       *  type of target. Should be one of exe|library|module|winexe|(null)
       *  default is exe; the actual value (if not null) is fed to the command
       *  line. <br>
       *  See /target
       */
      protected String targetType;
  
      /**
       *  utf out flag
       */
  
      protected boolean utf8output = false;
  
      /**
       *  list of extra modules to refer to
       */
      String additionalModules;
  
  
      /**
       *  constructor inits everything and set up the search pattern
       */
  
      public DotnetCompile() {
          clear();
          setIncludes(getFilePattern());
      }
      
      /**
       *  reset all contents.
       */
      public void clear() {
          targetType = null;
          win32icon = null;
          srcDir = null;
          mainClass = null;
          warnLevel = 3;
          optimize = false;
          debug = true;
          references = null;
          failOnError = true;
          additionalModules = null;
          includeDefaultReferences = true;
          extraOptions = null;
      }
  
  
      /**
       * Semicolon separated list of DLLs to refer to.
       *
       [EMAIL PROTECTED]  s  The new References value
       */
      public void setReferences(String s) {
          references = s;
      }
  
  
      /**
       *  get the reference string or null for no argument needed
       *
       [EMAIL PROTECTED]    The References Parameter to CSC
       */
      protected String getReferencesParameter() {
          //bail on no references
          if (notEmpty(references)) {
              return "/reference:" + references;
          } else {
              return null;
          }
      }
  
      /**
       * Path of references to include.
       * Wildcards should work.
       *
       [EMAIL PROTECTED]  path  another path to append
       */
      public void setReferenceFiles(Path path) {
          //demand create pathlist
          if (referenceFiles == null) {
              referenceFiles = new Path(this.getProject());
          }
          referenceFiles.append(path);
      }
  
  
      /**
       *  turn the path list into a list of files and a /references argument
       *
       [EMAIL PROTECTED]    null or a string of references.
       */
      protected String getReferenceFilesParameter() {
          //bail on no references
          if (references == null) {
              return null;
          }
          //iterate through the ref list & generate an entry for each
          //or just rely on the fact that the toString operator does this, but
          //noting that the separator is ';' on windows, ':' on unix
          String refpath = references.toString();
  
          //bail on no references listed
          if (refpath.length() == 0) {
              return null;
          }
  
          StringBuffer s = new StringBuffer("/reference:");
          s.append(refpath);
          return new String(s);
      }
  
  
      /**
       *  get default reference list
       *
       [EMAIL PROTECTED]    null or a string of references.
       */
      protected String getDefaultReferenceParameter() {
          if (includeDefaultReferences) {
              StringBuffer s = new StringBuffer("/reference:");
              s.append(getDefaultReferenceList());
              return new String(s);
          } else {
              return null;
          }
      }
  
  
      /**
       * If true, automatically includes the common assemblies
       * in dotnet, and tells the compiler to link in mscore.dll.
       *
       *  set the automatic reference inclusion flag on or off this flag 
controls
       *  the string of references and the /nostdlib option in CSC
       *
       [EMAIL PROTECTED]  f  on/off flag
       */
      public void setIncludeDefaultReferences(boolean f) {
          includeDefaultReferences = f;
      }
  
  
      /**
       *  query automatic reference inclusion flag
       *
       [EMAIL PROTECTED]    true if flag is turned on
       */
      public boolean getIncludeDefaultReferences() {
          return includeDefaultReferences;
      }
  
  
      /**
       *  get the include default references flag or null for no argument needed
       *
       [EMAIL PROTECTED]    The Parameter to CSC
       */
      protected String getIncludeDefaultReferencesParameter() {
          return "/nostdlib" + (includeDefaultReferences ? "-" : "+");
      }
  
  
  
      /**
       * If true, enables optimization flag.
       *
       [EMAIL PROTECTED]  f  on/off flag
       */
      public void setOptimize(boolean f) {
          optimize = f;
      }
  
  
      /**
       *  query the optimise flag
       *
       [EMAIL PROTECTED]    true if optimise is turned on
       */
      public boolean getOptimize() {
          return optimize;
      }
  
  
      /**
       *  get the optimise flag or null for no argument needed
       *
       [EMAIL PROTECTED]    The Optimize Parameter to CSC
       */
      protected String getOptimizeParameter() {
          return "/optimize" + (optimize ? "+" : "-");
      }
  
  
      /**
       *  set the debug flag on or off.
       *
       [EMAIL PROTECTED]  f  on/off flag
       */
      public void setDebug(boolean f) {
          debug = f;
      }
  
  
      /**
       *  query the debug flag
       *
       [EMAIL PROTECTED]    true if debug is turned on
       */
      public boolean getDebug() {
          return debug;
      }
  
  
      /**
       *  get the debug switch argument
       *
       [EMAIL PROTECTED]    The Debug Parameter to CSC
       */
      protected String getDebugParameter() {
          return "/debug" + (debug ? "+" : "-");
      }
  
  
      /**
       * Level of warning currently between 1 and 4
       * with 4 being the strictest.
       *
       [EMAIL PROTECTED]  warnLevel  warn level -see .net docs for valid range 
(probably
       *      0-4)
       */
      public void setWarnLevel(int warnLevel) {
          this.warnLevel = warnLevel;
      }
  
  
      /**
       *  query warn level
       *
       [EMAIL PROTECTED]    current value
       */
      public int getWarnLevel() {
          return warnLevel;
      }
  
  
      /**
       *  get the warn level switch
       *
       [EMAIL PROTECTED]    The WarnLevel Parameter to CSC
       */
      protected String getWarnLevelParameter() {
          return "/warn:" + warnLevel;
      }
  
  
      /**
       *  Sets the name of main class for executables.
       *
       [EMAIL PROTECTED]  mainClass  The new MainClass value
       */
      public void setMainClass(String mainClass) {
          this.mainClass = mainClass;
      }
  
  
      /**
       *  Gets the MainClass attribute
       *
       [EMAIL PROTECTED]    The MainClass value
       */
      public String getMainClass() {
          return this.mainClass;
      }
  
  
      /**
       *  get the /main argument or null for no argument needed
       *
       [EMAIL PROTECTED]    The MainClass Parameter to CSC
       */
      protected String getMainClassParameter() {
          if (mainClass != null && mainClass.length() != 0) {
              return "/main:" + mainClass;
          } else {
              return null;
          }
      }
  
  
      /**
       * Any extra options which are not explicitly supported
       * by this task.
       *
       [EMAIL PROTECTED]  extraOptions  The new ExtraOptions value
       */
      public void setExtraOptions(String extraOptions) {
          this.extraOptions = extraOptions;
      }
  
  
      /**
       *  Gets the ExtraOptions attribute
       *
       [EMAIL PROTECTED]    The ExtraOptions value
       */
      public String getExtraOptions() {
          return this.extraOptions;
      }
  
  
      /**
       *  get any extra options or null for no argument needed
       *
       [EMAIL PROTECTED]    The ExtraOptions Parameter to CSC
       */
      protected String getExtraOptionsParameter() {
          if (extraOptions != null && extraOptions.length() != 0) {
              return extraOptions;
          } else {
              return null;
          }
      }
  
  
      /**
      * Overridden because we need to be able to set the srcDir.
      */
      public File getSrcDir() {
          return this.srcDir;
      }
  
      /**
       *  Set the source directory of the files to be compiled.
       *
       [EMAIL PROTECTED]  srcDirName  The new SrcDir value
       */
      public void setSrcDir(File srcDirName) {
          this.srcDir = srcDirName;
      }
  
  
      /**
       * Set the destination directory of files to be compiled.
       *
       [EMAIL PROTECTED]  dirName  The new DestDir value
       */
      public void setDestDir(File dirName) {
          log( "DestDir currently unused", Project.MSG_WARN );
      }
  
  
      /**
       * set the target type to one of exe|library|module|winexe
       * @param targetType
       */
      public void setTargetType(TargetTypes targetType) {
          this.targetType=targetType.getValue();
      }
      /**
       * Set the type of target.
       *
       [EMAIL PROTECTED]  ttype          The new TargetType value
       [EMAIL PROTECTED]  BuildException  if target is not one of
       *      exe|library|module|winexe
       */
      public void setTargetType(String ttype)
               throws BuildException {
          targetType = ttype.toLowerCase();
          if (targetType.equals("exe") || targetType.equals("library") ||
                  targetType.equals("module") || targetType.equals("winexe")) {
              targetType = targetType;
          } else {
              throw new BuildException("targetType " + targetType 
                      + " is not one of 'exe', 'module', 'winexe' or 'library'" 
);
          }
      }
  
  
      /**
       *  Gets the TargetType attribute
       *
       [EMAIL PROTECTED]    The TargetType value
       */
      public String getTargetType() {
          return targetType;
      }
  
  
      /**
       *  get the argument or null for no argument needed
       *
       [EMAIL PROTECTED]    The TargetType Parameter to CSC
       */
      protected String getTargetTypeParameter() {
          if (notEmpty(targetType)) {
              return "/target:" + targetType;
          } else {
              return null;
          }
      }
  
  
      /**
       *  Set the filename of icon to include.
       *
       [EMAIL PROTECTED]  fileName  path to the file. Can be relative, 
absolute, whatever.
       */
      public void setWin32Icon(File fileName) {
          win32icon = fileName;
      }
  
  
      /**
       *  get the argument or null for no argument needed
       *
       [EMAIL PROTECTED]    The Win32Icon Parameter to CSC
       */
      protected String getWin32IconParameter() {
          if (win32icon != null) {
              return "/win32icon:" + win32icon.toString();
          } else {
              return null;
          }
      }
  
  
      /**
       * Sets the filename of a win32 resource (.RES) file to include.
       * This is not a .NET resource, but what Windows is used to.
       *
       [EMAIL PROTECTED]  fileName  path to the file. Can be relative, 
absolute, whatever.
       */
      public void setWin32Res(File fileName) {
          win32res = fileName;
      }
      
      /**
       * Gets the file of the win32 .res file to include.
       * @return path to the file.
       */
      public File getWin32Res() {
          return win32res;
      }
  
  
      /**
       *  get the argument or null for no argument needed
       *
       [EMAIL PROTECTED]    The Win32Res Parameter to CSC
       */
      protected String getWin32ResParameter() {
          if (win32res != null) {
              return "/win32res:" + win32res.toString();
          } else {
              return null;
          }
      }
  
  
      /**
       * If true, require all compiler output to be in UTF8 format.
       *
       [EMAIL PROTECTED]  enabled  The new utf8Output value
       */
      public void setUtf8Output(boolean enabled) {
          utf8output = enabled;
      }
  
  
      /**
       *  Gets the utf8OutpuParameter attribute of the CSharp object
       *
       [EMAIL PROTECTED]    The utf8OutpuParameter value
       */
      protected String getUtf8OutputParameter() {
          return utf8output ? "/utf8output" : null;
      }
  
  
  
  
      /**
       * add a define to the list of definitions
       * @param define
       */
      public void addDefine(Define define) {
          definitionList.add(define);
      }
  
  
      /**
       * get a list of definitions or null
       * @return a string beginning /D: or null for no definitions
       */
      protected String getDefinitionsParameter() throws BuildException {
          StringBuffer defines=new StringBuffer();
          Enumeration defEnum=definitionList.elements();
          while (defEnum.hasMoreElements()) {
              //loop through all definitions
              Define define = (Define) defEnum.nextElement();
              if(define.isSet(this)) {
                  //add those that are set, and a delimiter
                  defines.append(define.getValue(this));
                  defines.append(getDefinitionsDelimiter());
              }
          }
          if(defines.length()==0) {
              return null;
          } else {
              return new String(defines);
          }
      }
  
  
      /**
       * Semicolon separated list of modules to refer to.
       *
       [EMAIL PROTECTED]  params  The new additionalModules value
       */
      public void setAdditionalModules(String params) {
          additionalModules = params;
      }
  
  
      /**
       *  get the argument or null for no argument needed
       *
       [EMAIL PROTECTED]    The AdditionalModules Parameter to CSC
       */
      protected String getAdditionalModulesParameter() {
          if (notEmpty(additionalModules)) {
              return "/addmodule:" + additionalModules;
          } else {
              return null;
          }
      }
  
  
  
      /**
       *  Set the name of exe/library to create.
       *
       [EMAIL PROTECTED]  file  The new outputFile value
       */
      public void setDestFile(File file) {
          outputFile = file;
      }
      
  
      /**
       *  get the argument or null for no argument needed
       *
       [EMAIL PROTECTED]    The OutputFile Parameter to CSC
       */
      protected String getDestFileParameter() {
          if (outputFile != null) {
              File f = outputFile;
              return "/out:" + f.toString();
          } else {
              return null;
          }
      }
  
  
      /**
       * If true, fail on compilation errors.
       *
       [EMAIL PROTECTED]  b  The new FailOnError value
       */
      public void setFailOnError(boolean b) {
          failOnError = b;
      }
  
  
      /**
       *  query fail on error flag
       *
       [EMAIL PROTECTED]    The FailFailOnError value
       */
      public boolean getFailOnError() {
          return failOnError;
      }
  
  
      /**
       *  test for a string containing something useful
       *
       [EMAIL PROTECTED]  s  string in
       [EMAIL PROTECTED]    true if the argument is not null or empty
       */
      protected boolean notEmpty(String s) {
          return s != null && s.length() != 0;
      }
  
      /**
       * validation code
       * @throws  BuildException  if validation failed
       */ 
      protected void validate() 
              throws BuildException {
          if (outputFile != null && outputFile.isDirectory()) {
              throw new BuildException("destFile cannot be a directory");
          }
      }
      
      /**
       * Based on DEFAULT_REFERENCE_LIST and getReferenceDelimiter(),
       * build the appropriate reference string for the compiler.
       * @return The properly delimited reference list.
       */
      public String getDefaultReferenceList() {
          StringBuffer referenceList = new StringBuffer();
          for (int index = 0; index < DEFAULT_REFERENCE_LIST_DOTNET_10.length; 
index++) {
              referenceList.append(DEFAULT_REFERENCE_LIST_DOTNET_10[index]);
              referenceList.append(getReferenceDelimiter());
          }
          return referenceList.toString();
      }
      
      /**
       * Get the pattern for files to compile.
       * @return The compilation file pattern.
       */
      public String getFilePattern() {
          return "**/*." + getFileExtension();
      }
  
      /**
       * get the destination file
       * @return the dest file or null for not assigned
       */
      public File getDestFile() {
          return outputFile;
      }
  
      /**
       *  do the work by building the command line and then calling it
       *
       [EMAIL PROTECTED]  BuildException  if validation or execution failed
       */
      public void execute()
               throws BuildException {
          validate();
          NetCommand command = createNetCommand();
          //fill in args
          fillInSharedParameters(command);
          addCompilerSpecificOptions(command);
          addFilesAndExecute(command);
  
      }
      
      /**
       * Get the delimiter that the compiler uses between references.
       * For example, c# will return ";"; VB.NET will return ","
       * @return The string delimiter for the reference string.
       */
      public abstract String getReferenceDelimiter();
      
      /**
       * Get the name of the compiler executable.
       * @return The name of the compiler executable.
       */
      public abstract String getCompilerExeName() ;
  
      /**
       * Get the extension of filenames to compile.
       * @return The string extension of files to compile.
       */
      public abstract String getFileExtension();
  
      /**
       * create the list of files
       * @param filesToBuild vector to add files to
       * @param outputTimestamp timestamp to compare against
       * @return number of files out of date
       */
      protected int buildFileList(Hashtable filesToBuild, long outputTimestamp) 
{
          int filesOutOfDate=0;
          boolean scanImplicitFileset=getSrcDir()!=null || filesets.size()==0;
          if(scanImplicitFileset) {
              //scan for an implicit fileset if there was a srcdir set
              //or there was no srcDir set but the @
              if (getSrcDir() == null) {
                  //if there is no src dir here, set it
                  setSrcDir(getProject().resolveFile("."));
              }
              log("working from source directory " + getSrcDir(), 
Project.MSG_VERBOSE);
              //get dependencies list.
              DirectoryScanner scanner = super.getDirectoryScanner(getSrcDir());
              filesOutOfDate = scanOneFileset(scanner, filesToBuild, 
outputTimestamp);
          }
          //get any included source directories
          for (int i = 0; i < filesets.size(); i++) {
              FileSet fs = (FileSet) filesets.elementAt(i);
              
filesOutOfDate+=scanOneFileset(fs.getDirectoryScanner(getProject()),
                      filesToBuild,
                      outputTimestamp);
          }
  
          return filesOutOfDate;
      }
  
      /**
       * scan through one fileset for files to include
       * @param scanner
       * @param filesToBuild
       * @param outputTimestamp timestamp to compare against
       * @return #of files out of date
       * @todo: should FAT granularity be included here?
       */
      protected int scanOneFileset(DirectoryScanner scanner, Hashtable 
filesToBuild,
                                   long outputTimestamp) {
          int filesOutOfDate = 0;
          String[] dependencies = scanner.getIncludedFiles();
          File base = scanner.getBasedir();
          //add to the list
          for (int i = 0; i < dependencies.length; i++) {
              File targetFile = new File(base, dependencies[i]);
              if(filesToBuild.get(targetFile)==null) {
                  log(targetFile.toString(), Project.MSG_VERBOSE);
                  filesToBuild.put(targetFile,targetFile);
                  if (targetFile.lastModified() > outputTimestamp) {
                      filesOutOfDate++;
                      log("Source file " + targetFile.toString() + " is out of 
date",
                              Project.MSG_VERBOSE);
                  } else {
                      log("Source file " + targetFile.toString() + " is up to 
date",
                              Project.MSG_VERBOSE);
                  }
              }
          }
          return filesOutOfDate;
      }
  
      /**
       * add the list of files to a command
       * @param filesToBuild vector of files
       * @param command the command to append to
       */
      protected void addFilesToCommand(Hashtable filesToBuild, NetCommand 
command) {
          int count=filesToBuild.size();
          log("compiling " + count + " file" + ((count== 1) ? "" : "s"));
          Enumeration files=filesToBuild.elements();
          while (files.hasMoreElements()) {
              File file = (File) files.nextElement();
              command.addArgument(file.toString());
          }
      }
  
      /**
       * determine the timestamp of the output file
       * @return a timestamp or 0 for no output file known/exists
       */
      protected long getOutputFileTimestamp() {
          long outputTimestamp;
          if (getDestFile() != null && getDestFile().exists()) {
              outputTimestamp = getDestFile().lastModified();
          } else {
              outputTimestamp = 0;
          }
          return outputTimestamp;
      }
  
      /**
       * fill in the common information
       * @param command
       */
      protected void fillInSharedParameters(NetCommand command) {
          command.setFailOnError(getFailOnError());
          //DEBUG helper
          command.setTraceCommandLine(true);
          //fill in args
          command.addArgument("/nologo");
          command.addArgument(getAdditionalModulesParameter());
          command.addArgument(getDebugParameter());
          command.addArgument(getDefaultReferenceParameter());
          command.addArgument(getDefinitionsParameter());
          command.addArgument(getExtraOptionsParameter());
          command.addArgument(getMainClassParameter());
          command.addArgument(getOptimizeParameter());
          command.addArgument(getDestFileParameter());
          command.addArgument(getReferencesParameter());
          command.addArgument(getTargetTypeParameter());
          command.addArgument(getUtf8OutputParameter());
          command.addArgument(getWin32IconParameter());
          command.addArgument(getWin32ResParameter());
      }
  
      /**
       * create our helper command
       * @return a command prefilled with the exe name and task name
       */
      protected NetCommand createNetCommand() {
          NetCommand command = new NetCommand(this, getTaskName(), 
getCompilerExeName());
          return command;
      }
  
      /**
       * add any compiler specifics
       * @param command
       */
      protected abstract void addCompilerSpecificOptions(NetCommand command);
  
      /**
       * finish off the command by adding all dependent files, execute
       * @param command
       */
      protected void addFilesAndExecute(NetCommand command) {
          long outputTimestamp = getOutputFileTimestamp();
          Hashtable filesToBuild =new Hashtable();
          int filesOutOfDate = buildFileList(filesToBuild, outputTimestamp);
  
          //add the files to the command
          addFilesToCommand(filesToBuild, command);
  
          //now run the command of exe + settings + files
          if (filesOutOfDate > 0) {
              command.runCommand();
          }
      }
  
      /**
       * override point for delimiting definitions
       * @return
       */
      public String getDefinitionsDelimiter() {
          return ";";
      }
  
      /**
       * Target types to build.
       * valid build types are exe|library|module|winexe
       */
      public static class TargetTypes extends EnumeratedAttribute {
          public String[] getValues() {
              return new String[] {
                  "exe",
                  "library",
                  "module",
                  "winexe"
              };
          }
      }
  
      /**
       * definitions can be conditional. What .NET conditions can not be
       * is in any state other than defined and undefined; you cannot give
       * a definition a value.
       */
      public static class Define {
          private String name;
          private String condition;
  
          public String getCondition() {
              return condition;
          }
  
          /**
           * the name of a property which must be defined for
           * the definition to be set. Optional.
           * @param condition
           */
          public void setCondition(String condition) {
              this.condition = condition;
          }
  
          public String getName() {
              return name;
          }
  
          /**
           * the name of the definition. Required.
           * @param name
           */
          public void setName(String name) {
              this.name = name;
          }
  
          /**
           * get the value of this definition. Will be null if a condition
           * was declared and not met
           * @param owner owning task
           * @return
           * @throws BuildException
           */
          public String getValue(Task owner) throws BuildException {
              if(name==null) {
                  throw new BuildException("No name provided for the define 
element",
                      owner.getLocation());
              }
              if(!isSet(owner)) {
                  return null;
              }
              return name;
          }
  
          /**
           * test for a define being set
           * @param owner
           * @return true if there was no condition, or it is met
           */
          public boolean isSet(Task owner) {
              return condition==null
              || owner.getProject().getProperty(condition) != null;
          }
      }
  }
  
  
  
  
  
  1.1                  
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/dotnet/VisualBasicCompile.java
  
  Index: VisualBasicCompile.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Ant", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.tools.ant.taskdefs.optional.dotnet;
  
  import org.apache.tools.ant.BuildException;
  
  
  /**
   * This task compiles Visual Basic.NET source into executables or modules.
   * The task will only work on win2K until other platforms support vbc.exe or
   * an equivalent. VBC.exe must be on the execute path, too.
   *
   * <p>
   * All parameters are optional: &lt;vbc/&gt; should suffice to produce a debug
   * build of all *.vb files.
   *
   * @author Brian Felder [EMAIL PROTECTED]
   * @author Steve Loughran
   */
  
  public class VisualBasicCompile extends DotnetCompile {
  
      /**
       * Compiler option to remove integer checks. Default: false.
       */
      private boolean removeIntChecks = false;
  
      /**
       * Require explicit declaration of variables? Default: false.
       */
      private boolean optionExplicit = false;
  
      /**
       * Enforce strict language semantics? Default: false.
       */
      private boolean optionStrict = false;
  
      /**
       * Whether to compare strings as "text" or "binary". Default: "binary".
       */
      private String optionCompare;
  
      /**
       * Root namespace for all type declarations.
       */
      private String rootNamespace;
  
      /**
       * Declare global imports fornamespaces in referenced metadata files.
       */
      private String imports;
  
      /**
       * Constructor for VisualBasicCompile.
       */
      public VisualBasicCompile() {
          super();
      }
  
      /**
       *  reset all contents.
       */
      public void clear() {
          super.clear();
          imports = null;
          rootNamespace = null;
          optionCompare = null;
          optionExplicit = false;
          optionStrict = false;
          removeIntChecks = false;
      }
  
      /**
       *  get the argument or null for no argument needed
       *  This is overridden from DotnetCompile.java because VBC uses
       *  "/win32resource:" rather than "/win32res:"
       *
       [EMAIL PROTECTED]    The Win32Res Parameter to CSC
       */
      protected String getWin32ResParameter() {
          if (getWin32Res() != null) {
              return "/win32resource:" + getWin32Res().toString();
          } else {
              return null;
          }
      }
  
      /**
       * Whether to remove integer checks. Default false.
       * @param  flag  on/off flag
       */
      public void setRemoveIntChecks(boolean flag) {
          removeIntChecks = flag;
      }
  
      /**
       * Get the flag for removing integer checks.
       * @return    true if flag is turned on
       */
      public boolean getRemoveIntChecks() {
          return removeIntChecks;
      }
  
      /**
       * Form the option string for removeIntChecks.
       * @return The parameter string.
       */
      public String getRemoveIntChecksParameter() {
          return "/removeintchecks" + (removeIntChecks ? "+" : "-");
      }
  
      /**
       * Whether to require explicit declaration of variables.
       * @param  flag  on/off flag
       */
      public void setOptionExplicit(boolean flag) {
          optionExplicit = flag;
      }
  
      /**
       * Get the flag for whether to require explicit declaration of variables.
       [EMAIL PROTECTED]    true if flag is turned on
       */
      public boolean getOptionExplicit() {
          return optionExplicit;
      }
  
      /**
       * Form the option string for optionExplicit..
       * @return The parameter string.
       */
      public String getOptionExplicitParameter() {
          return "/optionexplicit" + (optionExplicit ? "+" : "-");
      }
  
      /**
       * Enforce strict language semantics.
       * @param  flag  on/off flag
       */
      public void setOptionStrict(boolean flag) {
          optionStrict = flag;
      }
  
      /**
       * Get the flag for whether to enforce strict language semantics.
       * @return    true if flag is turned on
       */
      public boolean getOptionStrict() {
          return optionStrict;
      }
  
      /**
       * Forn the option string for optionStrict.
       * @return The parameter string.
       */
      public String getOptionStrictParameter() {
          return "/optionstrict" + (optionStrict ? "+" : "-");
      }
  
  
      /**
       * Specifies the root namespace for all type declarations.
       * @param  a root namespace.
       */
      public void setRootNamespace(String rootNamespace) {
          this.rootNamespace = rootNamespace;
      }
  
  
      /**
       * Get the root namespace.
       * @return  the root namespace.
       */
      public String getRootNamespace() {
          return this.rootNamespace;
      }
  
  
      /**
       * Form the option string for rootNamespace.
       * @return  the root namespace option string.
       */
      protected String getRootNamespaceParameter() {
          if (rootNamespace != null && rootNamespace.length() != 0) {
              return "/rootnamespace:" + rootNamespace;
          } else {
              return null;
          }
      }
  
  
      /**
       * Declare global imports for namespaces in referenced metadata files.
       * @param imports the imports string
       */
      public void setImports(String imports) {
          this.imports = imports;
      }
  
  
      /**
       * Get global imports for namespaces in referenced metadata files.
       * @return  the imports string.
       */
      public String getImports() {
          return this.imports;
      }
  
  
      /**
       * Format the option for imports.
       * @return  the formatted import option.
       */
      protected String getImportsParameter() {
          if (imports != null && imports.length() != 0) {
              return "/imports:" + imports;
          } else {
              return null;
          }
      }
  
  
      /**
       * Specify binary- or text-style string comparisons. Defaults
       * to "binary"
       * @param optionCompare the option compare style. "text" | "binary".
       */
      public void setOptionCompare(String optionCompare) {
          if ("text".equalsIgnoreCase(optionCompare)) {
              this.optionCompare = "text";
          } else {
              this.optionCompare = "binary";
          }
      }
  
  
      /**
       * "binary" or "text" for the string-comparison style.
       * @return  the option compare style.
       */
      public String getOptionCompare() {
          return this.optionCompare;
      }
  
      /**
       * Format the option for string comparison style.
       * @return  The formatted option.
       */
      protected String getOptionCompareParameter() {
          if (optionCompare != null && "text".equalsIgnoreCase(optionCompare)) {
              return "/optioncompare:text";
          } else {
              return "/optioncompare:binary";
          }
      }
  
      /**
       * implement VBC commands
       * @param command
       */
      protected void addCompilerSpecificOptions(NetCommand command) {
          command.addArgument(getRemoveIntChecksParameter());
          command.addArgument(getImportsParameter());
          command.addArgument(getOptionExplicitParameter());
          command.addArgument(getOptionStrictParameter());
          command.addArgument(getRootNamespaceParameter());
          command.addArgument(getOptionCompareParameter());
      }
  
      /**
       * Get the delimiter that the compiler uses between references.
       * For example, c# will return ";"; VB.NET will return ","
       * @return The string delimiter for the reference string.
       */
      public String getReferenceDelimiter() {
          return ",";
      }
  
  
  
      /**
       * Get the extension of filenames to compile.
       * @return The string extension of files to compile.
       */
      public String getFileExtension() {
          return "vb";
      }
  
      /**
       * Get the name of the compiler executable.
       * @return The name of the compiler executable.
       */
      public String getCompilerExeName() {
          return "vbc";
      }
  
      /**
       * validation code
       * @throws  BuildException  if validation failed
       */
      protected void validate()
              throws BuildException {
          super.validate();
          if(getDestFile()==null) {
              throw new BuildException("DestFile was not specified");
          }
      }
  }
  
  
  

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

Reply via email to