diff options
Diffstat (limited to 'sources/scalac/CompilerCommand.java')
-rw-r--r-- | sources/scalac/CompilerCommand.java | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/sources/scalac/CompilerCommand.java b/sources/scalac/CompilerCommand.java new file mode 100644 index 0000000000..743187e81f --- /dev/null +++ b/sources/scalac/CompilerCommand.java @@ -0,0 +1,221 @@ +/* ____ ____ ____ ____ ______ *\ +** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala ** +** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL ** +** /_____/\____/\___/\____/____/ ** +\* */ + +// $Id$ + +package scalac; + +import java.util.List; +import java.util.ArrayList; + +import scalac.util.ClassPath; +import scalac.util.Reporter; +import scalac.util.CommandParser; +import scalac.util.ArgumentParser; +import scalac.util.OptionParser; +import scalac.util.BooleanOptionParser; +import scalac.util.StringOptionParser; +import scalac.util.ChoiceOptionParser; +import scalac.util.HelpOptionParser; +import scalac.util.VersionOptionParser; +//import scalac.util.OptimizeOptionParser; +import scalac.util.PhaseSetOptionParser; +import scalac.util.PrintOptionParser; +import scalac.util.UnknownOptionParser; +import scalac.util.ScalaFileArgumentParser; +import scalac.util.UnknownArgumentParser; +import scalac.util.Strings; + +public class CompilerCommand extends CommandParser { + + public final PhaseRepository phases; + + public final BooleanOptionParser nowarn; + public final BooleanOptionParser verbose; + public final BooleanOptionParser debug; + public final BooleanOptionParser uniqid; + public final BooleanOptionParser types; + public final BooleanOptionParser prompt; + //public final OptimizeOptionParser optimize; + public final StringOptionParser classpath; + public final StringOptionParser sourcepath; + public final StringOptionParser bootclasspath; + public final StringOptionParser extdirs; + public final StringOptionParser outpath; + public final ChoiceOptionParser target; + public final BooleanOptionParser noimports; + public final StringOptionParser jaco; + public final PhaseSetOptionParser skip; + public final PhaseSetOptionParser check; + public final PrintOptionParser print; + public final ChoiceOptionParser printer; + public final StringOptionParser printfile; + public final PhaseSetOptionParser graph; + public final PhaseSetOptionParser stop; + public final PhaseSetOptionParser log; + public final VersionOptionParser version; + public final HelpOptionParser help; + public final UnknownOptionParser unknown_options; + public final ScalaFileArgumentParser files; + public final UnknownArgumentParser unknown_arguments; + + public CompilerCommand(String product, String version, + Reporter reporter, PhaseRepository phases) + { + this(product, version, "<source files>", reporter, phases); + } + + protected CompilerCommand(String product, String version, String syntax, + Reporter reporter, PhaseRepository phases) + { + super(product, version, syntax, reporter); + this.phases = phases; + + ArgumentParser[] parsers = new ArgumentParser[] { + + this.nowarn = new BooleanOptionParser(this, + "nowarn", "Generate no warnings", + false), + + this.verbose = new BooleanOptionParser(this, + "verbose", "Output messages about what the compiler is doing", + false), + + this.debug = new BooleanOptionParser(this, + "debug", "Output debugging messages", + false), + + this.uniqid = new BooleanOptionParser(this, + "uniqid", "Print identifiers with unique names (debugging option)", + false), + + this.types = new BooleanOptionParser(this, + "types", "Print tree types (debugging option)", + false), + + this.prompt = new BooleanOptionParser(this, + "prompt", "Display a prompt after each error (debugging option)", + false), + + //this.optimize = new OptimizeOptionParser(this, + // "optimize", "optimize bytecode (-optimize:help for option list)", + // null /* todo: uncomment: phases.OPTIMIZE */), + + this.classpath = new StringOptionParser(this, + "classpath", "Specify where to find user class files", + "path", ClassPath.CLASS_PATH), + + this.sourcepath = new StringOptionParser(this, + "sourcepath", "Specify where to find input source files", + "path", ClassPath.SOURCE_PATH), + + this.bootclasspath = new StringOptionParser(this, + "bootclasspath", "Override location of bootstrap class files", + "path", ClassPath.BOOT_PATH), + + this.extdirs = new StringOptionParser(this, + "extdirs", "Override location of installed extensions", + "dirs", ClassPath.EXTENSION_PATH), + + this.outpath = new StringOptionParser(this, + "d", "Specify where to place generated class files", + "directory", "."), + + this.target = new ChoiceOptionParser(this, + "target", "Specify which bakend to use", + "target", Global.TARGETS, Global.TARGET_JVM), + + this.noimports = new BooleanOptionParser(this, + "noimports", "Compile without any implicit imports", + false), + + this.jaco = new StringOptionParser(this, + "jaco", "Pass argument to jaco backend (debugging option)", + "argument", null), + + this.skip = new PhaseSetOptionParser(this, + "skip", "Skip <phases> (see below)", + phases.phases, PhaseDescriptor.SKIP), + + this.check = new PhaseSetOptionParser(this, + "check", "Check the tree after <phases> (see below)", + phases.phases, PhaseDescriptor.CHECK), + + this.print = new PrintOptionParser(this, + "print", "Print out program after <phases> (see below)", + phases.phases, PhaseDescriptor.PRINT), + + this.printer = new ChoiceOptionParser(this, + "printer", "Printer to use", + "printer", Global.PRINTERS, Global.PRINTER_TEXT), + + this.printfile = new StringOptionParser(this, + "print-file", "Specify file in which to print trees", + "file", "-"), + + this.graph = new PhaseSetOptionParser(this, + "graph", "Graph the program after <phases> (see below)", + phases.phases, PhaseDescriptor.GRAPH), + + this.stop = new PhaseSetOptionParser(this, + "stop", "Stop after first phase in <phases> (see below)", + phases.phases, PhaseDescriptor.STOP), + + this.log = new PhaseSetOptionParser(this, + "log", "Log operations in <phases> (see below)", + phases.phases, PhaseDescriptor.LOG), + + this.version = new VersionOptionParser(this, + "version", "Print product version and exit", + product() + " " + version() + " -- (c) 2002 LAMP/EPFL"), + + this.help = new HelpOptionParser(this, + "help", "Print a synopsis of standard options"), + + this.unknown_options = new UnknownOptionParser(this), + + this.files = new ScalaFileArgumentParser(this), + + this.unknown_arguments = new UnknownArgumentParser(this), + + }; + + for (int i = 0; i < parsers.length; i++) add(parsers[i]); + } + + public boolean parse(String[] args) { + boolean result = super.parse(args); + reporter().nowarn = nowarn.value; + reporter().verbose = verbose.value; + reporter().prompt = prompt.value; + return result; + } + + public String getHelpMessage() { + StringBuffer buffer = new StringBuffer(super.getHelpMessage()); + buffer.append(Strings.EOL); + buffer.append("and possible compilation phases include:"); + buffer.append(Strings.EOL); + List lines = new ArrayList(phases.phases.length); + for (int i = 0; i < phases.phases.length; i++) { + PhaseDescriptor phase = phases.phases[i]; + lines.add(" " + phase.name() + "\t " + phase.description()); + } + lines.add(" " + "all" + "\t " + "matches all phases"); + buffer.append(Strings.format(lines)); + return buffer.toString(); + } + + public ClassPath classpath() { + return new ClassPath(classpath.value, sourcepath.value, + bootclasspath.value, extdirs.value); + } + + public String outpath() { + return outpath.value + (outpath.value.endsWith("/") ? "" : "/"); + } + +} |