8fec16bbaa0fa2373ba86cb803127f45d630748f
[nit.git] / contrib / pep8analysis / src / cfg / dot_printer.nit
1 import cfg_base
2
3 redef class CFG
4 fun print_dot( f: OStream, long: Bool )
5 do
6 f.write("digraph \{\n")
7 f.write("charset=latin1\n")
8 f.write("node [shape=box,style=rounded,fontname=courier]\n")
9 for block in blocks do block.print_dot_nodes(f, long)
10 for block in blocks do block.print_dot_edges(f, long)
11 f.write("\}")
12 end
13 end
14
15 redef class BasicBlock
16 fun print_dot_nodes( f: OStream, long: Bool )
17 do
18 var lbl = "\"{name}:\\n{dot_node_text(long)}\""
19 f.write( "{name} [label={lbl}]\n" )
20 end
21
22 fun dot_node_text(long: Bool): String
23 do
24 var code_lines = new Array[String]
25 for line in lines do code_lines.add(line.text)
26 var code = code_lines.join("")
27
28 code = code.replace("\n","\\l").replace("\"","\\\"").replace("\\n","|n").replace("/","\\/").replace("\r","")
29 # the last one is a hack
30
31 if long then
32 return "{dot_node_header}{code}{dot_node_footer}"
33 else return code
34 end
35
36 fun dot_node_header: String do return ""
37 fun dot_node_footer: String do return ""
38
39 fun print_dot_edges( f: OStream, long: Bool )
40 do
41 for s in successors do
42 f.write( "{name} -> {s.name}\n" )
43 end
44 var n = after_call
45 if n != null then
46 f.write( "{name} -> {n.name} [style=\"dashed\"]\n" )
47 end
48 end
49 end