indent open, indent close fixed

This commit is contained in:
Honfika
2013-09-03 11:18:18 +02:00
parent 09af85aaef
commit d017a6c8fc
22 changed files with 90 additions and 22 deletions

View File

@@ -1375,7 +1375,7 @@ public class AVM2Code implements Serializable {
list.remove(lastPos);
}
s = Graph.graphToString(list, hilighted, constants, localRegNames, fullyQualifiedNames);
s = Graph.graphToString(list, hilighted, true, constants, localRegNames, fullyQualifiedNames);
return s;
}

View File

@@ -43,6 +43,12 @@ public class NewObjectAVM2Item extends AVM2Item {
if (pairs.size() < 2) {
return hilight("{", highlight) + params + hilight("}", highlight);
}
return "\r\n" + Graph.INDENTOPEN + "\r\n" + hilight("{", highlight) + "\r\n" + params + "\r\n" + hilight("}", highlight) + "\r\n" + Graph.INDENTCLOSE + "\r\n";
String ret = "\r\n" + Graph.INDENTOPEN + "\r\n";
ret += hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
ret += params + "\r\n";
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight) + "\r\n" + Graph.INDENTCLOSE + "\r\n";
return ret;
}
}

View File

@@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.abc.avm2.model;
import com.jpexs.decompiler.flash.abc.avm2.ConstantPool;
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphTargetItem;
import java.util.ArrayList;
import java.util.HashMap;
@@ -44,10 +45,12 @@ public class WithAVM2Item extends AVM2Item {
public String toString(boolean highlight, ConstantPool constants, HashMap<Integer, String> localRegNames, List<String> fullyQualifiedNames) {
String ret;
ret = hilight("with(", highlight) + scope.toString(highlight, constants, localRegNames, fullyQualifiedNames) + hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
/*for (GraphTargetItem ti : items) {
ret += ti.toString(constants, localRegNames, fullyQualifiedNames) + "\r\n";
}
ret += hilight("}", highlight);*/
}*/
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight);
return ret;
}

View File

