package driver; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import util.FileUtils; import files.RootedSourcePath; /** * caxap's entry point. Processes command line options and store them in * {@link Config}. Finds all source files, the uses {@link DependencyResolver} * to order them in compilation order. Uses {@link CompilationDriver} to compile * the files. */ public class EntryPoint { /****************************************************************************/ public static void main(String[] args) { new EntryPoint().run(args); } /***************************************************************************** * Macro source files. */ List<RootedSourcePath> macroPaths = new ArrayList<>(); /***************************************************************************** * Non-macro source files. */ List<RootedSourcePath> sourcePaths = new ArrayList<>(); /****************************************************************************/ public void run(String[] args) { int i = 0; while (i < args.length) { i = processCommandLineParameter(args, i); } setDefaults(); getPaths(); List<SourceFile> orderedFiles = DependencyResolver.resolve(macroPaths, sourcePaths); CompilationDriver.drive(orderedFiles); } /****************************************************************************/ void getPaths() { try { for (Path root : Config.get().roots) { for (Path p : FileUtils.glob(root, "**.javam")) { macroPaths.add(new RootedSourcePath(root, p, false)); } for (Path p : FileUtils.glob(root, "**.java")) { sourcePaths.add(new RootedSourcePath(root, p, false)); } } } catch (IOException e) { throw new Error("Error while obtaining list of macro files.", e); } } /***************************************************************************** * Processes the command line parameter at index i, then returns the index * of the next argument to process. */ int processCommandLineParameter(final String[] args, final int i) { switch(args[i]) { case "-charset": if (i+1 < args.length) { Config.get().charset = Charset.forName(args[i+1]); return i + 2; } break; case "-source": if (i+1 < args.length) { Config.get().roots.add(Paths.get(args[i + 1])); return i + 2; } break; case "-binary": if (i+1 < args.length) { Config.get().targetDir = Paths.get(args[i + 1]); return i + 2; } break; case "-output": if (i+1 < args.length) { Config.get().generatedSrcDir = Paths.get(args[i + 1]); return i + 2; } break; case "-cache": if (i+1 < args.length) { Config.get().cache = Boolean.valueOf(args[i+1]); return i + 2; } break; case "-dump": if (i+1 < args.length) { Config.get().dumpMacroSource = Boolean.valueOf(args[i+1]); return i + 2; } break; default: System.out.println("Ignoring unknown option: \"" + args[i] + "\""); return i + 1; } System.out.println("Expected an argument to option: \"" + args[i] + "\""); return i + 1; } /****************************************************************************/ public void setDefaults() { Config cfg = Config.get(); if (cfg.roots.isEmpty()) { cfg.roots.add(Paths.get("src")); } if (cfg.targetDir == null) { cfg.targetDir = Paths.get("target/classes"); } if (cfg.generatedSrcDir == null) { cfg.generatedSrcDir = Paths.get("generated"); } } }