contrib: bring in the pep8 analysis framework
[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)
16 do
17 var ast = super
18
19 if ast != null and opt_ast.value then
20 var printer = new ASTPrinter
21 printer.enter_visit(ast)
22 print printer.str
23 end
24
25 return ast
26 end
27 end
28
29 class ASTPrinter
30 super Visitor
31
32 var str writable = ""
33
34 init do end
35 redef fun visit(n) do n.accept_ast_printer(self)
36 end
37
38 redef class ANode
39 fun accept_ast_printer(v: ASTPrinter) do visit_all(v)
40 end
41
42 redef class Token
43 redef fun to_s do return text
44 redef fun accept_ast_printer(v: ASTPrinter) do v.str += self.to_s # + " "
45 end
46
47 redef class TId
48 redef fun accept_ast_printer(v: ASTPrinter)
49 do
50 var len = self.to_s.length
51 if len < 6 and len > 1 then
52 v.str += self.to_s + " "*(6-len)
53 else
54 v.str += self.to_s
55 end
56 end
57 end
58
59 redef class ANonEmptyLine
60 redef fun accept_ast_printer(v: ASTPrinter)
61 do
62 if n_label_decl == null then v.str += once " "*10
63 visit_all(v)
64 end
65 end
66
67 redef class AInstruction
68 redef fun accept_ast_printer(v: ASTPrinter)
69 do
70 var pre_size = v.str.length
71 visit_all(v)
72 var post_size = v.str.length
73 var diff_size = post_size - pre_size
74 if diff_size < 20 then v.str += " "*(20-diff_size)
75 end
76 end
77
78 redef class ALabelDecl
79 redef fun accept_ast_printer(v: ASTPrinter)
80 do
81 var text = n_id.text + ":"
82 v.str += text + " "*(10-text.length)
83 end
84 end
85
86 redef class ALine
87 fun text: String
88 do
89 var p = new ASTPrinter
90 p.enter_visit( self )
91 return p.str
92 end
93 end