maroon 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +26 -6
- data/Rakefile +3 -3
- data/Test/Context_test.rb +16 -16
- data/{Examples/Dijkstra → Test/Examples}/CalculateShortestDistance.rb +11 -13
- data/Test/Examples/MoneyTransfer_test.rb +76 -0
- data/{Examples/Dijkstra → Test/Examples}/calculate_shortest_path.rb +77 -89
- data/{Examples/Dijkstra → Test/Examples}/data.rb +0 -0
- data/{Examples/Dijkstra/dijkstra.rb → Test/Examples/dijkstra_test.rb} +34 -24
- data/Test/Examples/greeter_test.rb +48 -0
- data/{Examples/meter.rb → Test/Examples/meter_test.rb} +44 -30
- data/Test/abstract_syntax_tree_test.rb +17 -26
- data/Test/alltests.rb +1 -1
- data/Test/test_helper.rb +2 -0
- data/base/AbstractSyntaxTree.rb +24 -3
- data/base/ImmutableStack.rb +1 -1
- data/base/dependency_graph.rb +94 -0
- data/base/immutable_queue.rb +1 -1
- data/base/maroon_base.rb +50 -11
- data/base/transfomer.rb +196 -197
- data/generated/Tokens.rb +64 -2
- data/generated/build.rb +1 -3
- data/generated/maroon/kernel.rb +7 -0
- data/lib/AbstractSyntaxTree.rb +120 -0
- data/lib/AstRewritter.rb +53 -58
- data/lib/Context.rb +104 -126
- data/lib/DependencyGraph.rb +76 -0
- data/lib/ImmutableQueue.rb +28 -39
- data/lib/ImmutableStack.rb +20 -34
- data/lib/Tokens.rb +64 -2
- data/lib/Transformer.rb +125 -165
- data/lib/build.rb +2 -4
- data/lib/maroon/kernel.rb +1 -1
- data/lib/maroon/version.rb +1 -1
- metadata +13 -11
- data/Examples/MoneyTransfer.rb +0 -62
- data/Examples/greeter.rb +0 -46
- data/Test/Greeter_test_disabled.rb +0 -203
- data/lib/Production.rb +0 -149
@@ -0,0 +1,76 @@
|
|
1
|
+
class DependencyGraph
|
2
|
+
def initialize(context_name,roles,interactions,dependencies) @context_name = context_name
|
3
|
+
@roles = roles
|
4
|
+
@interactions = interactions
|
5
|
+
@dependencies = dependencies
|
6
|
+
end
|
7
|
+
def create!() self_roles_dependencies
|
8
|
+
self_interactions_dependencies
|
9
|
+
dependencies
|
10
|
+
end
|
11
|
+
private
|
12
|
+
|
13
|
+
def self_roles_dependencies() roles.each do |r, methods|
|
14
|
+
temp____role_name = @role_name
|
15
|
+
@role_name = r
|
16
|
+
role_dependencies = dependencies[r] ||= {}
|
17
|
+
methods.each do |name, method_sources|
|
18
|
+
temp____dependency = @dependency
|
19
|
+
@dependency = role_dependencies
|
20
|
+
temp____method = @method
|
21
|
+
@method = method_sources
|
22
|
+
self_method_get_dependencies
|
23
|
+
@method = temp____method
|
24
|
+
@dependency = temp____dependency
|
25
|
+
end
|
26
|
+
@role_name = temp____role_name
|
27
|
+
end end
|
28
|
+
def self_interactions_dependencies() interactions.each do |name, interact|
|
29
|
+
role_dependencies = dependencies[:interactions] ||= {}[name] ||= {}
|
30
|
+
interact.each do |m|
|
31
|
+
temp____dependency = @dependency
|
32
|
+
@dependency = role_dependencies
|
33
|
+
temp____method = @method
|
34
|
+
@method = m
|
35
|
+
self_method_get_dependencies
|
36
|
+
@method = temp____method
|
37
|
+
@dependency = temp____dependency
|
38
|
+
end
|
39
|
+
end end
|
40
|
+
def self_dependency_add(dependent_role_name,method_name) if dependent_role_name and dependent_role_name.!=(role_name) then
|
41
|
+
dependency[dependent_role_name] ||= {}
|
42
|
+
unless dependency[dependent_role_name].has_key?(method_name) then
|
43
|
+
dependency[dependent_role_name][method_name] = 0
|
44
|
+
end
|
45
|
+
dependency[dependent_role_name][method_name] += 1
|
46
|
+
end end
|
47
|
+
def self_method_body() args = self_method_definition.detect { |d| (d[0] == :args) }
|
48
|
+
index = (self_method_definition.index(args) + 1)
|
49
|
+
if (self_method_definition.length > (index + 1)) then
|
50
|
+
body = self_method_definition[(index..-1)]
|
51
|
+
body.insert(0, :block)
|
52
|
+
body
|
53
|
+
else
|
54
|
+
self_method_definition[index]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
def self_method_ast() AbstractSyntaxTree.new(self_method_body, InterpretationContext.new(roles, {}, {}, role_name, {})) end
|
58
|
+
def self_method_definition() method.instance_of?(Array) ? (method[0]) : (method) end
|
59
|
+
def self_method_get_dependencies() self_method_ast.each_production do |production|
|
60
|
+
name = nil
|
61
|
+
method_name = nil
|
62
|
+
case production.type
|
63
|
+
when Tokens.rolemethod_call then
|
64
|
+
data = production.data
|
65
|
+
name = data[1]
|
66
|
+
method_name = data[0]
|
67
|
+
when Tokens.role then
|
68
|
+
name = production.data[0]
|
69
|
+
else
|
70
|
+
# do nothing
|
71
|
+
end
|
72
|
+
self_dependency_add(name, method_name) if name.!=(nil)
|
73
|
+
end end
|
74
|
+
attr_reader :roles, :interactions, :dependencies, :dependency, :role_name, :method
|
75
|
+
|
76
|
+
end
|
data/lib/ImmutableQueue.rb
CHANGED
@@ -1,43 +1,32 @@
|
|
1
1
|
class ImmutableQueue
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
def push(element) b = (back or ImmutableStack.empty)
|
3
|
+
ImmutableQueue.new(front, b.push(element))
|
4
|
+
end
|
5
|
+
def pop() f, b = front, back
|
6
|
+
if (f == ImmutableStack.empty) then
|
7
|
+
until (b == ImmutableStack.empty) do
|
8
|
+
(e, b = b.pop
|
9
|
+
f = f.push(e))
|
5
10
|
end
|
11
|
+
end
|
12
|
+
head, f = f.pop
|
13
|
+
if (f == b) then
|
14
|
+
[head, ImmutableQueue.empty]
|
15
|
+
else
|
16
|
+
[head, ImmutableQueue.new(f, b)]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
def self.empty() @empty ||= ImmutableQueue.new(ImmutableStack.empty, ImmutableStack.empty) end
|
20
|
+
def push_array(arr) q = self
|
21
|
+
arr.each { |i| q = q.push(i) } if arr
|
22
|
+
q
|
23
|
+
end
|
24
|
+
private
|
25
|
+
def initialize(front,back) @front = (front or ImmutableStack.empty)
|
26
|
+
@back = (back or ImmutableStack.empty)
|
27
|
+
self.freeze
|
28
|
+
end
|
6
29
|
|
7
|
-
|
8
|
-
f, b = front, back
|
9
|
-
if (f == ImmutableStack.empty) then
|
10
|
-
until (b == ImmutableStack.empty) do
|
11
|
-
(e, b = b.pop
|
12
|
-
f = f.push(e))
|
13
|
-
end
|
14
|
-
end
|
15
|
-
head, f = f.pop
|
16
|
-
if (f == b) then
|
17
|
-
[head, ImmutableQueue.empty]
|
18
|
-
else
|
19
|
-
[head, ImmutableQueue.new(f, b)]
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.empty()
|
24
|
-
@@empty ||= ImmutableQueue.new(ImmutableStack.empty, ImmutableStack.empty)
|
25
|
-
end
|
26
|
-
|
27
|
-
def push_array(arr)
|
28
|
-
q = self
|
29
|
-
arr.each { |i| q = q.push(i) } if arr
|
30
|
-
q
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
def initialize(front, back)
|
35
|
-
@front = (front or ImmutableStack.empty)
|
36
|
-
@back = (back or ImmutableStack.empty)
|
37
|
-
self.freeze
|
38
|
-
end
|
39
|
-
|
40
|
-
attr_reader :front
|
41
|
-
attr_reader :back
|
30
|
+
attr_reader :front, :back
|
42
31
|
|
43
|
-
end
|
32
|
+
end
|
data/lib/ImmutableStack.rb
CHANGED
@@ -1,35 +1,21 @@
|
|
1
1
|
class ImmutableStack
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
def initialize(h, t)
|
24
|
-
@head = h
|
25
|
-
@tail = t
|
26
|
-
self.freeze
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
|
32
|
-
attr_reader :head
|
33
|
-
attr_reader :tail
|
34
|
-
|
35
|
-
end
|
2
|
+
def pop() [@head, @tail] end
|
3
|
+
def push(element) ImmutableStack.new(element, self) end
|
4
|
+
def self.empty() @empty ||= self.new(nil, nil) end
|
5
|
+
def each() yield(head)
|
6
|
+
t = tail
|
7
|
+
while t.!=(ImmutableStack.empty) do
|
8
|
+
h, t = t.pop
|
9
|
+
yield(h)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
def initialize(h,t) @head = h
|
13
|
+
@tail = t
|
14
|
+
self.freeze
|
15
|
+
end
|
16
|
+
private
|
17
|
+
|
18
|
+
|
19
|
+
attr_reader :head, :tail
|
20
|
+
|
21
|
+
end
|
data/lib/Tokens.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
class Tokens
|
2
2
|
def self.define_token(name)
|
3
|
-
class_eval
|
3
|
+
class_eval %{
|
4
|
+
@#{name} = Tokens.new :#{name};
|
5
|
+
def Tokens.#{name}
|
6
|
+
@#{name}
|
7
|
+
end
|
8
|
+
}
|
4
9
|
end
|
5
10
|
|
6
11
|
def to_s
|
@@ -21,4 +26,61 @@ class Tokens
|
|
21
26
|
define_token :indexer
|
22
27
|
define_token :block
|
23
28
|
define_token :block_with_bind
|
24
|
-
|
29
|
+
define_token :initializer
|
30
|
+
define_token :const
|
31
|
+
end
|
32
|
+
|
33
|
+
class DependencyGraphModel
|
34
|
+
|
35
|
+
def initialize(dependencies)
|
36
|
+
@dependencies = dependencies
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_hash
|
40
|
+
@dependecies
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
print_dependencies @dependencies,0
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_dot
|
48
|
+
res = ''
|
49
|
+
dependencies = denormalize @dependencies
|
50
|
+
dependencies.each{|d| res << d.reverse.join('->') << '
|
51
|
+
'}
|
52
|
+
'digraph g{
|
53
|
+
' + res + '}'
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
def print_dependencies(dependencies,indent)
|
58
|
+
res = ''
|
59
|
+
dependencies.each do |key,value|
|
60
|
+
res << key.to_s
|
61
|
+
if value.instance_of? Hash
|
62
|
+
res << '->' << (print_dependencies value,indent != nil ? indent+4 : nil)
|
63
|
+
elsif
|
64
|
+
res << ':' << value.to_s + '
|
65
|
+
'
|
66
|
+
indent.times {res << ' '} unless indent == nil
|
67
|
+
end
|
68
|
+
res << '
|
69
|
+
'
|
70
|
+
end
|
71
|
+
res
|
72
|
+
end
|
73
|
+
|
74
|
+
def denormalize(dependencies)
|
75
|
+
res = []
|
76
|
+
dependencies.each do |key,value|
|
77
|
+
if value.instance_of? Hash
|
78
|
+
res = denormalize value
|
79
|
+
res.each{|a| a << key}
|
80
|
+
else
|
81
|
+
res << [key]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
res
|
85
|
+
end
|
86
|
+
end
|
data/lib/Transformer.rb
CHANGED
@@ -1,174 +1,134 @@
|
|
1
1
|
class Transformer
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
2
|
+
def initialize(context_name,roles,interactions,private_interactions,base_class,default_interaction) @context_name = context_name
|
3
|
+
@roles = roles
|
4
|
+
@interactions = interactions
|
5
|
+
@base_class = base_class
|
6
|
+
@default_interaction = default_interaction
|
7
|
+
@private_interactions = private_interactions
|
8
|
+
@definitions = {}
|
9
|
+
end
|
10
|
+
def transform(file_path,with_contracts) code = (self_interactions_generated_source + self_roles_generated_source)
|
11
|
+
if file_path then
|
12
|
+
name = context_name.to_s
|
13
|
+
complete = ((((("class " + name) + (@base_class ? (("<< " + @base_class.name)) : (""))) + "\n ") + code.to_s) + "\n end")
|
14
|
+
File.open((((("./" + file_path.to_s) + "/") + name) + ".rb"), "w") do |f|
|
15
|
+
f.write(complete)
|
10
16
|
end
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
File.open((((("./" + file_path.to_s) + "/") + name) + ".rb"), "w") do |f|
|
18
|
-
f.write(complete)
|
19
|
-
end
|
20
|
-
complete
|
21
|
-
else
|
22
|
-
c = @base_class ? (Class.new(base_class)) : (Class.new)
|
23
|
-
if with_contracts then
|
24
|
-
c.class_eval("def self.assert_that(obj)\n ContextAsserter.new(self.contracts,obj)\nend\ndef self.refute_that(obj)\n ContextAsserter.new(self.contracts,obj,false)\nend\ndef self.contracts\n @@contracts\nend\ndef self.contracts=(value)\n @@contracts = value\nend")
|
25
|
-
c.contracts = contracts
|
26
|
-
end
|
27
|
-
Kernel.const_set(context_name, c)
|
28
|
-
begin
|
29
|
-
temp = c.class_eval(code)
|
30
|
-
rescue SyntaxError
|
31
|
-
p(("error: " + code))
|
32
|
-
end
|
33
|
-
(temp or c)
|
34
|
-
end
|
17
|
+
complete
|
18
|
+
else
|
19
|
+
c = @base_class ? (Class.new(base_class)) : (Class.new)
|
20
|
+
if with_contracts then
|
21
|
+
c.class_eval("def self.assert_that(obj)\n ContextAsserter.new(self.contracts,obj)\nend\ndef self.refute_that(obj)\n ContextAsserter.new(self.contracts,obj,false)\nend\ndef self.contracts\n @contracts\nend\ndef self.contracts=(value)\n @contracts = value\nend")
|
22
|
+
c.contracts = contracts
|
35
23
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
24
|
+
Kernel.const_set(context_name, c)
|
25
|
+
begin
|
26
|
+
temp = c.class_eval(code)
|
27
|
+
rescue SyntaxError
|
28
|
+
p(("error: " + code))
|
40
29
|
end
|
41
|
-
|
42
|
-
|
43
|
-
|
30
|
+
(temp or c)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
private
|
34
|
+
def contracts() @contracts ||= {} end
|
35
|
+
def role_aliases() @role_aliases ||= {} end
|
36
|
+
def interpretation_context() InterpretationContext.new(roles, contracts, role_aliases, defining_role, @private_interactions) end
|
37
|
+
def self_roles_generated_source() impl = ""
|
38
|
+
getters = []
|
39
|
+
roles.each do |role, methods|
|
40
|
+
(getters << role.to_s)
|
41
|
+
methods.each do |name, method_sources|
|
42
|
+
temp____defining_role = @defining_role
|
43
|
+
@defining_role = role
|
44
|
+
temp____method_name = @method_name
|
45
|
+
@method_name = name
|
46
|
+
temp____method = @method
|
47
|
+
@method = method_sources
|
48
|
+
definition = self_method_generated_source
|
49
|
+
(impl << (" " + definition)) if definition
|
50
|
+
@method = temp____method
|
51
|
+
@method_name = temp____method_name
|
52
|
+
@defining_role = temp____defining_role
|
44
53
|
end
|
45
|
-
|
46
|
-
|
47
|
-
|
54
|
+
end
|
55
|
+
((((impl.strip! or "") + "\n") + ((getters.length > 0) ? (("attr_reader :" + getters.join(", :"))) : (""))) + "\n")
|
56
|
+
end
|
57
|
+
def self_interactions_generated_source() internal_methods = ""
|
58
|
+
external_methods = self_interactions_default
|
59
|
+
interactions.each do |name, interact|
|
60
|
+
interact.each do |m|
|
61
|
+
temp____method_name = @method_name
|
62
|
+
@method_name = name
|
63
|
+
temp____method = @method
|
64
|
+
@method = m
|
65
|
+
@defining_role = nil
|
66
|
+
code = self_method_generated_source
|
67
|
+
(((self_method_is_private? ? (internal_methods) : (external_methods)) << " ") << code)
|
68
|
+
@method = temp____method
|
69
|
+
@method_name = temp____method_name
|
48
70
|
end
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
(impl << (" " + definition)) if definition
|
64
|
-
@method = temp____method
|
65
|
-
@method_name = temp____method_name
|
66
|
-
@defining_role = temp____defining_role
|
67
|
-
end
|
68
|
-
end
|
69
|
-
((((impl.strip! or "") + "\n") + (getters.strip! or "")) + "\n")
|
71
|
+
end
|
72
|
+
((((external_methods.strip! or "") + "\n private\n") + (internal_methods.strip! or "")) + "\n")
|
73
|
+
end
|
74
|
+
def self_interactions_default() if @default then
|
75
|
+
(((((((((("\n def self.call(*args)\n arity = " + name.to_s) + ".method(:new).arity\n newArgs = args[0..arity-1]\n obj = ") + name.to_s) + ".new *newArgs\n if arity < args.length\n methodArgs = args[arity..-1]\n obj.") + default.to_s) + " *methodArgs\n else\n obj.") + default.to_s) + "\n end\n end\n def call(*args);") + default.to_s) + " *args; end\n")
|
76
|
+
else
|
77
|
+
""
|
78
|
+
end end
|
79
|
+
def self_method_is_private?() (defining_role.!=(nil) or private_interactions.has_key?(self_method_name)) end
|
80
|
+
def self_method_definition() key = ((@defining_role ? (@defining_role.to_s) : ("")) + method_name.to_s)
|
81
|
+
return @definitions[key] if @definitions.has_key?(key)
|
82
|
+
unless method.instance_of?(Sexp) then
|
83
|
+
unless method.instance_of?(Array) and (method.length < 2) then
|
84
|
+
raise((((("Duplicate definition of " + method_name.to_s) + "(") + method.to_s) + ")"))
|
70
85
|
end
|
71
|
-
|
72
|
-
|
73
|
-
internal_methods = ""
|
74
|
-
external_methods = self_interactions_default
|
75
|
-
interactions.each do |name, interact|
|
76
|
-
interact.each do |m|
|
77
|
-
temp____method_name = @method_name
|
78
|
-
@method_name = name
|
79
|
-
temp____method = @method
|
80
|
-
@method = m
|
81
|
-
@defining_role = nil
|
82
|
-
code = self_method_generated_source
|
83
|
-
(((self_method_is_private? ? (internal_methods) : (external_methods)) << " ") << code)
|
84
|
-
@method = temp____method
|
85
|
-
@method_name = temp____method_name
|
86
|
-
end
|
87
|
-
end
|
88
|
-
((((external_methods.strip! or "") + "\n private\n") + (internal_methods.strip! or "")) + "\n")
|
86
|
+
unless method.instance_of?(Array) and (method.length > 0) then
|
87
|
+
raise(("No source for " + method_name.to_s))
|
89
88
|
end
|
89
|
+
end
|
90
|
+
d = method.instance_of?(Array) ? (method[0]) : (method)
|
91
|
+
raise("Sexp require") unless d.instance_of?(Sexp)
|
92
|
+
@definitions[key] = d
|
93
|
+
end
|
94
|
+
def self_method_body() args = self_method_definition.detect { |d| (d[0] == :args) }
|
95
|
+
index = (self_method_definition.index(args) + 1)
|
96
|
+
if (self_method_definition.length > (index + 1)) then
|
97
|
+
body = self_method_definition[(index..-1)]
|
98
|
+
body.insert(0, :block)
|
99
|
+
body
|
100
|
+
else
|
101
|
+
self_method_definition[index]
|
102
|
+
end
|
103
|
+
end
|
104
|
+
def self_method_arguments() args = self_method_definition.detect { |d| (d[0] == :args) }
|
105
|
+
args and (args.length > 1) ? (args[(1..-1)]) : ([])
|
106
|
+
end
|
107
|
+
def self_method_name() name = if self_method_definition[1].instance_of?(Symbol) then
|
108
|
+
self_method_definition[1].to_s
|
109
|
+
else
|
110
|
+
((self_method_definition[1].select { |e| e.instance_of?(Symbol) }.map do |e|
|
111
|
+
e.to_s
|
112
|
+
end.join(".") + ".") + self_method_definition[2].to_s)
|
113
|
+
end
|
114
|
+
(if defining_role then
|
115
|
+
((("self_" + @defining_role.to_s) + "_") + name.to_s)
|
116
|
+
else
|
117
|
+
name
|
118
|
+
end).to_sym
|
119
|
+
end
|
120
|
+
def self_method_generated_source() AstRewritter.new(self_method_body, interpretation_context).rewrite!
|
121
|
+
body = Ruby2Ruby.new.process(self_method_body)
|
122
|
+
raise("Body is undefined") unless body
|
123
|
+
args = self_method_arguments
|
124
|
+
if args and args.length then
|
125
|
+
args = (("(" + args.join(",")) + ")")
|
126
|
+
else
|
127
|
+
args = ""
|
128
|
+
end
|
129
|
+
header = (("def " + self_method_name.to_s) + args)
|
130
|
+
(((header + " ") + body) + " end\n")
|
131
|
+
end
|
132
|
+
attr_reader :private_interactions, :context_name, :roles, :interactions, :method_name, :defining_role, :method
|
90
133
|
|
91
|
-
|
92
|
-
if @default then
|
93
|
-
(((((((((("\n def self.call(*args)\n arity = " + name.to_s) + ".method(:new).arity\n newArgs = args[0..arity-1]\n obj = ") + name.to_s) + ".new *newArgs\n if arity < args.length\n methodArgs = args[arity..-1]\n obj.") + default.to_s) + " *methodArgs\n else\n obj.") + default.to_s) + "\n end\n end\n def call(*args);") + default.to_s) + " *args; end\n")
|
94
|
-
else
|
95
|
-
""
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def self_method_is_private?()
|
100
|
-
(defining_role.!=(nil) or private_interactions.has_key?(self_method_name))
|
101
|
-
end
|
102
|
-
|
103
|
-
def self_method_definition()
|
104
|
-
key = ((@defining_role ? (@defining_role.to_s) : ("")) + method_name.to_s)
|
105
|
-
return @definitions[key] if @definitions.has_key?(key)
|
106
|
-
unless method.instance_of?(Sexp) then
|
107
|
-
unless method.instance_of?(Array) and (method.length < 2) then
|
108
|
-
raise((((("Duplicate definition of " + method_name.to_s) + "(") + method.to_s) + ")"))
|
109
|
-
end
|
110
|
-
unless method.instance_of?(Array) and (method.length > 0) then
|
111
|
-
raise(("No source for " + method_name.to_s))
|
112
|
-
end
|
113
|
-
end
|
114
|
-
d = method.instance_of?(Array) ? (method[0]) : (method)
|
115
|
-
raise("Sexp require") unless d.instance_of?(Sexp)
|
116
|
-
@definitions[key] = d
|
117
|
-
end
|
118
|
-
|
119
|
-
def self_method_body()
|
120
|
-
args = self_method_definition.detect { |d| (d[0] == :args) }
|
121
|
-
index = (self_method_definition.index(args) + 1)
|
122
|
-
if (self_method_definition.length > (index + 1)) then
|
123
|
-
body = self_method_definition[(index..-1)]
|
124
|
-
body.insert(0, :block)
|
125
|
-
body
|
126
|
-
else
|
127
|
-
self_method_definition[index]
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
def self_method_arguments()
|
132
|
-
args = self_method_definition.detect { |d| (d[0] == :args) }
|
133
|
-
args and (args.length > 1) ? (args[(1..-1)]) : ([])
|
134
|
-
end
|
135
|
-
|
136
|
-
def self_method_name()
|
137
|
-
name = if self_method_definition[1].instance_of?(Symbol) then
|
138
|
-
self_method_definition[1].to_s
|
139
|
-
else
|
140
|
-
((self_method_definition[1].select { |e| e.instance_of?(Symbol) }.map do |e|
|
141
|
-
e.to_s
|
142
|
-
end.join(".") + ".") + self_method_definition[2].to_s)
|
143
|
-
end
|
144
|
-
(
|
145
|
-
if defining_role then
|
146
|
-
((("self_" + @defining_role.to_s) + "_") + name.to_s)
|
147
|
-
else
|
148
|
-
name
|
149
|
-
end).to_sym
|
150
|
-
end
|
151
|
-
|
152
|
-
def self_method_generated_source()
|
153
|
-
AstRewritter.new(self_method_body, interpretation_context).rewrite!
|
154
|
-
body = Ruby2Ruby.new.process(self_method_body)
|
155
|
-
raise("Body is undefined") unless body
|
156
|
-
args = self_method_arguments
|
157
|
-
if args and args.length then
|
158
|
-
args = (("(" + args.join(",")) + ")")
|
159
|
-
else
|
160
|
-
args = ""
|
161
|
-
end
|
162
|
-
header = (("def " + self_method_name.to_s) + args)
|
163
|
-
(((header + " ") + body) + " end\n")
|
164
|
-
end
|
165
|
-
|
166
|
-
attr_reader :private_interactions
|
167
|
-
attr_reader :context_name
|
168
|
-
attr_reader :roles
|
169
|
-
attr_reader :interactions
|
170
|
-
attr_reader :method_name
|
171
|
-
attr_reader :defining_role
|
172
|
-
attr_reader :method
|
173
|
-
|
174
|
-
end
|
134
|
+
end
|