diff --git a/src/CFGBuilder.java b/src/CFGBuilder.java index 4f5027f..ca4edf7 100644 --- a/src/CFGBuilder.java +++ b/src/CFGBuilder.java @@ -40,52 +40,13 @@ public class CFGBuilder { ControlFlowGraph cfg = cfgs.get(0); - extractLineNumbers(cfg, tree); - System.out.println("CFG built: " + cfg.nodes().size() + " nodes, " + cfg.edges().size() + " edges"); return cfg; } - private void extractLineNumbers(ControlFlowGraph cfg, ParseTree tree) { - Map labelToLine = new HashMap<>(); - collectLineNumbers(tree, labelToLine); - - for (Node node : cfg.nodes()) { - String label = node.label(); - Integer line = labelToLine.get(label); - - if (line == null) { - for (Map.Entry entry : labelToLine.entrySet()) { - if (label.contains(entry.getKey()) || entry.getKey().contains(label)) { - line = entry.getValue(); - break; - } - } - } - - nodeToLine.put(node, line != null ? line : -1); - } - } - - private void collectLineNumbers(ParseTree tree, Map map) { - if (tree instanceof ParserRuleContext) { - ParserRuleContext ctx = (ParserRuleContext) tree; - if (ctx.start != null) { - String text = ctx.getText(); - if (text != null && text.length() < 200 && text.length() > 0) { - map.put(text, ctx.start.getLine()); - } - } - } - - for (int i = 0; i < tree.getChildCount(); i++) { - collectLineNumbers(tree.getChild(i), map); - } - } - public int getLineNumber(Node node) { - return nodeToLine.getOrDefault(node, -1); + return node.getLineNumber(); } public List getAllLineNumbers() { diff --git a/src/org/lsmr/cfg/Node.java b/src/org/lsmr/cfg/Node.java index 859f5b3..3a71f4f 100644 --- a/src/org/lsmr/cfg/Node.java +++ b/src/org/lsmr/cfg/Node.java @@ -16,13 +16,23 @@ public class Node { private Set outEdges = new HashSet<>(); private String label; + private int lineNumber; + Node(String label) { - if(label == null || label.length() < 1) + if (label == null || label.length() < 1) throw new IllegalArgumentException(); this.label = label; } + public void setLineNumber(int lineNumber) { + this.lineNumber = lineNumber; + } + + public int getLineNumber() { + return this.lineNumber; + } + /** * Accesses the label for this node. * @@ -63,20 +73,21 @@ public class Node { * Adds the indicated edge to this node as an in-edge. * * @param edge - * The edge to be added as an in-edge + * The edge to be added as an in-edge * @throws IllegalArgumentException - * If the edge is null. + * If the edge is null. * @throws IllegalStateException - * If the target node of the edge is not identical to this node. + * If the target node of the edge is not + * identical to this node. */ public void addInEdge(Edge edge) { - if(edge == null) + if (edge == null) throw new IllegalArgumentException(); - if(edge.target() != this) + if (edge.target() != this) throw new IllegalStateException(); - if(edge.source().graph() == null || edge.target().graph() == null) + if (edge.source().graph() == null || edge.target().graph() == null) throw new IllegalStateException(); inEdges.add(edge); @@ -86,31 +97,31 @@ public class Node { * Adds the indicated edge to this node as an out-edge. * * @param edge - * The edge to be added as an out-edge + * The edge to be added as an out-edge * @throws IllegalArgumentException - * If the edge is null. + * If the edge is null. * @throws IllegalStateException - * If the source node of the edge is not identical to this node. + * If the source node of the edge is not + * identical to this node. */ public void addOutEdge(Edge edge) { - if(edge == null) + if (edge == null) throw new IllegalArgumentException(); - if(edge.source() != this) + if (edge.source() != this) throw new IllegalStateException(); - if(edge.source().graph() == null || (edge.target() != null && edge.target().graph() == null)) + if (edge.source().graph() == null || (edge.target() != null && edge.target().graph() == null)) throw new IllegalStateException(); outEdges.add(edge); } void setGraph(ControlFlowGraph graph) { - if(this.graph != null) { - if(graph == null) + if (this.graph != null) { + if (graph == null) this.graph = null; - } - else if(graph == null) + } else if (graph == null) throw new IllegalArgumentException(); else this.graph = graph; @@ -123,8 +134,8 @@ public class Node { @Override public boolean equals(Object obj) { - if(obj instanceof Node) { - Node other = (Node)obj; + if (obj instanceof Node) { + Node other = (Node) obj; return label.equals(other.label); } @@ -142,8 +153,8 @@ public class Node { boolean start = true; - for(Edge edge : inEdges) { - if(start) + for (Edge edge : inEdges) { + if (start) start = false; else sb.append(", "); @@ -155,8 +166,8 @@ public class Node { start = true; - for(Edge edge : outEdges) { - if(start) + for (Edge edge : outEdges) { + if (start) start = false; else sb.append(", "); diff --git a/src/org/lsmr/cfg/NodeBuilder.java b/src/org/lsmr/cfg/NodeBuilder.java index 76127da..f7fcf26 100644 --- a/src/org/lsmr/cfg/NodeBuilder.java +++ b/src/org/lsmr/cfg/NodeBuilder.java @@ -132,8 +132,8 @@ public class NodeBuilder implements Java1_4ParserVisitor { private String getCurrentName() { StringBuilder sb = new StringBuilder(); - for(String name : nameStack) { - if(sb.length() == 0) + for (String name : nameStack) { + if (sb.length() == 0) sb.append(name); else { sb.append('.'); @@ -164,7 +164,7 @@ public class NodeBuilder implements Java1_4ParserVisitor { int childCount = arg0.getChildCount(); WorkingGraph result = null; - for(int i = 0; i < childCount; i++) + for (int i = 0; i < childCount; i++) result = visit(arg0.getChild(i)); return result; @@ -344,11 +344,13 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": block"); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); List statements = ctx.blockStatement(); - for(int i = 0, size = statements.size(); i < size; i++) + for (int i = 0, size = statements.size(); i < size; i++) s.connect(visitBlockStatement(statements.get(i))); return s; @@ -360,11 +362,13 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": block"); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); List statements = ctx.blockStatement(); - for(int i = 0, size = statements.size(); i < size; i++) { + for (int i = 0, size = statements.size(); i < size; i++) { WorkingGraph bs = visitBlockStatement(statements.get(i)); bs.edges.add(g.buildEdge(bs.node, null, EdgeLabel.THROWN)); @@ -380,18 +384,20 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": block"); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); - if(delayedThrown) + if (delayedThrown) s.edges.add(g.buildEdge(s.node, null, EdgeLabel.THROWN_DELAYED)); List statements = ctx.blockStatement(); - for(int i = 0, size = statements.size(); i < size; i++) { + for (int i = 0, size = statements.size(); i < size; i++) { WorkingGraph bs = visitBlockStatement(statements.get(i)); - if(delayedThrown) - if(i == size - 1) + if (delayedThrown) + if (i == size - 1) bs.edges.add(g.buildEdge(bs.node, null, EdgeLabel.THROWN)); else bs.edges.add(g.buildEdge(bs.node, null, EdgeLabel.THROWN_DELAYED)); @@ -410,11 +416,11 @@ public class NodeBuilder implements Java1_4ParserVisitor { ControlFlowGraph getGraph(RuleContext ctx) { RuleContext current = ctx; - while(current != null && !(current instanceof MemberDeclarationContext) - && !(current instanceof ClassBodyDeclarationContext) && !(current instanceof InterfaceBodyContext)) + while (current != null && !(current instanceof MemberDeclarationContext) + && !(current instanceof ClassBodyDeclarationContext) && !(current instanceof InterfaceBodyContext)) current = current.getParent(); - if(current != null) + if (current != null) return graphMap.get(current); return null; @@ -427,7 +433,8 @@ public class NodeBuilder implements Java1_4ParserVisitor { s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); - + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); return s; } @@ -452,16 +459,18 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); IdentifierContext ic = ctx.identifier(); String label = ""; - if(ic != null) + if (ic != null) label = ic.getText().intern(); List list = s.breakEdges.get(label); - if(list == null) { + if (list == null) { list = new ArrayList<>(); s.breakEdges.put(label, list); } @@ -477,16 +486,18 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); IdentifierContext ic = ctx.identifier(); String label = ""; - if(ic != null) + if (ic != null) label = ic.getText(); List list = s.continueEdges.get(label); - if(list == null) { + if (list == null) { list = new ArrayList<>(); s.continueEdges.put(label, list); } @@ -502,18 +513,20 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": do"); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); WorkingGraph doBody = visitStatement(ctx.statement()); g.buildEdge(s.node, doBody.node, EdgeLabel.BLANK); Node whileExpression = g - .buildNode(nodeCounter++ + ": while " + ctx.parenthesizedExpression().accept(new TreePrinter()) + "; "); + .buildNode(nodeCounter++ + ": while " + ctx.parenthesizedExpression().accept(new TreePrinter()) + "; "); g.buildEdge(whileExpression, s.node, EdgeLabel.TRUE); - for(Edge edge : doBody.edges) { - if(edge.label() == EdgeLabel.THROWN) + for (Edge edge : doBody.edges) { + if (edge.label() == EdgeLabel.THROWN) s.edges.add(edge); else edge.target = whileExpression; @@ -523,15 +536,15 @@ public class NodeBuilder implements Java1_4ParserVisitor { List nonLabelledBreakEdges = doBody.breakEdges.get(""); - if(nonLabelledBreakEdges != null) { + if (nonLabelledBreakEdges != null) { s.edges.addAll(nonLabelledBreakEdges); s.breakEdges.remove(""); } List nonLabelledContinueEdges = doBody.continueEdges.get(""); - if(nonLabelledContinueEdges != null) { - for(Edge edge : nonLabelledContinueEdges) { + if (nonLabelledContinueEdges != null) { + for (Edge edge : nonLabelledContinueEdges) { edge.setTarget(whileExpression); s.edges.add(edge); } @@ -550,6 +563,8 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": if " + ctx.parenthesizedExpression().accept(new TreePrinter())); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); WorkingGraph trueNode = visitStatement(ctx.statement()); @@ -558,13 +573,12 @@ public class NodeBuilder implements Java1_4ParserVisitor { ElseClauseContext elseClause = ctx.elseClause(); - if(elseClause != null) { + if (elseClause != null) { WorkingGraph elseNode = visitElseClause(elseClause); s.edges.add(g.buildEdge(s.node, elseNode.node, EdgeLabel.FALSE)); s.connect(elseNode); - } - else + } else s.edges.add(g.buildEdge(s.node, null, EdgeLabel.FALSE)); return s; @@ -577,18 +591,18 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = visitStatement(sc); List breakEdges = s.breakEdges.get(label); - if(breakEdges != null) { + if (breakEdges != null) { s.breakEdges.remove(label); s.edges.addAll(breakEdges); } List continueEdges = s.continueEdges.get(label); - if(continueEdges != null) { + if (continueEdges != null) { s.continueEdges.remove(label); - if(sc.forStatement() != null || sc.whileStatement() != null || sc.doStatement() != null) - for(Edge continueEdge : continueEdges) + if (sc.forStatement() != null || sc.whileStatement() != null || sc.doStatement() != null) + for (Edge continueEdge : continueEdges) continueEdge.setTarget(s.node); } @@ -606,36 +620,38 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": try"); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); WorkingGraph tryBody = visitTryBlock(tryBlock); s.connect(tryBody); - for(CatchClauseContext catch_ : catchClauses) { + for (CatchClauseContext catch_ : catchClauses) { WorkingGraph catchClause = visitCatchClause(catch_); - for(Edge edge : s.edges) { - if(edge.label() == EdgeLabel.THROWN && edge.target() == null) + for (Edge edge : s.edges) { + if (edge.label() == EdgeLabel.THROWN && edge.target() == null) edge.setTarget(catchClause.node); } s.edges.addAll(catchClause.edges); } - if(finallyClause != null) { + if (finallyClause != null) { boolean delayedThrown = false; - for(Edge edge : s.edges) - if(edge.label() == EdgeLabel.THROWN && edge.target() == null) { + for (Edge edge : s.edges) + if (edge.label() == EdgeLabel.THROWN && edge.target() == null) { delayedThrown = true; break; } WorkingGraph finallyBody = visitFinallyClause(finallyClause, delayedThrown); - for(Edge edge : s.edges) - if(edge.target() == null) + for (Edge edge : s.edges) + if (edge.target() == null) edge.setTarget(finallyBody.node); s.edges.addAll(finallyBody.edges); @@ -658,11 +674,13 @@ public class NodeBuilder implements Java1_4ParserVisitor { sb.append(forInit == null ? "; " : forInit.accept(new TreePrinter()) + "; "); sb.append(expression == null ? "; " : expression.accept(new TreePrinter()) + "; "); - if(forUpdate != null) + if (forUpdate != null) sb.append(forUpdate.accept(new TreePrinter())); sb.append(")"); s.node = g.buildNode(sb.toString()); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); WorkingGraph forBody = visitStatement(ctx.statement()); @@ -670,8 +688,8 @@ public class NodeBuilder implements Java1_4ParserVisitor { s.edges.add(g.buildEdge(s.node, forBody.node, EdgeLabel.TRUE)); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.FALSE)); - for(Edge edge : forBody.edges) { - if(edge.target() == null && edge.label() != EdgeLabel.THROWN) + for (Edge edge : forBody.edges) { + if (edge.target() == null && edge.label() != EdgeLabel.THROWN) edge.setTarget(s.node); } // s.edges.addAll(forBody.edges); @@ -680,15 +698,15 @@ public class NodeBuilder implements Java1_4ParserVisitor { List nonLabelledBreakEdges = forBody.breakEdges.get(""); - if(nonLabelledBreakEdges != null) { + if (nonLabelledBreakEdges != null) { s.edges.addAll(nonLabelledBreakEdges); s.breakEdges.remove(""); } List nonLabelledContinueEdges = forBody.continueEdges.get(""); - if(nonLabelledContinueEdges != null) { - for(Edge edge : nonLabelledContinueEdges) { + if (nonLabelledContinueEdges != null) { + for (Edge edge : nonLabelledContinueEdges) { edge.setTarget(s.node); s.edges.add(edge); } @@ -706,6 +724,8 @@ public class NodeBuilder implements Java1_4ParserVisitor { ParenthesizedExpressionContext condition = ctx.parenthesizedExpression(); s.node = g.buildNode(nodeCounter++ + ": while " + condition.accept(new TreePrinter())); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); WorkingGraph whileBody = visitStatement(ctx.statement()); @@ -713,8 +733,8 @@ public class NodeBuilder implements Java1_4ParserVisitor { g.buildEdge(s.node, whileBody.node, EdgeLabel.TRUE); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.FALSE)); - for(Edge edge : whileBody.edges) { - if(edge.label() == EdgeLabel.THROWN) + for (Edge edge : whileBody.edges) { + if (edge.label() == EdgeLabel.THROWN) s.edges.add(edge); else edge.target = s.node; @@ -724,15 +744,15 @@ public class NodeBuilder implements Java1_4ParserVisitor { List nonLabelledBreakEdges = whileBody.breakEdges.get(""); - if(nonLabelledBreakEdges != null) { + if (nonLabelledBreakEdges != null) { s.edges.addAll(nonLabelledBreakEdges); s.breakEdges.remove(""); } List nonLabelledContinueEdges = whileBody.continueEdges.get(""); - if(nonLabelledContinueEdges != null) { - for(Edge edge : nonLabelledContinueEdges) { + if (nonLabelledContinueEdges != null) { + for (Edge edge : nonLabelledContinueEdges) { edge.setTarget(s.node); s.edges.add(edge); } @@ -750,25 +770,27 @@ public class NodeBuilder implements Java1_4ParserVisitor { List statementGroups = ctx.switchBlockStatementGroup(); s.node = g.buildNode(nodeCounter++ + ": switch " + ctx.parenthesizedExpression().accept(new TreePrinter())); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); - if(!statementGroups.isEmpty()) - for(SwitchBlockStatementGroupContext group : statementGroups) { + if (!statementGroups.isEmpty()) + for (SwitchBlockStatementGroupContext group : statementGroups) { List labels = group.switchLabel(); List statements = group.blockStatement(); WorkingGraph first = visitBlockStatement(statements.get(0)); TreePrinter printer = new TreePrinter(); - for(SwitchLabelContext label : labels) + for (SwitchLabelContext label : labels) s.edges.add(g.buildEdge(s.node, first.node, EdgeLabel.CASE, label.accept(printer))); - for(int i = 1, size = statements.size(); i < size; i++) { + for (int i = 1, size = statements.size(); i < size; i++) { WorkingGraph later = visitBlockStatement(statements.get(i)); - for(List list : later.breakEdges.values()) + for (List list : later.breakEdges.values()) first.edges.addAll(list); - later.breakEdges.clear(); + later.breakEdges.clear(); first.connect(later); } @@ -779,7 +801,7 @@ public class NodeBuilder implements Java1_4ParserVisitor { List extraLabels = ctx.switchLabel(); - for(SwitchLabelContext label : extraLabels) + for (SwitchLabelContext label : extraLabels) s.edges.add(g.buildEdge(s.node, null, EdgeLabel.CASE, label.accept(new TreePrinter()))); return s; @@ -791,7 +813,9 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g - .buildNode(nodeCounter++ + ": synchronized " + ctx.parenthesizedExpression().accept(new TreePrinter())); + .buildNode(nodeCounter++ + ": synchronized " + ctx.parenthesizedExpression().accept(new TreePrinter())); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); WorkingGraph block = visitBlock(ctx.block()); @@ -807,6 +831,8 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); return s; @@ -818,6 +844,8 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.THROWN)); return s; @@ -829,6 +857,8 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": *EMPTY* ; "); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); return s; @@ -840,6 +870,8 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); return s; @@ -868,7 +900,9 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g - .buildNode(nodeCounter++ + ": catch ( " + ctx.formalParameter().type().accept(new TreePrinter()) + ")"); + .buildNode(nodeCounter++ + ": catch ( " + ctx.formalParameter().type().accept(new TreePrinter()) + ")"); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); WorkingGraph body = visitBlock(ctx.block()); @@ -934,10 +968,10 @@ public class NodeBuilder implements Java1_4ParserVisitor { public WorkingGraph visitCompilationUnit(CompilationUnitContext ctx) { QualifiedIdentifierContext pkg = ctx.qualifiedIdentifier(); - if(pkg != null) + if (pkg != null) nameStack.push(pkg.accept(new TreePrinter())); - for(TypeDeclarationContext typeDeclaration : ctx.typeDeclaration()) + for (TypeDeclarationContext typeDeclaration : ctx.typeDeclaration()) typeDeclaration.accept(this); return null; @@ -1008,10 +1042,10 @@ public class NodeBuilder implements Java1_4ParserVisitor { List formals = ctx.formalParameter(); int size = formals.size(); - if(size > 0) { + if (size > 0) { sb.append(formals.get(0).type().accept(new TreePrinter())); - for(int i = 1; i < size; i++) { + for (int i = 1; i < size; i++) { sb.append(", "); sb.append(formals.get(i).type().accept(new TreePrinter())); } @@ -1024,7 +1058,7 @@ public class NodeBuilder implements Java1_4ParserVisitor { @Override public WorkingGraph visitMethodDeclaration(MethodDeclarationContext ctx) { - if(ctx.block() != null) { + if (ctx.block() != null) { String identifier = ctx.identifier().getText(); String signature = getSignature(identifier, ctx.formalParameters()); ControlFlowGraph g = new ControlFlowGraph(getCurrentName() + "." + signature); @@ -1035,21 +1069,21 @@ public class NodeBuilder implements Java1_4ParserVisitor { g.buildEdge(g.entry, s.node, EdgeLabel.BLANK); - for(Edge edge : s.edges) { + for (Edge edge : s.edges) { EdgeLabel label = edge.label(); - if(edge.target() == null) { - if(label == EdgeLabel.THROWN) + if (edge.target() == null) { + if (label == EdgeLabel.THROWN) edge.setTarget(g.abruptExit); else edge.setTarget(g.normalExit); } } - if(!s.breakEdges.isEmpty()) + if (!s.breakEdges.isEmpty()) throw new IllegalStateException("WorkingGraph still contains break edges: " + s); - if(!s.continueEdges.isEmpty()) + if (!s.continueEdges.isEmpty()) throw new IllegalStateException("WorkingGraph still contains continue edges: " + s); } @@ -1125,21 +1159,21 @@ public class NodeBuilder implements Java1_4ParserVisitor { g.buildEdge(g.entry, s.node, EdgeLabel.BLANK); - for(Edge edge : s.edges) { + for (Edge edge : s.edges) { EdgeLabel label = edge.label(); - if(edge.target() == null) { - if(label == EdgeLabel.THROWN) + if (edge.target() == null) { + if (label == EdgeLabel.THROWN) edge.setTarget(g.abruptExit); else edge.setTarget(g.normalExit); } } - if(!s.breakEdges.isEmpty()) + if (!s.breakEdges.isEmpty()) throw new IllegalStateException("WorkingGraph still contains break edges: " + s); - if(!s.continueEdges.isEmpty()) + if (!s.continueEdges.isEmpty()) throw new IllegalStateException("WorkingGraph still contains continue edges: " + s); return null; @@ -1155,21 +1189,21 @@ public class NodeBuilder implements Java1_4ParserVisitor { g.buildEdge(g.entry, s.node, EdgeLabel.BLANK); - for(Edge edge : s.edges) { + for (Edge edge : s.edges) { EdgeLabel label = edge.label(); - if(edge.target() == null) { - if(label == EdgeLabel.THROWN) + if (edge.target() == null) { + if (label == EdgeLabel.THROWN) edge.setTarget(g.abruptExit); else edge.setTarget(g.normalExit); } } - if(!s.breakEdges.isEmpty()) + if (!s.breakEdges.isEmpty()) throw new IllegalStateException("WorkingGraph still contains break edges: " + s); - if(!s.continueEdges.isEmpty()) + if (!s.continueEdges.isEmpty()) throw new IllegalStateException("WorkingGraph still contains continue edges: " + s); return null; @@ -1204,21 +1238,21 @@ public class NodeBuilder implements Java1_4ParserVisitor { g.buildEdge(g.entry, s.node, EdgeLabel.BLANK); - for(Edge edge : s.edges) { + for (Edge edge : s.edges) { EdgeLabel label = edge.label(); - if(edge.target() == null) { - if(label == EdgeLabel.THROWN) + if (edge.target() == null) { + if (label == EdgeLabel.THROWN) edge.setTarget(g.abruptExit); else edge.setTarget(g.normalExit); } } - if(!s.breakEdges.isEmpty()) + if (!s.breakEdges.isEmpty()) throw new IllegalStateException("WorkingGraph still contains break edges: " + s); - if(!s.continueEdges.isEmpty()) + if (!s.continueEdges.isEmpty()) throw new IllegalStateException("WorkingGraph still contains continue edges: " + s); return null; @@ -1230,17 +1264,19 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": body"); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); WorkingGraph body = null; ExplicitConstructorInvocationContext eci = ctx.explicitConstructorInvocation(); - if(eci != null) { + if (eci != null) { body = visitExplicitConstructorInvocation(eci); s.connect(body); } - for(BlockStatementContext statement : ctx.blockStatement()) { + for (BlockStatementContext statement : ctx.blockStatement()) { body = visitBlockStatement(statement); s.connect(body); } @@ -1254,6 +1290,8 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); return s; @@ -1288,6 +1326,8 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": else"); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); WorkingGraph body = visitStatement(ctx.statement()); @@ -1309,12 +1349,14 @@ public class NodeBuilder implements Java1_4ParserVisitor { WorkingGraph s = new WorkingGraph(); s.node = g.buildNode(nodeCounter++ + ": finally"); + // addlinenumber + s.node.setLineNumber(ctx.getStart().getLine()); WorkingGraph body = visitFinallyBlock(ctx.block(), delayedThrown); s.edges.add(g.buildEdge(s.node, body.node, EdgeLabel.BLANK)); - if(delayedThrown) + if (delayedThrown) s.edges.add(g.buildEdge(s.node, body.node, EdgeLabel.THROWN_DELAYED)); return s; @@ -1328,31 +1370,31 @@ class WorkingGraph { public Map> continueEdges = new HashMap<>(); public void connect(WorkingGraph s) { - if(s == null) + if (s == null) return; - - for(Edge edge : edges) { - if(edge.label() != EdgeLabel.THROWN && edge.target == null) + + for (Edge edge : edges) { + if (edge.label() != EdgeLabel.THROWN && edge.target == null) edge.setTarget(s.node); } edges.addAll(s.edges); - for(String label : s.breakEdges.keySet()) { + for (String label : s.breakEdges.keySet()) { List sEdges = s.breakEdges.get(label); List thisEdges = breakEdges.get(label); - if(thisEdges == null) + if (thisEdges == null) breakEdges.put(label, sEdges); else thisEdges.addAll(sEdges); } - for(String label : s.continueEdges.keySet()) { + for (String label : s.continueEdges.keySet()) { List sEdges = s.continueEdges.get(label); List thisEdges = continueEdges.get(label); - if(thisEdges == null) + if (thisEdges == null) continueEdges.put(label, sEdges); else thisEdges.addAll(sEdges);