Migrated to Printer

This commit is contained in:
Andrey Breslav
2013-03-05 20:23:43 +04:00
parent ac981915a1
commit 47d1ea2770
@@ -26,9 +26,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.utils.Printer; import org.jetbrains.jet.utils.Printer;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.PrintStream;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.*; import java.util.*;
@@ -36,8 +34,6 @@ import static org.jetbrains.jet.di.InjectorGeneratorUtil.var;
public class DependencyInjectorGenerator { public class DependencyInjectorGenerator {
public static final String INDENT_STEP = " ";
private final Set<Field> fields = Sets.newLinkedHashSet(); private final Set<Field> fields = Sets.newLinkedHashSet();
private final Set<Parameter> parameters = Sets.newLinkedHashSet(); private final Set<Parameter> parameters = Sets.newLinkedHashSet();
private final Set<Field> backsParameter = Sets.newHashSet(); private final Set<Field> backsParameter = Sets.newHashSet();
@@ -72,57 +68,51 @@ public class DependencyInjectorGenerator {
} }
} }
FileOutputStream fileOutputStream = new FileOutputStream(tmpfile); StringBuilder out = new StringBuilder();
System.out.println("File opened: " + tmpfile.getAbsolutePath()); 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); p.println("package " + injectorPackageName + ";");
try { p.println();
fields.addAll(dependencies.satisfyDependencies());
String copyright = "injector-generator/copyright.txt"; generateImports(p, injectorPackageName);
out.println(FileUtil.loadFile(new File(copyright))); p.println();
out.println("package " + injectorPackageName + ";"); p.println("/* This file is generated by " + generatorClass.getName() + ". DO NOT EDIT! */");
out.println(); p.print("public class " + injectorClassName);
generateImplementsList(p);
generateImports(out, injectorPackageName); p.println(" {");
out.println(); p.pushIndent();
p.println();
out.println("/* This file is generated by " + generatorClass.getName() + ". DO NOT EDIT! */"); generateFields(p);
out.print("public class " + injectorClassName); p.println();
generateImplementsList(out); generateConstructor(injectorClassName, p);
out.println(" {"); p.println();
out.println(); generateDestroy(injectorClassName, p);
generateFields(out); p.println();
out.println(); generateGetters(p);
generateConstructor(injectorClassName, out); if (!factoryMethods.isEmpty()) {
out.println(); p.println();
generateDestroy(injectorClassName, out); generateFactoryMethods(p);
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);
}
} }
finally { p.popIndent();
fileOutputStream.close(); p.println("}"); // class
System.out.println("File closed");
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()) { if (!implementsList.isEmpty()) {
out.print(" implements "); out.print(" implements ");
for (Iterator<Class<?>> iterator = implementsList.iterator(); iterator.hasNext(); ) { for (Iterator<Class<?>> iterator = implementsList.iterator(); iterator.hasNext(); ) {
@@ -234,7 +224,7 @@ public class DependencyInjectorGenerator {
factoryMethods.add(new FactoryMethod("create" + type(returnType), returnType, parameters)); 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()) { for (Class<?> importedClass : importManager.getImportedClasses()) {
if (importedClass.isPrimitive()) continue; if (importedClass.isPrimitive()) continue;
String importedPackageName = importedClass.getPackage().getName(); 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) { for (Field field : fields) {
String _final = backsParameter.contains(field) ? "final " : ""; 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) { private void generateConstructor(String injectorClassName, Printer p) {
Printer p = new Printer(out);
p.pushIndent();
// Constructor parameters // Constructor parameters
if (parameters.isEmpty()) { if (parameters.isEmpty()) {
p.println("public ", injectorClassName, "() {"); p.println("public ", injectorClassName, "() {");
@@ -288,43 +275,47 @@ public class DependencyInjectorGenerator {
p.println("}"); p.println("}");
} }
private void generateDestroy(@NotNull String injectorClassName, @NotNull PrintStream out) { private void generateDestroy(@NotNull String injectorClassName, @NotNull Printer out) {
out.println(" @PreDestroy"); out.println("@PreDestroy");
out.println(" public void destroy() {"); out.println("public void destroy() {");
out.pushIndent();
for (Field field : fields) { for (Field field : fields) {
// TODO: type of field may be different from type of object // TODO: type of field may be different from type of object
List<Method> preDestroyMethods = InjectorGeneratorUtil List<Method> preDestroyMethods = InjectorGeneratorUtil
.getPreDestroyMethods(InjectorGeneratorUtil.getEffectiveFieldType(field).getClazz()); .getPreDestroyMethods(InjectorGeneratorUtil.getEffectiveFieldType(field).getClazz());
for (Method preDestroy : preDestroyMethods) { for (Method preDestroy : preDestroyMethods) {
out.println(" " + field.getName() + "." + preDestroy.getName() + "();"); out.println(field.getName() + "." + preDestroy.getName() + "();");
} }
if (preDestroyMethods.size() > 0) { if (preDestroyMethods.size() > 0) {
out.println(); out.println();
} }
} }
out.println(" }"); out.popIndent();
out.println("}");
} }
private void generateGetters(PrintStream out) { private void generateGetters(Printer out) {
String indent0 = " ";
String indent1 = indent0 + INDENT_STEP;
for (Field field : fields) { for (Field field : fields) {
if (!field.isPublic()) continue; if (!field.isPublic()) continue;
String visibility = field.isPublic() ? "public" : "private"; 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("return this." + field.getName() + ";");
out.println(indent0 + "}");
out.popIndent();
out.println("}");
out.println(); out.println();
} }
} }
private void generateFactoryMethods(PrintStream out) { private void generateFactoryMethods(Printer p) {
Printer p = new Printer(out);
p.pushIndent(); p.pushIndent();
for (FactoryMethod method : factoryMethods) { for (FactoryMethod method : factoryMethods) {
generateFactoryMethod(p, method); generateFactoryMethod(p, method);
} }
p.popIndent();
} }
private void generateFactoryMethod(Printer p, FactoryMethod method) { private void generateFactoryMethod(Printer p, FactoryMethod method) {