maroon 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|