maroon 0.6.5 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,58 +0,0 @@
1
- context :Bind, :execute do
2
- role :block do
3
- end
4
- role :local do
5
- end
6
- role :aliased_role do
7
- end
8
- initialize do |local, aliased_role, block|
9
- @local = local
10
- @aliased_role = aliased_role
11
- @block = block
12
- end
13
- ##
14
- #removes call to bind in a block
15
- #and replaces it with assignment to the proper role player local variables
16
- #in the end of the block the local variables have their original values reassigned
17
- execute do
18
- must_b_sym = 'aliased_role must be a Symbol'.to_sym
19
- local_must_b_sym = 'local must be a Symbol'.to_sym
20
- raise must_b_sym unless aliased_role.instance_of? Symbol
21
- raise local_must_b_sym unless local.instance_of? Symbol
22
- # assigning role player to role field
23
- #notice that this will be executed after the next block
24
- aliased_field = ('@' + aliased_role.to_s).to_sym
25
- temp_symbol = ('temp____' + aliased_role.to_s).to_sym
26
-
27
- assignment = Sexp.new
28
- assignment[0] = :iasgn
29
- assignment[1] = aliased_field
30
- load_arg = Sexp.new
31
- load_arg[0] = :lvar
32
- load_arg[1] = local
33
- assignment[2] = load_arg
34
- block.insert 1, assignment
35
-
36
- # assign role player to temp
37
- # notice this is prepended Ie. inserted in front of the role player to role field
38
-
39
- assignment = Sexp.new
40
- assignment[0] = :lasgn
41
- assignment[1] = temp_symbol
42
- load_field = Sexp.new
43
- load_field[0] = :ivar
44
- load_field[1] = aliased_field
45
- assignment[2] = load_field
46
- block.insert 1, assignment
47
-
48
- # reassign original player
49
- assignment = Sexp.new
50
- assignment[0] = :iasgn
51
- assignment[1] = aliased_field
52
- load_temp = Sexp.new
53
- load_temp[0] = :lvar
54
- load_temp[1] = temp_symbol
55
- assignment[2] = load_temp
56
- block[block.length] = assignment
57
- end
58
- end
@@ -1,78 +0,0 @@
1
- require_relative '../lib/maroon/kernel'
2
- context :MethodCall, :rewrite_call? do
3
- role :interpretation_context do
4
- contracts {
5
- @interpretation_context.contracts || {}
6
- }
7
- roles {
8
- @interpretation_context.roles || {}
9
- }
10
- role_aliases {
11
- @interpretation_context.role_aliases || {}
12
- }
13
- end
14
-
15
- role :method do
16
- call_in_block? {
17
- @in_block unless @in_block == nil
18
- (@in_block = (method && method[0] == :lvar))
19
- }
20
-
21
- get_role_definition {
22
- is_call_expression = method && method[0] == :call
23
- self_is_instance_expression = (is_call_expression && !method[1])
24
- role_name = nil
25
- role_name = method[2] if self_is_instance_expression
26
- if (not self_is_instance_expression) and method[1]
27
- role_name = method[1][2] if method[1][1] == nil and method[1][0] == :call #call role field is instance
28
- role_name = interpretation_context.role_aliases[method[1][1]] if method[1][0] == :lvar #local var potentially bound
29
- end
30
- role = role_name ? interpretation_context.roles[role_name] : nil
31
- [role, (role ? role_name : nil)]
32
- }
33
-
34
- role_method_call? { |method_name|
35
-
36
- return nil, nil unless method
37
-
38
- role, role_name = method.get_role_definition #is it a call to a role getter
39
-
40
- #in_block = method.call_in_block?
41
- #role_name = interpretation_context.role_aliases[role_name] if in_block
42
- is_role_method = role && role.has_key?(method_name)
43
-
44
- return role_name, is_role_method
45
- }
46
- end
47
-
48
- rewrite_call? do
49
- method_name = method[2]
50
- if method[0] == :call
51
- if method[1] == nil && method.length < 5 && method[3] && method[3].length == 1 && method[3][0] == :arglist
52
- #accessing a role field?
53
- is_role = interpretation_context.roles.has_key? method[3]
54
- method[3] = ':@' + method[3].to_sym if is_role
55
- else
56
- role_name, is_role_method = method.role_method_call? method_name
57
- if is_role_method #role_name only returned if it's a role method call
58
- method[1] = nil #remove call to attribute
59
- method[2] = ('self_' + role_name.to_s + '_' + method_name.to_s).to_sym
60
- else # it's an instance method invocation
61
- if interpretation_context.roles.has_key? role_name
62
- unless method.length == 3 && method[1] == nil && method[2] == role_name
63
- contract_methods = (interpretation_context.contracts[role_name] ||= {})
64
- contract_methods[method_name] ||= 0
65
- contract_methods[method_name] += 1
66
- end
67
- end
68
- end
69
- end
70
- end
71
- end
72
- initialize do |method, interpretation_context|
73
- raise 'No method supplied' unless method
74
-
75
- @method = method
76
- @interpretation_context = interpretation_context
77
- end
78
- end
@@ -1,60 +0,0 @@
1
- context :Self, :execute do
2
- initialize do |abstract_syntax_tree, interpretationcontext|
3
- raise 'Interpretation context missing' unless interpretationcontext
4
- raise 'Must have a defining role' unless interpretationcontext.defining_role
5
-
6
- @abstract_syntax_tree = abstract_syntax_tree
7
- @interpretation_context = interpretationcontext
8
- end
9
-
10
- role :abstract_syntax_tree do
11
- is_indexer_call_on_self do
12
- abstract_syntax_tree.length == 4 &&
13
- abstract_syntax_tree[0] == :call &&
14
- abstract_syntax_tree[1] == nil &&
15
- abstract_syntax_tree[2] == :[] &&
16
- abstract_syntax_tree[3][0] == :argslist
17
- end
18
-
19
- end
20
- role :interpretation_context do
21
- defining_role do
22
- interpretation_context.defining_role
23
- end
24
- end
25
-
26
- # rewrites a call to self in a role method to a call to the role player accessor
27
- # which is subsequently rewritten to a call to the instance variable itself
28
- # in the case where no role method is called on the role player
29
- # It's rewritten to an instance call on the context object if a role method is called
30
- execute do
31
- if abstract_syntax_tree
32
- if abstract_syntax_tree[0] == :self #if self is used in a role method, then rewrite to role getter
33
- abstract_syntax_tree[0] = :call
34
- abstract_syntax_tree[1] = nil
35
- abstract_syntax_tree[2] = interpretation_context.defining_role
36
- elsif abstract_syntax_tree[0] == :call and abstract_syntax_tree[1] == nil
37
- method_name = abstract_syntax_tree[2]
38
- #self is removed from S-expressions
39
- if method_name == :[] or method_name == :[]=
40
- get_role = Sexp.new
41
- get_role[0] = :call
42
- get_role[1] = nil
43
- get_role[2] = interpretation_context.defining_role
44
- abstract_syntax_tree[1] = get_role
45
- end
46
- elsif abstract_syntax_tree.instance_of? Sexp
47
- if abstract_syntax_tree.is_indexer_call_on_self
48
- getter = new Sexp.new
49
- getter[0] = :call
50
- getter[1] = nil
51
- getter[2] = interpretation_context.defining_role
52
- arglist = Sexp.new
53
- getter[3] = arglist
54
- arglist[0] = :arglist
55
- abstract_syntax_tree[1] = getter
56
- end
57
- end
58
- end
59
- end
60
- end
@@ -1,65 +0,0 @@
1
- class Bind
2
-
3
- def initialize(local,aliased_role,block)
4
- @local = local
5
- @aliased_role = aliased_role
6
- @block = block
7
-
8
- end
9
-
10
- def execute()
11
- must_b_sym = "aliased_role must be a Symbol".to_sym
12
- local_must_b_sym = "local must be a Symbol".to_sym
13
- raise(must_b_sym) unless aliased_role.instance_of?(Symbol)
14
- raise(local_must_b_sym) unless local.instance_of?(Symbol)
15
- aliased_field = ("@" + aliased_role.to_s).to_sym
16
- temp_symbol = ("temp____" + aliased_role.to_s).to_sym
17
- assignment = Sexp.new
18
- assignment[0] = :iasgn
19
- assignment[1] = aliased_field
20
- load_arg = Sexp.new
21
- load_arg[0] = :lvar
22
- load_arg[1] = local
23
- assignment[2] = load_arg
24
- block.insert(1, assignment)
25
- assignment = Sexp.new
26
- assignment[0] = :lasgn
27
- assignment[1] = temp_symbol
28
- load_field = Sexp.new
29
- load_field[0] = :ivar
30
- load_field[1] = aliased_field
31
- assignment[2] = load_field
32
- block.insert(1, assignment)
33
- assignment = Sexp.new
34
- assignment[0] = :iasgn
35
- assignment[1] = aliased_field
36
- load_temp = Sexp.new
37
- load_temp[0] = :lvar
38
- load_temp[1] = temp_symbol
39
- assignment[2] = load_temp
40
- block[block.length] = assignment
41
-
42
- end
43
-
44
- def self.call(*args)
45
- arity = Bind.method(:new).arity
46
- newArgs = args[0..arity-1]
47
- obj = Bind.new *newArgs
48
- if arity < args.length
49
- methodArgs = args[arity..-1]
50
- obj.execute *methodArgs
51
- else
52
- obj.execute
53
- end
54
- end
55
-
56
- def call(*args);execute *args; end
57
-
58
- private
59
- attr_reader :block
60
- attr_reader :local
61
- attr_reader :aliased_role
62
-
63
-
64
-
65
- end
@@ -1,91 +0,0 @@
1
- class MethodCall
2
-
3
- def rewrite_call?()
4
- method_name = method[2]
5
- if (method[0] == :call) then
6
- if (method[1] == nil) and ((method.length < 5) and (method[3] and ((method[3].length == 1) and (method[3][0] == :arglist)))) then
7
- is_role = interpretation_context.roles.has_key?(method[3])
8
- method[3] = (":@" + method[3].to_sym) if is_role
9
- else
10
- role_name, is_role_method = self_method_role_method_call?(method_name)
11
- if is_role_method then
12
- method[1] = nil
13
- method[2] = ((("self_" + role_name.to_s) + "_") + method_name.to_s).to_sym
14
- else
15
- if interpretation_context.roles.has_key?(role_name) then
16
- unless (method.length == 3) and ((method[1] == nil) and (method[2] == role_name)) then
17
- contract_methods = interpretation_context.contracts[role_name] ||= {}
18
- contract_methods[method_name] ||= 0
19
- contract_methods[method_name] += 1
20
- end
21
- end
22
- end
23
- end
24
- end
25
-
26
- end
27
-
28
- def initialize(method,interpretation_context)
29
- raise("No method supplied") unless method
30
- @method = method
31
- @interpretation_context = interpretation_context
32
-
33
- end
34
-
35
- def self.call(*args)
36
- arity = MethodCall.method(:new).arity
37
- newArgs = args[0..arity-1]
38
- obj = MethodCall.new *newArgs
39
- if arity < args.length
40
- methodArgs = args[arity..-1]
41
- obj.rewrite_call? *methodArgs
42
- else
43
- obj.rewrite_call?
44
- end
45
- end
46
-
47
- def call(*args);rewrite_call? *args; end
48
-
49
- private
50
- attr_reader :interpretation_context
51
- attr_reader :method
52
-
53
-
54
- def self_interpretation_context_role_aliases()
55
- (@interpretation_context.role_aliases or {})
56
- end
57
-
58
- def self_method_call_in_block?()
59
- @in_block unless (@in_block == nil)
60
- @in_block = (method and (method[0] == :lvar))
61
-
62
- end
63
-
64
- def self_method_get_role_definition()
65
- is_call_expression = (method and (method[0] == :call))
66
- self_is_instance_expression = (is_call_expression and (not method[1]))
67
- role_name = nil
68
- role_name = method[2] if self_is_instance_expression
69
- if (not self_is_instance_expression) and method[1] then
70
- if (method[1][1] == nil) and (method[1][0] == :call) then
71
- role_name = method[1][2]
72
- end
73
- if (method[1][0] == :lvar) then
74
- role_name = self_interpretation_context_role_aliases[method[1][1]]
75
- end
76
- end
77
- role = role_name ? (interpretation_context.roles[role_name]) : (nil)
78
- [role, role ? (role_name) : (nil)]
79
-
80
- end
81
-
82
- def self_method_role_method_call?(method_name)
83
- return [nil, nil] unless method
84
- role, role_name = self_method_get_role_definition
85
- is_role_method = (role and role.has_key?(method_name))
86
- return [role_name, is_role_method]
87
-
88
- end
89
-
90
-
91
- end
@@ -1,114 +0,0 @@
1
- class MethodDefinition
2
-
3
- def rebind()
4
- @exp, @expressions = expressions.pop
5
- @block, @potential_bind = nil
6
- if @exp and (@exp.instance_of?(Sexp) and (@exp[0] == :iter)) then
7
- @exp[(1..-1)].each do |expr|
8
- if expr and (expr.length and (expr[0] == :block)) then
9
- @block, @potential_bind = expr, expr[1]
10
- end
11
- end
12
- end
13
- @expressions = @exp.instance_of?(Sexp) ? (@expressions.push_array(exp)) : (@expressions)
14
-
15
- end
16
-
17
- def transform()
18
- until self_expressions_empty? do
19
- (self_block_transform
20
- if exp and exp.instance_of?(Sexp) then
21
- is_indexer = ((exp[0] == :call) and ((exp[1] == nil) and ((exp[2] == :[]) or (exp[2] == :[]=))))
22
- if (is_indexer or (exp[0] == :self)) and @interpretation_context.defining_role then
23
- Self.new(exp, interpretation_context).execute
24
- end
25
- if (exp[0] == :call) then
26
- MethodCall.new(exp, interpretation_context).rewrite_call?
27
- end
28
- end
29
- rebind)
30
- end
31
- end
32
-
33
- def initialize(exp,interpretationcontext)
34
- no_exp = "No expression supplied".to_sym
35
- no_ctx = "No interpretation context".to_sym
36
- raise(no_exp) unless exp
37
- raise(no_ctx) unless interpretationcontext
38
- @interpretation_context = interpretationcontext
39
- @expressions = ImmutableQueue.empty.push(exp)
40
- rebind
41
-
42
- end
43
-
44
- def self.call(*args)
45
- arity = MethodDefinition.method(:new).arity
46
- newArgs = args[0..arity-1]
47
- obj = MethodDefinition.new *newArgs
48
- if arity < args.length
49
- methodArgs = args[arity..-1]
50
- obj.transform *methodArgs
51
- else
52
- obj.transform
53
- end
54
- end
55
-
56
- def call(*args);transform *args; end
57
-
58
- private
59
- attr_reader :interpretation_context
60
- attr_reader :exp
61
- attr_reader :expressions
62
- attr_reader :potential_bind
63
- attr_reader :block
64
-
65
-
66
- def self_interpretation_context_addalias(key,value)
67
- @interpretation_context.role_aliases[key] = value
68
- end
69
-
70
- def self_expressions_empty?()
71
- (expressions == ImmutableQueue.empty)
72
- end
73
-
74
- def self_potential_bind_is_bind?()
75
- potential_bind and (potential_bind.length and ((potential_bind[0] == :call) and ((potential_bind[1] == nil) and (potential_bind[2] == :bind))))
76
- end
77
-
78
- def self_block_transform()
79
- if block then
80
- @expressions.push_array(block[(1..-1)]) if self_block_transform_bind?
81
- end
82
- end
83
-
84
- def self_block_transform_bind?()
85
- self_potential_bind_is_bind? and self_block_rewrite
86
- end
87
-
88
- def self_block_rewrite()
89
- changed = false
90
- arguments = potential_bind[3]
91
- if arguments and (arguments[0] == :hash) then
92
- block.delete_at(1)
93
- count = ((arguments.length - 1) / 2)
94
- (1..count).each do |j|
95
- temp = (j * 2)
96
- local = arguments[(temp - 1)][1]
97
- local = local[1] if local.instance_of?(Sexp)
98
- raise("invalid value for role alias") unless local.instance_of?(Symbol)
99
- aliased_role = arguments[temp][1]
100
- aliased_role = aliased_role[1] if aliased_role.instance_of?(Sexp)
101
- unless aliased_role.instance_of?(Symbol) and interpretation_context.roles.has_key?(aliased_role) then
102
- raise(((aliased_role.to_s + "used in binding is an unknown role ") + roles.to_s))
103
- end
104
- self_interpretation_context_addalias(local, aliased_role)
105
- Bind.new(local, aliased_role, block).execute
106
- changed = true
107
- end
108
- end
109
- changed
110
-
111
- end
112
-
113
-
114
- end