From aee27aee2a0e1f6617ec03fe8c36c64978acf014 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 22 Mar 2013 19:00:35 +0400 Subject: [PATCH] Topologically sort fields according to constructor dependencies --- .../jet/di/InjectionLogicGenerator.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/injector-generator/src/org/jetbrains/jet/di/InjectionLogicGenerator.java b/injector-generator/src/org/jetbrains/jet/di/InjectionLogicGenerator.java index dfd4dd1088d..9f69717f936 100644 --- a/injector-generator/src/org/jetbrains/jet/di/InjectionLogicGenerator.java +++ b/injector-generator/src/org/jetbrains/jet/di/InjectionLogicGenerator.java @@ -17,10 +17,12 @@ package org.jetbrains.jet.di; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.utils.DFS; import org.jetbrains.jet.utils.Printer; import java.lang.reflect.Method; import java.util.Collection; +import java.util.Collections; import java.util.List; public abstract class InjectionLogicGenerator { @@ -68,8 +70,22 @@ public abstract class InjectionLogicGenerator { } protected void generate(@NotNull Printer p, @NotNull Collection fields) { + List topOrder = DFS.topologicalOrder(fields, new DFS.Neighbors() { + @NotNull + @Override + public Iterable getNeighbors(Field current) { + Expression initialization = current.getInitialization(); + if (initialization instanceof ConstructorCall) { + ConstructorCall call = (ConstructorCall) initialization; + return call.getConstructorArguments(); + } + return Collections.emptyList(); + } + }); + Collections.reverse(topOrder); + // Initialize fields - for (Field field : fields) { + for (Field field : topOrder) { //if (!backsParameter.contains(field) || field.isPublic()) { p.println(prefixForInitialization(field), field.getName(), " = ", field.getInitialization().renderAsCode(), ";"); //}