diff --git a/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java b/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java index 467932f1860..f1550d32bea 100644 --- a/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java +++ b/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java @@ -26,9 +26,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.utils.Printer; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.PrintStream; import java.lang.reflect.Method; import java.util.*; @@ -36,8 +34,6 @@ import static org.jetbrains.jet.di.InjectorGeneratorUtil.var; public class DependencyInjectorGenerator { - public static final String INDENT_STEP = " "; - private final Set fields = Sets.newLinkedHashSet(); private final Set parameters = Sets.newLinkedHashSet(); private final Set backsParameter = Sets.newHashSet(); @@ -72,57 +68,51 @@ public class DependencyInjectorGenerator { } } - FileOutputStream fileOutputStream = new FileOutputStream(tmpfile); - System.out.println("File opened: " + tmpfile.getAbsolutePath()); + StringBuilder out = new StringBuilder(); + Printer p = new Printer(out); + fields.addAll(dependencies.satisfyDependencies()); + String copyright = "injector-generator/copyright.txt"; + p.println(FileUtil.loadFile(new File(copyright))); - PrintStream out = new PrintStream(fileOutputStream); - try { - fields.addAll(dependencies.satisfyDependencies()); + p.println("package " + injectorPackageName + ";"); + p.println(); - String copyright = "injector-generator/copyright.txt"; - out.println(FileUtil.loadFile(new File(copyright))); + generateImports(p, injectorPackageName); + p.println(); - out.println("package " + injectorPackageName + ";"); - out.println(); - - generateImports(out, injectorPackageName); - out.println(); - - out.println("/* This file is generated by " + generatorClass.getName() + ". DO NOT EDIT! */"); - out.print("public class " + injectorClassName); - generateImplementsList(out); - out.println(" {"); - out.println(); - generateFields(out); - out.println(); - generateConstructor(injectorClassName, out); - out.println(); - generateDestroy(injectorClassName, out); - out.println(); - generateGetters(out); - if (!factoryMethods.isEmpty()) { - out.println(); - generateFactoryMethods(out); - } - out.println("}"); // class - - fileOutputStream.close(); - - if (useTmpfile) { - if (!tmpfile.renameTo(file)) { - throw new RuntimeException("failed to rename " + tmpfile + " to " + file); - } - System.out.println("Renamed " + tmpfile + " to " + file); - } + p.println("/* This file is generated by " + generatorClass.getName() + ". DO NOT EDIT! */"); + p.print("public class " + injectorClassName); + generateImplementsList(p); + p.println(" {"); + p.pushIndent(); + p.println(); + generateFields(p); + p.println(); + generateConstructor(injectorClassName, p); + p.println(); + generateDestroy(injectorClassName, p); + p.println(); + generateGetters(p); + if (!factoryMethods.isEmpty()) { + p.println(); + generateFactoryMethods(p); } - finally { - fileOutputStream.close(); - System.out.println("File closed"); + p.popIndent(); + p.println("}"); // class + + FileUtil.writeToFile(tmpfile, out.toString()); + System.out.println("File written: " + tmpfile.getAbsolutePath()); + if (useTmpfile) { + if (!tmpfile.renameTo(file)) { + throw new RuntimeException("failed to rename " + tmpfile + " to " + file); + } + System.out.println("Renamed " + tmpfile + " to " + file); } + System.out.println(); } - private void generateImplementsList(PrintStream out) { + private void generateImplementsList(Printer out) { if (!implementsList.isEmpty()) { out.print(" implements "); for (Iterator> iterator = implementsList.iterator(); iterator.hasNext(); ) { @@ -234,7 +224,7 @@ public class DependencyInjectorGenerator { factoryMethods.add(new FactoryMethod("create" + type(returnType), returnType, parameters)); } - private void generateImports(PrintStream out, String injectorPackageName) { + private void generateImports(Printer out, String injectorPackageName) { for (Class importedClass : importManager.getImportedClasses()) { if (importedClass.isPrimitive()) continue; String importedPackageName = importedClass.getPackage().getName(); @@ -246,17 +236,14 @@ public class DependencyInjectorGenerator { } } - private void generateFields(PrintStream out) { + private void generateFields(Printer out) { for (Field field : fields) { String _final = backsParameter.contains(field) ? "final " : ""; - out.println(" private " + _final + type(InjectorGeneratorUtil.getEffectiveFieldType(field)) + " " + field.getName() + ";"); + out.println("private " + _final + type(InjectorGeneratorUtil.getEffectiveFieldType(field)) + " " + field.getName() + ";"); } } - private void generateConstructor(String injectorClassName, PrintStream out) { - Printer p = new Printer(out); - p.pushIndent(); - + private void generateConstructor(String injectorClassName, Printer p) { // Constructor parameters if (parameters.isEmpty()) { p.println("public ", injectorClassName, "() {"); @@ -288,43 +275,47 @@ public class DependencyInjectorGenerator { p.println("}"); } - private void generateDestroy(@NotNull String injectorClassName, @NotNull PrintStream out) { - out.println(" @PreDestroy"); - out.println(" public void destroy() {"); + private void generateDestroy(@NotNull String injectorClassName, @NotNull Printer out) { + out.println("@PreDestroy"); + out.println("public void destroy() {"); + out.pushIndent(); for (Field field : fields) { // TODO: type of field may be different from type of object List preDestroyMethods = InjectorGeneratorUtil .getPreDestroyMethods(InjectorGeneratorUtil.getEffectiveFieldType(field).getClazz()); for (Method preDestroy : preDestroyMethods) { - out.println(" " + field.getName() + "." + preDestroy.getName() + "();"); + out.println(field.getName() + "." + preDestroy.getName() + "();"); } if (preDestroyMethods.size() > 0) { out.println(); } } - out.println(" }"); + out.popIndent(); + out.println("}"); } - private void generateGetters(PrintStream out) { - String indent0 = " "; - String indent1 = indent0 + INDENT_STEP; + private void generateGetters(Printer out) { for (Field field : fields) { if (!field.isPublic()) continue; String visibility = field.isPublic() ? "public" : "private"; - out.println(indent0 + visibility + " " + type(field.getType()) + " " + field.getGetterName() + "() {"); + out.println(visibility + " " + type(field.getType()) + " " + field.getGetterName() + "() {"); + out.pushIndent(); - out.println(indent1 + "return this." + field.getName() + ";"); - out.println(indent0 + "}"); + out.println("return this." + field.getName() + ";"); + + out.popIndent(); + out.println("}"); out.println(); } + } - private void generateFactoryMethods(PrintStream out) { - Printer p = new Printer(out); + private void generateFactoryMethods(Printer p) { p.pushIndent(); for (FactoryMethod method : factoryMethods) { generateFactoryMethod(p, method); } + p.popIndent(); } private void generateFactoryMethod(Printer p, FactoryMethod method) {