syntax: new-style attributes for those without underscore
[nit.git] / src / analysis / inline_get_and_set.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Copyright 2009 Jean-Sebastien Gelinas <calestar@gmail.com>
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16
17 # Inline every automatic 'getters' and 'setters'
18 # This optimization is done BEFORE analysis
19 package inline_get_and_set
20
21 import icode
22 import syntax
23 import program
24
25 redef class Program
26 fun inline_get_set do
27 with_each_iroutines !action(i, m) do
28 var v = new InlineGetSetVisitor(m, i)
29 v.visit_iroutine(i)
30 end
31 end
32 end
33
34 private class InlineGetSetVisitor
35 special ICodeVisitor
36 var _icb: ICodeBuilder
37
38 redef fun visit_icode(ic)
39 do
40 # Algo mostly from inline_methods.nit, by Jean Privat
41 if ic isa ICall then
42 var m = ic.property
43 var ir = m.iroutine
44 if ir != null and m isa MMAttrImplementationMethod then
45 var icb = _icb
46 var seq = new ISeq
47 var old_seq = icb.seq
48 icb.seq = seq
49 current_icode.insert_before(seq)
50 var e = icb.inline_routine(ir, ic.exprs, ic.closure_defs)
51 var r = ic.result
52 if r != null then
53 assert e != null
54 current_icode.insert_before(new IMove(r, e))
55 end
56 current_icode.delete
57 icb.seq = old_seq
58 visit_icode(seq)
59 end
60 end
61 super
62 end
63
64 init(m: MMModule, r: IRoutine)
65 do
66 _icb = new ICodeBuilder(m, r)
67 end
68 end