@@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.abc.avm2.model.InAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.SetTypeAVM2Item;
import com.jpexs.decompiler.graph.Block;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.Loop;
@@ -71,11 +72,13 @@ public class ForEachInAVM2Item extends LoopItem implements Block {
String ret = "";
ret += hilight("loop" + loop.id + ":", highlight) + "\r\n";
ret += hilight("for each (", highlight) + expression.toString(highlight, localData) + hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : commands) {
if (!ti.isEmpty()) {
ret += ti.toStringSemicoloned(highlight, localData) + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight) + "\r\n";
ret += hilight(":loop" + loop.id, highlight);
return ret;

View File

@@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.abc.avm2.model.InAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.SetTypeAVM2Item;
import com.jpexs.decompiler.graph.Block;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.Loop;
@@ -71,11 +72,13 @@ public class ForInAVM2Item extends LoopItem implements Block {
String ret = "";
ret += hilight("loop" + loop.id + ":", highlight) + "\r\n";
ret += hilight("for (", highlight) + expression.toString(highlight, localData) + hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : commands) {
if (!ti.isEmpty()) {
ret += ti.toStringSemicoloned(highlight, localData) + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight) + "\r\n";
ret += hilight(":loop" + loop.id, highlight);
return ret;

View File

@@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.abc.avm2.ConstantPool;
import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item;
import com.jpexs.decompiler.flash.abc.types.ABCException;
import com.jpexs.decompiler.graph.Block;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.model.ContinueItem;
import com.jpexs.helpers.Helper;
@@ -55,29 +56,35 @@ public class TryAVM2Item extends AVM2Item implements Block {
public String toString(boolean highlight, ConstantPool constants, HashMap<Integer, String> localRegNames, List<String> fullyQualifiedNames) {
String ret = "";
ret += hilight("try", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : tryCommands) {
if (!ti.isEmpty()) {
ret += ti.toStringSemicoloned(highlight, Helper.toList(constants, localRegNames, fullyQualifiedNames)) + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight);
for (int e = 0; e < catchExceptions.size(); e++) {
ret += "\r\n" + hilight("catch(" + catchExceptions.get(e).getVarName(constants, fullyQualifiedNames) + ":" + catchExceptions.get(e).getTypeName(constants, fullyQualifiedNames) + ")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
List<GraphTargetItem> commands = catchCommands.get(e);
for (GraphTargetItem ti : commands) {
if (!ti.isEmpty()) {
ret += ti.toStringSemicoloned(highlight, Helper.toList(constants, localRegNames, fullyQualifiedNames)) + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight);
}
if (finallyCommands.size() > 0) {
ret += "\r\n" + hilight("finally", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : finallyCommands) {
if (!ti.isEmpty()) {
ret += ti.toStringSemicoloned(highlight, Helper.toList(constants, localRegNames, fullyQualifiedNames)) + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight);
}
return ret;

View File

@@ -725,7 +725,7 @@ public class Action implements GraphSourceItem {
List<GraphTargetItem> tree = actionsToTree(new HashMap<Integer, String>(), new HashMap<String, GraphTargetItem>(), new HashMap<String, GraphTargetItem>(), actions, version, staticOperation, path);
return Graph.graphToString(tree, highlight);
return Graph.graphToString(tree, highlight, true);
}
}, timeout, TimeUnit.SECONDS);
} catch (TimeoutException ex) {

View File

@@ -91,7 +91,11 @@ public class FunctionActionItem extends ActionItem {
}
ret += hilight(pname, highlight);
}
ret += hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n" + Graph.graphToString(actions, highlight, constants) + hilight("}", highlight);
ret += hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
ret += Graph.graphToString(actions, highlight, false, constants);
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight);
return ret;
}

View File

@@ -29,6 +29,7 @@ import com.jpexs.decompiler.flash.action.swf4.RegisterNumber;
import com.jpexs.decompiler.flash.helpers.Highlighting;
import com.jpexs.decompiler.flash.helpers.collections.MyEntry;
import com.jpexs.decompiler.graph.Block;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
@@ -173,6 +174,7 @@ public class ClassActionItem extends ActionItem implements Block {
}
}
ret += "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
if (constructor != null) {
ret += constructor.toString(highlight, constants) + "\r\n";
@@ -196,6 +198,7 @@ public class ClassActionItem extends ActionItem implements Block {
ret += hilight("static ", highlight) + f.toString(highlight, constants) + "\r\n";
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight) + "\r\n";
return ret;
}

View File

@@ -32,6 +32,7 @@ import com.jpexs.decompiler.flash.action.swf5.ActionStoreRegister;
import com.jpexs.decompiler.flash.action.swf6.ActionEnumerate2;
import com.jpexs.decompiler.flash.ecma.Null;
import com.jpexs.decompiler.graph.Block;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.Loop;
@@ -66,9 +67,11 @@ public class ForInActionItem extends LoopActionItem implements Block {
String ret = "";
ret += hilight("loop" + loop.id + ":", highlight) + "\r\n";
ret += hilight("for(", highlight) + ((variableName instanceof DirectValueActionItem) && (((DirectValueActionItem) variableName).value instanceof RegisterNumber) ? "var " : "") + stripQuotes(variableName, constants, highlight) + " in " + enumVariable.toString(highlight, constants) + ")\r\n{\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : commands) {
ret += ti.toStringSemicoloned(highlight, constants) + "\r\n";
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight) + "\r\n";
ret += hilight(":loop" + loop.id, highlight);
return ret;

View File

@@ -45,7 +45,12 @@ public class IfFrameLoadedActionItem extends ActionItem implements Block {
@Override
public String toString(boolean highlight, ConstantPool constants) {
return hilight("ifFrameLoaded(", highlight) + frame.toString(highlight, constants) + hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n" + Graph.graphToString(actions, highlight, constants) + "}";
String ret = hilight("ifFrameLoaded(", highlight) + frame.toString(highlight, constants) + hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
ret += Graph.graphToString(actions, highlight, false, constants);
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight);
return ret;
}
@Override

View File

