private void fillFileWithClojureCompilerParams()

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();
  }