in jps-plugin/src/org/jetbrains/jps/clojure/build/ClojureBuilder.java [211:277]
private void fillFileWithClojureCompilerParams(List<File> toCompile, HashMap<File, String> toCompileNamespace,
File fileWithCompileScript, File outputDir) throws FileNotFoundException {
PrintStream printer = new PrintStream(new FileOutputStream(fileWithCompileScript));
printer.print("(import (java.io File))\n" +
"(import (java.util HashSet))\n");
//print output path
printer.print("(binding [*compile-path* ");
String outputDirPath = outputDir.getAbsolutePath().replace("\\", "\\\\");
printer.print("\"" + outputDirPath + "\" *compile-files* true]\n");
for (File file : toCompile) {
//collecting current outputs in output directory
printer.print(
"(def outputDir \"" + outputDirPath + "\")\n" +
"(def output (new HashSet))\n" +
"(def outputFile (new File outputDir))\n" +
"(defn scanOutput [#^HashSet out #^File file]\n" +
" (if (.isDirectory file)\n" +
" (doseq [i (.listFiles file)] (scanOutput out i))\n" +
" (.add out (.getAbsolutePath file))))\n" +
"\n" +
"(scanOutput output outputFile)\n");
printer.print("(try ");
String absolutePath = file.getAbsolutePath().replace("\\", "\\\\");
printer.print("(. *err* println ");
printer.print("\"" + COMPILING_PREFIX + absolutePath + "\"");
printer.print(")\n");
printer.print("(load-file \"");
printer.print(absolutePath);
printer.print("\")\n");
printer.print("(catch Exception e (. *err* println (str \"" + ERROR_PREFIX + absolutePath +
"@@" + "\" (let [msg (.getMessage e)] msg) ) ) )");
printer.print(")\n");
//we need to compile namespace init class, otherwise we will get CNFE on Runtime
String namespace = toCompileNamespace.get(file);
if (namespace != null) {
printer.print("(try ");
printer.print("(compile \'");
printer.print(namespace);
printer.print(")\n");
printer.print("(catch Exception e ())"); //all compile error should be found in file compilation
printer.print(")\n");
}
//let's print information about all new created files in output directory
printer.print("(defn printNewFiles [#^File file]\n" +
" (if (.isDirectory file)\n" +
" (doseq [i (.listFiles file)] (printNewFiles i))\n" +
" (if (not (.contains output (.getAbsolutePath file))) (. *err* println " +
"(.concat \"" + WRITING_PREFIX + "\" (.getAbsolutePath file))))))\n" +
"(printNewFiles outputFile)\n" +
"(.clear output)");
printer.print("(. *err* println ");
printer.print("\"" + COMPILED_PREFIX + absolutePath + "\"");
printer.print(")\n");
}
printer.print(")");
printer.close();
}