package net.jangaroo.jooc.backend;
import net.jangaroo.jooc.Jooc;
import net.jangaroo.jooc.JsWriter;
import net.jangaroo.jooc.ast.CompilationUnit;
import net.jangaroo.jooc.ast.IdeDeclaration;
import net.jangaroo.jooc.ast.PackageDeclaration;
import net.jangaroo.jooc.config.JoocOptions;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/**
* Compilation unit sink factory writing all generated classes to one file.
*/
public class MergedOutputCompilationUnitSinkFactory extends AbstractCompilationUnitSinkFactory {
private File outputFile;
private CompilationUnitSink sink;
public MergedOutputCompilationUnitSinkFactory(JoocOptions options, final File outputFile) {
super(options, outputFile.getAbsoluteFile().getParentFile());
this.outputFile = outputFile;
createOutputDirs(outputFile);
if (outputFile.exists()) {
if(!outputFile.delete()) {
throw Jooc.error("error deleting file: '" + outputFile.getAbsolutePath() + "'", outputFile);
}
}
sink = new CompilationUnitSink() {
public File writeOutput(CompilationUnit compilationUnit) {
try {
JsWriter out = new JsWriter(new OutputStreamWriter(new FileOutputStream(outputFile, true), "UTF-8"));
try {
try {
out.setOptions(getOptions());
compilationUnit.visit(new JsCodeGenerator(out));
} finally {
out.close();
}
} catch (IOException e) {
//noinspection ResultOfMethodCallIgnored
outputFile.delete(); // NOSONAR
throw Jooc.error("error writing file: '" + outputFile.getAbsolutePath() + "'", outputFile, e);
}
} catch (IOException e) {
throw Jooc.error("cannot open output file for writing: '" + outputFile.getAbsolutePath() + "'", outputFile, e);
}
return outputFile;
}
};
}
public CompilationUnitSink createSink(PackageDeclaration packageDeclaration,
IdeDeclaration primaryDeclaration, File sourceFile,
final boolean verbose) {
if (verbose) {
System.out.println("writing " + primaryDeclaration.getName() + " to file: '" + outputFile.getAbsolutePath() + "'"); // NOSONAR this is a cmd line tool
}
return sink;
}
}