OptimizationDumper теперь использует PrintVisitor

This commit is contained in:
Victor 2016-07-30 15:39:47 +03:00
parent 33991e3db8
commit f2d96ef895

View File

@ -10,6 +10,7 @@ import com.annimon.ownlang.parser.optimization.DeadCodeElimination;
import com.annimon.ownlang.parser.optimization.ExpressionSimplification; import com.annimon.ownlang.parser.optimization.ExpressionSimplification;
import com.annimon.ownlang.parser.optimization.InstructionCombining; import com.annimon.ownlang.parser.optimization.InstructionCombining;
import com.annimon.ownlang.parser.optimization.Optimizable; import com.annimon.ownlang.parser.optimization.Optimizable;
import com.annimon.ownlang.parser.visitors.PrintVisitor;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
@ -45,19 +46,19 @@ public final class OptimizationDumper {
int optimizationPasses = 1; int optimizationPasses = 1;
int lastBatchModificationCount; int lastBatchModificationCount;
int batchModificationCount = 0; int batchModificationCount = 0;
result.put("Source", node.toString()); result.put("Source", nodeToString(node));
do { do {
lastBatchModificationCount = batchModificationCount; lastBatchModificationCount = batchModificationCount;
batchModificationCount = 0; batchModificationCount = 0;
for (Optimizable optimization : OPTIMIZATIONS) { for (Optimizable optimization : OPTIMIZATIONS) {
final String lastSource = node.toString(); final String lastSource = nodeToString(node);
node = optimization.optimize(node); node = optimization.optimize(node);
final String currentSource = node.toString(); final String currentSource = nodeToString(node);
if (!lastSource.equals(currentSource)) { if (!lastSource.equals(currentSource)) {
final String optName = String.format("%s, %d pass", final String optName = String.format("%s, %d pass",
optimization.getClass().getSimpleName(), optimization.getClass().getSimpleName(),
optimizationPasses); optimizationPasses);
result.put(optName, node.toString()); result.put(optName, nodeToString(node));
} }
batchModificationCount += optimization.optimizationsCount(); batchModificationCount += optimization.optimizationsCount();
} }
@ -66,6 +67,11 @@ public final class OptimizationDumper {
return result; return result;
} }
private static String nodeToString(Node n) {
// return n.toString();
return n.accept(new PrintVisitor(), new StringBuilder()).toString();
}
private static void writeStepsToFile(Map<String, String> optimizationSteps) throws IOException { private static void writeStepsToFile(Map<String, String> optimizationSteps) throws IOException {
Arrays.stream(WORK_DIR.listFiles((d, name) -> name.endsWith(".txt"))) Arrays.stream(WORK_DIR.listFiles((d, name) -> name.endsWith(".txt")))
.forEach(File::delete); .forEach(File::delete);
@ -84,12 +90,14 @@ public final class OptimizationDumper {
private static void writeSummary(final Map<String, String> optimizationSteps) throws IOException { private static void writeSummary(final Map<String, String> optimizationSteps) throws IOException {
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
sb.append("[pr]");
for (Map.Entry<String, String> entry : optimizationSteps.entrySet()) { for (Map.Entry<String, String> entry : optimizationSteps.entrySet()) {
sb.append(entry.getKey()); sb.append(entry.getKey());
sb.append("\n\n"); sb.append("\n[code own]");
sb.append(entry.getValue()); sb.append(entry.getValue());
sb.append("\n\n-----------\n\n"); sb.append("[/code][sl]\n");
} }
sb.append("[/pr]");
writeContent(new File(WORK_DIR, "summary.txt"), writeContent(new File(WORK_DIR, "summary.txt"),
writer -> writer.write(sb.toString())); writer -> writer.write(sb.toString()));
} }