import parser
import toolcontext
import scope
+import phase
+
+redef class ToolContext
+ var flow_phase: Phase = new FlowPhase(self, [scope_phase])
+end
+
+private class FlowPhase
+ super Phase
+
+ redef fun process_npropdef(npropdef) do npropdef.do_flow(toolcontext)
+end
# The visitor that derermine flowcontext for nodes
private class FlowVisitor
if node isa AExpr then
var flow = self.current_flow_context
node.after_flow_context = flow
+ # Force the creation of a specific merge after the analysis of the node.
if flow.when_true != flow or flow.when_false != flow then
- #self.make_sub_flow
+ self.make_sub_flow
+ self.current_flow_context.name = "AUTOSUB"
end
end
fun visit_expr(node: AExpr): FlowContext
do
- self.visit(node)
+ self.enter_visit(node)
return node.after_flow_context.as(not null)
end
file.write "F{f.object_id} -> F{f.when_false.object_id}[label=FALSE,style=dotted];\n"
end
end
- file.write("\n")
+ file.write("\}\n")
file.close
end
redef class AAssertExpr
redef fun accept_flow_visitor(v)
do
- v.enter_visit(self.n_expr)
- var after_expr = v.current_flow_context
+ var after_expr = v.visit_expr(self.n_expr)
v.current_flow_context = after_expr.when_false
v.enter_visit(n_else)
v.current_flow_context = after_expr.when_false
var after_expr2 = v.visit_expr(self.n_expr2)
- v.make_true_false_flow(v.make_merge_flow(after_expr.when_true, after_expr2.when_true), after_expr2.when_false)
+ var merge_true = v.make_merge_flow(after_expr.when_true, after_expr2.when_true)
+ merge_true.name = "OR TRUE"
+
+ v.make_true_false_flow(merge_true, after_expr2.when_false)
end
end
v.make_sub_true_false_flow
end
end
+
+redef class AProxyExpr
+ redef fun accept_flow_visitor(v)
+ do
+ var after_expr = v.visit_expr(self.n_expr)
+ v.current_flow_context = after_expr
+ end
+end