Improved for continue / goto detection

This commit is contained in:
Jindra Petřík
2021-01-17 21:52:33 +01:00
parent 90a4d56b88
commit f5d4403a83
8 changed files with 376 additions and 150 deletions

View File

@@ -12,22 +12,28 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library.
* License along with this library.
*/
package com.jpexs.decompiler.graph.model;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.graph.Block;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.TypeItem;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author JPEXS
*/
*/
public class GotoItem extends GraphTargetItem implements Block {
public String labelName;
public List<GraphTargetItem> targetCommands = null;
public GotoItem(GraphSourceItem src, GraphSourceItem lineStartIns, String labelName) {
super(src, lineStartIns, PRECEDENCE_PRIMARY);
this.labelName = labelName;
@@ -35,10 +41,35 @@ public class GotoItem extends GraphTargetItem {
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
if (targetCommands != null) {
if (labelName != null) {
writer.append(labelName);
writer.append(":");
writer.newLine();
}
appendCommands(value, writer, localData, targetCommands, false);
} else {
writer.append("§§goto(").append(labelName).append(")");
}
return writer;
}
@Override
public boolean needsSemicolon() {
if (targetCommands != null) {
return false;
}
return super.needsSemicolon();
}
@Override
public boolean needsNewLine() {
if (targetCommands != null) {
return false;
}
return super.needsNewLine();
}
@Override
public boolean hasReturnValue() {
return false;
@@ -53,4 +84,27 @@ public class GotoItem extends GraphTargetItem {
public Object getResult() {
return null;
}
@Override
public List<ContinueItem> getContinues() {
List<ContinueItem> ret = new ArrayList<>();
if (targetCommands == null) {
return ret;
}
for (GraphTargetItem c : targetCommands) {
if (c instanceof ContinueItem) {
ret.add((ContinueItem) c);
}
}
return ret;
}
@Override
public List<List<GraphTargetItem>> getSubs() {
List<List<GraphTargetItem>> ret = new ArrayList<>();
if (targetCommands != null) {
ret.add(targetCommands);
}
return ret;
}
}