*: remove newly superfluous static types on attributes
[nit.git] / contrib / pep8analysis / src / model / model.nit
1 import backbone
2 import ast
3
4 import directives
5 import operands
6 import vars
7
8 redef class AnalysisManager
9 var model: nullable Model = null
10 fun build_model(ast: AListing): Model
11 do
12 var model = new Model(ast)
13 self.model = model
14 return model
15 end
16 end
17
18 class Model
19 # lines to appear on the resulting program
20 var lines = new Array[ANonEmptyLine]
21
22 # labet to declaation line
23 var labels_to_line = new HashMap[String,ALine]
24 var labels_to_address = new HashMap[String,Int]
25
26 # from adress to line
27 var address_to_line = new HashMap[Int,ANonEmptyLine]
28
29 init (ast: AListing)
30 do
31 var offset = 0
32 for line in ast.n_lines do
33 # TODO if directive = equate
34 var label_decl = line.n_label_decl
35 if label_decl != null then
36 var lbl = label_decl.n_id
37 var label_name = lbl.text
38
39 if line isa ADirectiveLine and line.n_directive isa AEquateDirective then
40 # .EQUATE
41 labels_to_address[label_name] = line.n_directive.as(AEquateDirective).n_value.to_i
42 lbl.labels_to_address[label_name] = line.n_directive.as(AEquateDirective).n_value.to_i
43 else
44 labels_to_address[label_name] = offset
45 lbl.labels_to_address[label_name] = offset
46 end
47 end
48
49 line.address = offset
50
51 if line isa ANonEmptyLine and line.size > 0 then
52 lines.add( line )
53 address_to_line[offset] = line
54 end
55 offset += line.size
56 end
57
58 for lbl,address in labels_to_address do
59 if address_to_line.has_key(address) then
60 var line = address_to_line[address]
61 labels_to_line[lbl] = line
62 end
63 end
64 end
65 end
66
67 redef class ALine
68 var address = -1
69
70 fun size: Int is abstract
71
72 redef fun to_s do return "L{address}"
73
74 redef fun text
75 do
76 var text = super
77 var size = size
78 if size > 0 then
79 return "L{location.to_line_s} (m{address}..{address+size}): {text}"
80 else
81 return "L{location.to_line_s}: {text}"
82 end
83 end
84
85 fun lbl: nullable String
86 do
87 var lbl_decl = n_label_decl
88 if lbl_decl != null then
89 var lbl = lbl_decl.n_id.text
90 return lbl
91 else return null
92 end
93 end
94 redef class AInstructionLine
95 redef fun size do return 4
96 end
97 redef class ADirectiveLine
98 redef fun size do return n_directive.size
99 end
100 redef class AEmptyLine
101 redef fun size do return 0
102 end
103
104 redef class MemVar
105 redef fun to_s do
106 var ltl = manager.model.address_to_line
107 if ltl.has_key(index) then
108 var line = ltl[index]
109 var lbl = line.lbl
110 if lbl != null then
111 return "{lbl}@m{index}"
112 end
113 end
114 return "m{index}"
115 end
116 end