@@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.action.model.ActionItem;
import com.jpexs.decompiler.flash.action.model.ConstantPool;
import com.jpexs.decompiler.flash.action.swf3.ActionSetTarget;
import com.jpexs.decompiler.flash.action.swf4.ActionSetTarget2;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
@@ -40,9 +41,11 @@ public class TellTargetActionItem extends ActionItem {
@Override
public String toString(boolean highlight, ConstantPool constants) {
String ret = hilight("tellTarget(", highlight) + target.toString(highlight, constants) + hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : commands) {
ret += ti.toString(highlight, constants) + "\r\n";
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight);
return ret;
}

View File

@@ -24,6 +24,7 @@ import com.jpexs.decompiler.flash.action.parser.script.ActionSourceGenerator;
import com.jpexs.decompiler.flash.action.swf4.ActionJump;
import com.jpexs.decompiler.flash.action.swf7.ActionTry;
import com.jpexs.decompiler.graph.Block;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
@@ -59,6 +60,7 @@ public class TryActionItem extends ActionItem implements Block {
public String toString(boolean highlight, ConstantPool constants) {
String ret = "";
ret += hilight("try", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
List<Object> localData = new ArrayList<>();
localData.add(constants);
for (GraphTargetItem ti : tryCommands) {
@@ -66,24 +68,29 @@ public class TryActionItem extends ActionItem implements Block {
ret += ti.toStringSemicoloned(highlight, localData) + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight);
for (int e = 0; e < catchExceptions.size(); e++) {
ret += "\r\n" + hilight("catch(", highlight) + catchExceptions.get(e).toStringNoQuotes(highlight, localData) + hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
List<GraphTargetItem> commands = catchCommands.get(e);
for (GraphTargetItem ti : commands) {
if (!ti.isEmpty()) {
ret += ti.toStringSemicoloned(highlight, localData) + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight);
}
if (finallyCommands.size() > 0) {
ret += "\r\n" + hilight("finally", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : finallyCommands) {
if (!ti.isEmpty()) {
ret += ti.toStringSemicoloned(highlight, localData) + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight);
}
return ret;

View File

@@ -21,6 +21,7 @@ import com.jpexs.decompiler.flash.action.Action;
import com.jpexs.decompiler.flash.action.model.ActionItem;
import com.jpexs.decompiler.flash.action.model.ConstantPool;
import com.jpexs.decompiler.flash.action.swf5.ActionWith;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
@@ -50,9 +51,11 @@ public class WithActionItem extends ActionItem {
List<Object> localData = new ArrayList<>();
localData.add(constants);
ret = hilight("with(", highlight) + scope.toString(highlight, localData) + hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : items) {
ret += ti.toString(highlight, localData) + "\r\n";
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight);
return ret;
}

View File

@@ -2155,7 +2155,7 @@ public class Graph {
* @param localData
* @return String
*/
public static String graphToString(List<GraphTargetItem> tree, boolean highlight, Object... localData) {
public static String graphToString(List<GraphTargetItem> tree, boolean highlight, boolean replaceIndents, Object... localData) {
StringBuilder ret = new StringBuilder();
List<Object> localDataList = Arrays.asList(localData);
for (GraphTargetItem ti : tree) {
@@ -2228,23 +2228,20 @@ public class Graph {
continue;
}
strippedP = Highlighting.stripHilights(parts[p]).trim();
if (strippedP.equals(INDENTOPEN)) {
level++;
continue;
}
if (strippedP.equals(INDENTCLOSE)) {
level--;
continue;
}
if (strippedP.startsWith("}")) {
level--;
if (replaceIndents) {
if (strippedP.equals(INDENTOPEN)) {
level++;
continue;
}
if (strippedP.equals(INDENTCLOSE)) {
level--;
continue;
}
}
ret.append(tabString(level));
ret.append(parts[p].trim());
ret.append("\r\n");
if (strippedP.equals("{")) {
level++;
}
}
return ret.toString();
}

View File

@@ -37,7 +37,9 @@ public class BlockItem extends GraphTargetItem {
@Override
public String toString(boolean highlight, List<Object> localData) {
return hilight("{", highlight) + "\r\n" + Graph.graphToString(commands, highlight, localData) + "\r\n" + hilight("}", highlight);
return hilight("{", highlight) + "\r\n" + Graph.INDENTOPEN + "\r\n" +
Graph.graphToString(commands, highlight, false, localData) + "\r\n" +
Graph.INDENTCLOSE + "\r\n" + hilight("}", highlight);
}
@Override

View File

@@ -17,6 +17,7 @@
package com.jpexs.decompiler.graph.model;
import com.jpexs.decompiler.graph.Block;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.Loop;
@@ -52,6 +53,7 @@ public class DoWhileItem extends LoopItem implements Block {
String ret = "";
ret += hilight("loop" + loop.id + ":", highlight) + "\r\n";
ret += hilight("do", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : commands) {
if (!ti.isEmpty()) {
ret += ti.toStringSemicoloned(highlight, localData) + "\r\n";
@@ -67,6 +69,7 @@ public class DoWhileItem extends LoopItem implements Block {
}
expStr += expression.get(i).toString(highlight, localData);
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight) + "\r\n" + hilight("while(", highlight) + expStr + hilight(");", highlight) + "\r\n";
ret += hilight(":loop" + loop.id, highlight);

View File

@@ -17,6 +17,7 @@
package com.jpexs.decompiler.graph.model;
import com.jpexs.decompiler.graph.Block;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.Loop;
@@ -87,11 +88,13 @@ public class ForItem extends LoopItem implements Block {
p++;
}
ret += hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : commands) {
if (!ti.isEmpty()) {
ret += ti.toStringSemicoloned(highlight, localData) + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight) + "\r\n";
ret += ":loop" + loop.id;
return ret;

View File

@@ -17,6 +17,7 @@
package com.jpexs.decompiler.graph.model;
import com.jpexs.decompiler.graph.Block;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
@@ -71,19 +72,23 @@ public class IfItem extends GraphTargetItem implements Block {
}
}
ret = hilight("if(", highlight) + expr.toString(highlight, localData) + hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : ifBranch) {
if (!ti.isEmpty()) {
ret += ti.toStringSemicoloned(highlight, localData) + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight);
if (elseBranch.size() > 0) {
ret += "\r\n" + hilight("else", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : elseBranch) {
if (!ti.isEmpty()) {
ret += ti.toStringSemicoloned(highlight, localData) + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight);
}
return ret;

View File

@@ -55,6 +55,7 @@ public class SwitchItem extends LoopItem implements Block {
String ret = "";
ret += hilight("loopswitch" + loop.id + ":", highlight) + "\r\n";
ret += hilight("switch(", highlight) + switchedObject.toString(highlight, localData) + hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (int i = 0; i < caseCommands.size(); i++) {
for (int k = 0; k < valuesMapping.size(); k++) {
if (valuesMapping.get(k) == i) {
@@ -81,6 +82,7 @@ public class SwitchItem extends LoopItem implements Block {
ret += Graph.INDENTCLOSE + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight) + "\r\n";
ret += ":loop" + loop.id;
return ret;

View File

@@ -17,6 +17,7 @@
package com.jpexs.decompiler.graph.model;
import com.jpexs.decompiler.graph.Block;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.Loop;
@@ -41,11 +42,13 @@ public class UniversalLoopItem extends LoopItem implements Block {
ret += hilight("loop" + loop.id + ":", highlight) + "\r\n";
ret += hilight("while(true)", highlight);
ret += "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : commands) {
if (!ti.isEmpty()) {
ret += ti.toStringSemicoloned(highlight, localData) + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight) + "\r\n";
ret += hilight(":loop" + loop.id, highlight);
return ret;

View File

@@ -17,6 +17,7 @@
package com.jpexs.decompiler.graph.model;
import com.jpexs.decompiler.graph.Block;
import com.jpexs.decompiler.graph.Graph;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.Loop;
@@ -57,11 +58,13 @@ public class WhileItem extends LoopItem implements Block {
expStr += expression.get(i).toString(highlight, localData);
}
ret += hilight("while(", highlight) + expStr + hilight(")", highlight) + "\r\n" + hilight("{", highlight) + "\r\n";
ret += Graph.INDENTOPEN + "\r\n";
for (GraphTargetItem ti : commands) {
if (!ti.isEmpty()) {
ret += ti.toStringSemicoloned(highlight, localData) + "\r\n";
}
}
ret += Graph.INDENTCLOSE + "\r\n";
ret += hilight("}", highlight) + "\r\n";
ret += hilight(":loop" + loop.id, highlight);
return ret;