488d382da0dbf94bf88ffc1a594f576a7e3b6835
[nit.git] / contrib / pep8analysis / src / ast / pretty_instructions.nit
1 module pretty_instructions
2
3 import ast_base
4 import rich_instructions
5
6 redef class AnalysisManager
7 var opt_ast = new OptionBool("Print the AST","--ast")
8
9 redef init
10 do
11 super
12 opts.add_option(opt_ast)
13 end
14
15 redef fun build_ast(filename, stream)
16 do
17 var ast = super
18
19 return ast
20 end
21 end
22
23 class ASTPrinter
24 super Visitor
25
26 var str writable = ""
27
28 init do end
29 redef fun visit(n) do n.accept_ast_printer(self)
30 end
31
32 redef class ANode
33 fun accept_ast_printer(v: ASTPrinter) do visit_all(v)
34 end
35
36 redef class Token
37 redef fun to_s do return text
38 redef fun accept_ast_printer(v: ASTPrinter) do v.str += self.to_s # + " "
39 end
40
41 redef class TId
42 redef fun accept_ast_printer(v: ASTPrinter)
43 do
44 var len = self.to_s.length
45 if len < 6 and len > 1 then
46 v.str += self.to_s + " "*(6-len)
47 else
48 v.str += self.to_s
49 end
50 end
51 end
52
53 redef class ANonEmptyLine
54 redef fun accept_ast_printer(v: ASTPrinter)
55 do
56 if n_label_decl == null then v.str += once " "*10
57 visit_all(v)
58 end
59 end
60
61 redef class AInstruction
62 redef fun accept_ast_printer(v: ASTPrinter)
63 do
64 var pre_size = v.str.length
65 visit_all(v)
66 var post_size = v.str.length
67 var diff_size = post_size - pre_size
68 if diff_size < 20 then v.str += " "*(20-diff_size)
69 end
70 end
71
72 redef class ALabelDecl
73 redef fun accept_ast_printer(v: ASTPrinter)
74 do
75 var text = n_id.text + ":"
76 v.str += text + " "*(10-text.length)
77 end
78 end
79
80 redef class ALine
81 fun text: String
82 do
83 var p = new ASTPrinter
84 p.enter_visit( self )
85 return p.str
86 end
87 end