Constructor body generation extracted as a method (+ migrated to Printer for convenience)
This commit is contained in:
@@ -16,15 +16,13 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.di;
|
package org.jetbrains.jet.di;
|
||||||
|
|
||||||
import com.google.common.collect.HashMultimap;
|
import com.google.common.collect.*;
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.google.common.collect.Multimap;
|
|
||||||
import com.google.common.collect.Sets;
|
|
||||||
import com.intellij.openapi.util.SystemInfo;
|
import com.intellij.openapi.util.SystemInfo;
|
||||||
import com.intellij.openapi.util.io.FileUtil;
|
import com.intellij.openapi.util.io.FileUtil;
|
||||||
import com.intellij.openapi.util.text.StringUtil;
|
import com.intellij.openapi.util.text.StringUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.utils.Printer;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import javax.annotation.PreDestroy;
|
import javax.annotation.PreDestroy;
|
||||||
@@ -281,70 +279,80 @@ public class DependencyInjectorGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void generateConstructor(String injectorClassName, PrintStream out) {
|
private void generateConstructor(String injectorClassName, PrintStream out) {
|
||||||
String indent = " ";
|
Printer p = new Printer(out);
|
||||||
|
p.pushIndent();
|
||||||
|
|
||||||
// Constructor parameters
|
// Constructor parameters
|
||||||
if (parameters.isEmpty()) {
|
if (parameters.isEmpty()) {
|
||||||
out.println(" public " + injectorClassName + "() {");
|
p.println("public ", injectorClassName, "() {");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
out.println(" public " + injectorClassName + "(");
|
p.println("public ", injectorClassName, "(");
|
||||||
|
p.pushIndent();
|
||||||
for (Iterator<Parameter> iterator = parameters.iterator(); iterator.hasNext(); ) {
|
for (Iterator<Parameter> iterator = parameters.iterator(); iterator.hasNext(); ) {
|
||||||
Parameter parameter = iterator.next();
|
Parameter parameter = iterator.next();
|
||||||
out.print(indent);
|
p.print(); // indent
|
||||||
if (parameter.isRequired()) {
|
if (parameter.isRequired()) {
|
||||||
out.print("@NotNull ");
|
p.printWithNoIndent("@NotNull ");
|
||||||
}
|
}
|
||||||
out.print(parameter.getType().getSimpleName() + " " + parameter.getName());
|
p.printWithNoIndent(parameter.getType().getSimpleName(), " ", parameter.getName());
|
||||||
if (iterator.hasNext()) {
|
if (iterator.hasNext()) {
|
||||||
out.println(",");
|
p.printlnWithNoIndent(",");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out.println();
|
p.printlnWithNoIndent();
|
||||||
out.println(" ) {");
|
p.popIndent();
|
||||||
|
p.println(") {");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p.pushIndent();
|
||||||
if (lazy) {
|
if (lazy) {
|
||||||
// Remember parameters
|
// Remember parameters
|
||||||
for (Parameter parameter : parameters) {
|
for (Parameter parameter : parameters) {
|
||||||
out.println(indent + "this." + parameter.getField().getName() + " = " + parameter.getName() + ";");
|
p.println("this.", parameter.getField().getName(), " = ", parameter.getName(), ";");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Initialize fields
|
generateInitializingCode(p, fields);
|
||||||
for (Field field : fields) {
|
}
|
||||||
//if (!backsParameter.contains(field) || field.isPublic()) {
|
|
||||||
String prefix = "this.";
|
|
||||||
out.println(indent + prefix + field.getName() + " = " + field.getInitialization().renderAsCode() + ";");
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
out.println();
|
|
||||||
|
|
||||||
// Call setters
|
p.popIndent();
|
||||||
for (Field field : fields) {
|
p.println("}");
|
||||||
for (SetterDependency dependency : field.getDependencies()) {
|
}
|
||||||
String prefix = field.isPublic() ? "this." : "";
|
|
||||||
out.println(indent + prefix + dependency.getDependent().getName() + "." + dependency.getSetterName() + "(" + dependency.getDependency().getName() + ");");
|
|
||||||
}
|
|
||||||
if (!field.getDependencies().isEmpty()) {
|
|
||||||
out.println();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// call @PostConstruct
|
private static void generateInitializingCode(@NotNull Printer p, @NotNull Collection<Field> fields) {
|
||||||
for (Field field : fields) {
|
// Initialize fields
|
||||||
// TODO: type of field may be different from type of object
|
for (Field field : fields) {
|
||||||
List<Method> postConstructMethods = getPostConstructMethods(getEffectiveFieldType(field).getClazz());
|
//if (!backsParameter.contains(field) || field.isPublic()) {
|
||||||
for (Method postConstruct : postConstructMethods) {
|
p.println("this.", field.getName(), " = ", field.getInitialization().renderAsCode(), ";");
|
||||||
out.println(indent + field.getName() + "." + postConstruct.getName() + "();");
|
//}
|
||||||
}
|
}
|
||||||
if (postConstructMethods.size() > 0) {
|
p.printlnWithNoIndent();
|
||||||
out.println();
|
|
||||||
}
|
// Call setters
|
||||||
|
for (Field field : fields) {
|
||||||
|
for (SetterDependency dependency : field.getDependencies()) {
|
||||||
|
String prefix = field.isPublic() ? "this." : "";
|
||||||
|
String dependencyName = dependency.getDependency().getName();
|
||||||
|
String dependentName = dependency.getDependent().getName();
|
||||||
|
p.println(prefix, dependentName, ".", dependency.getSetterName(), "(", dependencyName, ");");
|
||||||
|
}
|
||||||
|
if (!field.getDependencies().isEmpty()) {
|
||||||
|
p.printlnWithNoIndent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out.println(" }");
|
// call @PostConstruct
|
||||||
|
for (Field field : fields) {
|
||||||
|
// TODO: type of field may be different from type of object
|
||||||
|
List<Method> postConstructMethods = getPostConstructMethods(getEffectiveFieldType(field).getClazz());
|
||||||
|
for (Method postConstruct : postConstructMethods) {
|
||||||
|
p.println(field.getName(), ".", postConstruct.getName(), "();");
|
||||||
|
}
|
||||||
|
if (postConstructMethods.size() > 0) {
|
||||||
|
p.printlnWithNoIndent();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<Method> getPostConstructMethods(Class<?> clazz) {
|
private static List<Method> getPostConstructMethods(Class<?> clazz) {
|
||||||
|
|||||||
Reference in New Issue
Block a user