cauldron 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +6 -0
- data/Gemfile.lock +63 -0
- data/History.md +5 -0
- data/Rakefile +62 -16
- data/VERSION +1 -1
- data/cauldron.gemspec +463 -0
- data/cauldron/lib/cauldron.rb +1 -1
- data/features/cauldron_generates_runtime_method.feature +7 -4
- data/features/cauldron_generates_single_paramter_methods.feature +25 -0
- data/features/cauldron_interactive_start_terminal.feature +17 -0
- data/features/cauldron_quit_terminal.feature +9 -0
- data/features/cauldron_start_terminal.feature +0 -1
- data/features/step_definitions/cauldron_steps.rb +10 -5
- data/features/step_definitions/terminal_steps.rb +27 -0
- data/features/support/env.rb +2 -0
- data/features/support/hooks.rb +15 -0
- data/lib/Chain.rb +3 -3
- data/lib/Mapping.rb +1 -0
- data/lib/PartialChain.rb +253 -0
- data/lib/Theory.rb +28 -4
- data/lib/UnifiedChain.rb +94 -125
- data/lib/cauldron.rb +3 -0
- data/lib/cauldron/demos.rb +4 -4
- data/lib/cauldron/env.rb +1 -0
- data/lib/cauldron/pot.rb +42 -38
- data/lib/cauldron/terminal.rb +19 -3
- data/lib/cauldron/util/home.rb +21 -0
- data/lib/cauldron/util/saver.rb +45 -0
- data/lib/core/Container.rb +1 -1
- data/lib/core/runtime_method/ActsAsRuntimeMethod.rb +28 -28
- data/lib/core/runtime_method/RuntimeMethod.rb +6 -23
- data/lib/core/statement/ActsAsStatement.rb +0 -96
- data/lib/core/statement/BlockStatement.rb +1 -1
- data/lib/core/statement/OpenStatement.rb +1 -1
- data/lib/core/statement/Statement.rb +39 -94
- data/lib/core/statement/TheoryStatement.rb +1 -1
- data/lib/core/syntax/BlockContainer.rb +0 -28
- data/lib/core/variable/MethodParameter.rb +1 -1
- data/lib/required.rb +2 -14
- data/lib/theories.rb +0 -1
- data/lib/theory/ActionImplementation.rb +1 -1
- data/lib/theory/TheoryAction.rb +2 -2
- data/lib/theory/TheoryConnector.rb +11 -14
- data/lib/theory/TheoryImplementation.rb +10 -9
- data/lib/util/MethodWriter.rb +10 -10
- data/sandbox.rb +23 -0
- data/spec/cauldron/pot_spec.rb +62 -10
- data/spec/cauldron/runtime_method_spec.rb +31 -17
- data/spec/cauldron/saver_spec.rb +45 -0
- data/spec/cauldron/terminal_spec.rb +10 -1
- data/spec/cauldron/theory_spec.rb +4 -4
- data/spec/cauldron/unified_chain_spec.rb +38 -0
- data/spec/spec_helper.rb +3 -1
- data/tasks/development_tasks.rake +4 -0
- data/tasks/theory_tasks.rake +16 -20
- data/test/fixtures/theories/0/desc +6 -6
- data/test/fixtures/theories/0/dump +0 -0
- data/test/fixtures/theories/1/desc +7 -7
- data/test/fixtures/theories/1/dump +0 -0
- data/test/fixtures/theories/10/desc +13 -13
- data/test/fixtures/theories/10/dump +0 -0
- data/test/fixtures/theories/11/desc +10 -10
- data/test/fixtures/theories/11/dump +0 -0
- data/test/fixtures/theories/12/desc +9 -9
- data/test/fixtures/theories/12/dump +0 -0
- data/test/fixtures/theories/13/desc +16 -16
- data/test/fixtures/theories/13/dump +0 -0
- data/test/fixtures/theories/14/desc +16 -16
- data/test/fixtures/theories/14/dump +0 -0
- data/test/fixtures/theories/15/desc +10 -10
- data/test/fixtures/theories/15/dump +0 -0
- data/test/fixtures/theories/16/desc +10 -10
- data/test/fixtures/theories/16/dump +0 -0
- data/test/fixtures/theories/17/desc +7 -7
- data/test/fixtures/theories/17/dump +0 -0
- data/test/fixtures/theories/18/desc +7 -7
- data/test/fixtures/theories/18/dump +0 -0
- data/test/fixtures/theories/19/desc +7 -7
- data/test/fixtures/theories/19/dump +0 -0
- data/test/fixtures/theories/2/desc +6 -6
- data/test/fixtures/theories/2/dump +0 -0
- data/test/fixtures/theories/20/desc +13 -13
- data/test/fixtures/theories/20/dump +0 -0
- data/test/fixtures/theories/3/desc +7 -7
- data/test/fixtures/theories/3/dump +0 -0
- data/test/fixtures/theories/4/desc +7 -7
- data/test/fixtures/theories/4/dump +0 -0
- data/test/fixtures/theories/5/desc +6 -6
- data/test/fixtures/theories/5/dump +0 -0
- data/test/fixtures/theories/6/desc +7 -7
- data/test/fixtures/theories/6/dump +0 -0
- data/test/fixtures/theories/7/desc +7 -7
- data/test/fixtures/theories/7/dump +0 -0
- data/test/fixtures/theories/8/desc +7 -7
- data/test/fixtures/theories/8/dump +0 -0
- data/test/fixtures/theories/9/desc +16 -16
- data/test/fixtures/theories/9/dump +0 -0
- data/test/fixtures/theory_implementations/0/dump +0 -0
- data/test/fixtures/theory_implementations/2/dump +0 -0
- data/test/ts_complete.rb +1 -10
- data/test/unit/core/runtime_method/tc_realised_runtime_method.rb +1 -0
- data/test/unit/core/runtime_method/tc_runtime_method.rb +16 -39
- data/test/unit/core/statement/tc_block_statement.rb +3 -3
- data/test/unit/core/statement/tc_open_statement.rb +4 -4
- data/test/unit/core/statement/tc_statement.rb +2 -147
- data/test/unit/core/statement/tc_theory_statement.rb +1 -1
- data/test/unit/theory/tc_theory_dependent.rb +3 -3
- data/test/unit/theory/tc_theory_result.rb +5 -5
- data/test/unit/util/tc_method_validation.rb +45 -45
- data/test/unit/util/tc_parser.rb +1 -1
- data/test/unit/util/tc_string_to_theory.rb +2 -2
- metadata +74 -48
- data/lib/ScopeDependencies.rb +0 -8
- data/lib/core/statement/StatementDependencies.rb +0 -271
- data/lib/core/structure/DeclareNewInstanceStructure.rb +0 -49
- data/lib/core/structure/DeclareRuntimeMethodStructure.rb +0 -34
- data/lib/core/structure/DeclareVariableAsLiteralStructure.rb +0 -31
- data/lib/core/structure/DeclareVariableAsVariableStructure.rb +0 -52
- data/lib/core/structure/FixnumAdditionStructure.rb +0 -56
- data/lib/core/structure/InstanceCallContainerStructure.rb +0 -50
- data/lib/core/structure/InstanceCallStructure.rb +0 -53
- data/lib/core/structure/InstanceMethodCallStructure.rb +0 -21
- data/lib/core/structure/ReturnStructure.rb +0 -20
- data/lib/core/structure/StatementStructure.rb +0 -11
- data/test/unit/core/statement/tc_statement_dependencies.rb +0 -147
- data/test/unit/core/structure/tc_declare_new_instance_structure.rb +0 -41
- data/test/unit/core/structure/tc_declare_variable_as_literal_structure.rb +0 -41
- data/test/unit/core/structure/tc_declare_variable_as_variable_structure.rb +0 -66
- data/test/unit/core/structure/tc_instance_call_container_structure.rb +0 -41
- data/test/unit/core/structure/tc_return_structure.rb +0 -32
- data/test/unit/tc_instance_call_structure.rb +0 -35
- data/test/unit/tc_statement_structure_2.rb +0 -43
data/lib/ScopeDependencies.rb
DELETED
@@ -1,271 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# TODO I might just make this part of StatementGroup
|
3
|
-
#
|
4
|
-
# TODO TSort examples show a single use. So you basically add all your variables
|
5
|
-
# and then sort them once. Rather than what I'm doing which is to attempt
|
6
|
-
# to find the dependencies for particular statements. It might be better
|
7
|
-
# to rebuild the dependies each time and then do a single sort.
|
8
|
-
|
9
|
-
# Include a scope dependencies as well - if a statement resides within a nested statement
|
10
|
-
# the nested statement must come first.
|
11
|
-
#
|
12
|
-
# New statement: - statement level: 183
|
13
|
-
# var_5918 = var_652 + var_658
|
14
|
-
#
|
15
|
-
# Pre-requiste statements:
|
16
|
-
# var_34 = method_13
|
17
|
-
# var_34.times do |var_658|
|
18
|
-
# end
|
19
|
-
# var_652 = var_34 + var_34
|
20
|
-
|
21
|
-
# In this case the scope means that the nested "var_34.times do |var_658|" is dependent
|
22
|
-
# on var_652 = var_34 + var_34.
|
23
|
-
#
|
24
|
-
# # Find the statement that contains this statement - if it exists
|
25
|
-
# self.each do |x|
|
26
|
-
# if x.kind_of?(BlockStatement)
|
27
|
-
# if x.scope_id == statement.statement_level
|
28
|
-
#
|
29
|
-
# # Apply the dependencies for the statement to the containing statement
|
30
|
-
# # unless it's the containing statement itself.
|
31
|
-
#
|
32
|
-
# end
|
33
|
-
# end
|
34
|
-
# end
|
35
|
-
#
|
36
|
-
class StatementDependencies < Array
|
37
|
-
#include TSort # See p750
|
38
|
-
|
39
|
-
alias :array_push :push
|
40
|
-
|
41
|
-
def initialize(*params)
|
42
|
-
super()
|
43
|
-
#@dependencies = {}
|
44
|
-
|
45
|
-
# Add the statements
|
46
|
-
params.each {|x| self.push(x)}
|
47
|
-
end
|
48
|
-
|
49
|
-
# TODO Write about this in more detail
|
50
|
-
#
|
51
|
-
def tsort_for_statement(statement)
|
52
|
-
|
53
|
-
@statement_sort = TopologicalStatements.new
|
54
|
-
add_dependent_statements(@statement_sort,statement)
|
55
|
-
|
56
|
-
# TODO Should probably copy the @statement_sort before itterating through it
|
57
|
-
#
|
58
|
-
each_used_nest_statement(@statement_sort,statement) do |x|
|
59
|
-
# CONTINUE - Why are these nested statements populated
|
60
|
-
|
61
|
-
# Find statements that have the same scope as this
|
62
|
-
each_nested_statement(@statement_sort,statement,x.scope_id) do |y|
|
63
|
-
|
64
|
-
# Add the inner statement dependencies onto the nested statement
|
65
|
-
@statement_sort[x.statement_id] += @statement_sort[y.statement_id]
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
return @statement_sort.tsort
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
def dependencies_for(statement_id)
|
75
|
-
|
76
|
-
# Check that the statement exists
|
77
|
-
unknown_statement_id = lambda {raise StandardError.new('Could\'nt find statement_id '+statement_id.to_s)}
|
78
|
-
self.detect(unknown_statement_id) {|x| x.statement_id == statement_id}
|
79
|
-
|
80
|
-
#
|
81
|
-
@statement_sort = TopologicalStatements.new
|
82
|
-
|
83
|
-
# First find the initial statement
|
84
|
-
initial_statement = find_statement(statement_id)
|
85
|
-
add_dependent_statements(@statement_sort,initial_statement)
|
86
|
-
|
87
|
-
|
88
|
-
return @statement_sort.tsort
|
89
|
-
end
|
90
|
-
|
91
|
-
def add_dependent_statements(tsort,statement)
|
92
|
-
dependencies = find_dependencies_for(statement)
|
93
|
-
tsort[statement.statement_id] = dependencies
|
94
|
-
|
95
|
-
# Find the dependiencies for the
|
96
|
-
dependencies.each do |x|
|
97
|
-
add_dependent_statements(tsort,find_statement(x))
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def find_statement(id)
|
102
|
-
self.each do |x|
|
103
|
-
if x.statement_id == id
|
104
|
-
return x
|
105
|
-
end
|
106
|
-
end
|
107
|
-
# TODO Should raise error here
|
108
|
-
end
|
109
|
-
|
110
|
-
# Returns an array of statement ids of all the statements that the supplied
|
111
|
-
# statement is dependent on.
|
112
|
-
#
|
113
|
-
# @param statement A statement instance thats dependencies are returned
|
114
|
-
#
|
115
|
-
def find_dependencies_for(statement)
|
116
|
-
results = []
|
117
|
-
statement.not_declared_variables.each do |x|
|
118
|
-
|
119
|
-
# Find the original declaration statement
|
120
|
-
# TODO Doesn't catch no results
|
121
|
-
statement_ids = self.inject([]) do |ids,y|
|
122
|
-
#ids.push(y.statement_id) if x.uniq_id == y.created_variable.uniq_id
|
123
|
-
if x.uniq_id == y.created_variable.uniq_id
|
124
|
-
# TODO Quick hack to prevent bug
|
125
|
-
ids.push(y.statement_id) unless statement.statement_id == y.statement_id
|
126
|
-
end
|
127
|
-
ids
|
128
|
-
end
|
129
|
-
|
130
|
-
# Find any further required uniq ids
|
131
|
-
x.uniq_id_history.each do |y|
|
132
|
-
# TODO Change to detect since this presumes a result is found
|
133
|
-
statement_ids.push(self.select {|z| z.created_variable.uniq_id == y}.first.statement_id)
|
134
|
-
end
|
135
|
-
raise StandardError.new('Can\'t find the declaration of '+x.write+' or '+x.write_with_uniq_id) if statement_ids.empty?
|
136
|
-
results += statement_ids
|
137
|
-
results.each do |y|
|
138
|
-
raise StandardError.new('dksafkjdashfkahsdf '+statement.statement_id.to_s) if(y==statement.statement_id)
|
139
|
-
end
|
140
|
-
# # TODO Change to catch :found
|
141
|
-
# found = false
|
142
|
-
# self.each do |y|
|
143
|
-
# #if x.variable_id == y.declared_variable_id
|
144
|
-
# if x.uniq_id == y.created_variable.uniq_id
|
145
|
-
# found = true
|
146
|
-
# results.push(y.statement_id)
|
147
|
-
# break
|
148
|
-
# end
|
149
|
-
# end
|
150
|
-
# raise StandardError.new('Can\'t find the declaration of '+x.write+' or '+x.write_with_uniq_id) unless found
|
151
|
-
end
|
152
|
-
return results
|
153
|
-
end
|
154
|
-
|
155
|
-
# Saves any of the statements thats dependencies are being
|
156
|
-
# saved.
|
157
|
-
#
|
158
|
-
# @param statement
|
159
|
-
#
|
160
|
-
def push(statement)
|
161
|
-
|
162
|
-
# Check that any statements this statement is dependent on is included
|
163
|
-
find_dependencies_for(statement)
|
164
|
-
|
165
|
-
# Add the new piece of code to the statement
|
166
|
-
array_push(statement)
|
167
|
-
|
168
|
-
end
|
169
|
-
|
170
|
-
# Returns the saved statement based on the statement id provided
|
171
|
-
#
|
172
|
-
# @param statement_id The statement id of the stored statement.
|
173
|
-
#
|
174
|
-
def find_statement(statement_id,new_statement=nil)
|
175
|
-
unless new_statement.nil?
|
176
|
-
return new_statement if new_statement.statement_id == statement_id
|
177
|
-
end
|
178
|
-
return self.detect {|x| x.statement_id == statement_id}
|
179
|
-
end
|
180
|
-
|
181
|
-
# Returns a string to be printed out for the general use of
|
182
|
-
# debugging.
|
183
|
-
#
|
184
|
-
# @param topsort Topological sort containing the dependencies
|
185
|
-
# for each statement.
|
186
|
-
# @param statements An array of statements that have already been
|
187
|
-
# saved.
|
188
|
-
# @param new_statement The new statement that has yet to be included
|
189
|
-
# in a large method and hasn't been realised yet.
|
190
|
-
#
|
191
|
-
def display_statement_dependencies(topsort,statements,new_statement)
|
192
|
-
msg = ''
|
193
|
-
msg += topsort.inspect+"\n"
|
194
|
-
topsort.each_key do |x|
|
195
|
-
msg += x.to_s+"\n"
|
196
|
-
msg += find_statement(x,new_statement).write+"\n"
|
197
|
-
end
|
198
|
-
return msg
|
199
|
-
end
|
200
|
-
|
201
|
-
# Modifies the supplied topological sort to include scope dependency. This
|
202
|
-
# basically involves applying the dependencies of nested statements to
|
203
|
-
# the containing statement. e.g.
|
204
|
-
#
|
205
|
-
# var_a = 6
|
206
|
-
# 5.times do |var_b|
|
207
|
-
# var_c = var_b+var_a
|
208
|
-
# end
|
209
|
-
#
|
210
|
-
# So "var_c = var_b+var_a" is dependent on the two proceeding statements but
|
211
|
-
# sequentially they could be written as
|
212
|
-
#
|
213
|
-
# 5.times do |var_b|
|
214
|
-
# var_a = 6
|
215
|
-
# var_c = var_b+var_a
|
216
|
-
#
|
217
|
-
# But when put it into its particular nest we end up with
|
218
|
-
#
|
219
|
-
# 5.times do |var_b|
|
220
|
-
# var_c = var_b+var_a
|
221
|
-
# end
|
222
|
-
# var_a = 6
|
223
|
-
#
|
224
|
-
# @param topsort Topoligical sort indicating an ordering dependencey
|
225
|
-
# @param new_statement The new statement that is yet to saved internally
|
226
|
-
# (because it hasn't been realised)
|
227
|
-
#
|
228
|
-
def apply_scope_dependencies(topsort,new_statement)
|
229
|
-
|
230
|
-
# Find each nest statement and then any statements contained within
|
231
|
-
each_used_nested_statement(topsort,new_statement) do |x|
|
232
|
-
# CONTIUE
|
233
|
-
end
|
234
|
-
|
235
|
-
end
|
236
|
-
|
237
|
-
# Yeilds each nested statement. Despite the naming convention a nested
|
238
|
-
# statement is really a nest statement. NOTE This is not every contained
|
239
|
-
# NestStatement but rather those used.
|
240
|
-
#
|
241
|
-
# TODO NestStatement would be a more reflective name - after all the statements
|
242
|
-
# within the statement are nested.
|
243
|
-
#
|
244
|
-
def each_used_nest_statement(topsort,new_statement)
|
245
|
-
topsort.each_key do |x|
|
246
|
-
found_statement = find_statement(x,new_statement)
|
247
|
-
yield found_statement if found_statement.kind_of?(BlockStatement)
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
# Yeilds each statement that is nested within the scope specified
|
252
|
-
#
|
253
|
-
# @param topsort The has containing each relevent statement id as well
|
254
|
-
# as there dependencies.
|
255
|
-
# @param statement The statement in the process of being added. It needs
|
256
|
-
# passed since is not yet saved within this class.
|
257
|
-
# @param scope_id The scope id of the nest statement that contains the
|
258
|
-
# nested statements.
|
259
|
-
#
|
260
|
-
def each_nested_statement(topsort,new_statement,scope_id)
|
261
|
-
topsort.each_key do |x|
|
262
|
-
found_statement = find_statement(x,new_statement)
|
263
|
-
# TODO I need to clarify the terms ,scope,scope_id and statement_level
|
264
|
-
# - I think one can at least go or at least have less confusing names.
|
265
|
-
if found_statement.statement_level == scope_id
|
266
|
-
yield found_statement
|
267
|
-
end
|
268
|
-
end
|
269
|
-
end
|
270
|
-
|
271
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
# Returns statements that declare new instances of the available classes
|
2
|
-
#
|
3
|
-
# Example:
|
4
|
-
# var_a = MethodUsage.new
|
5
|
-
# var_b = RuntimeMethod.new(var_a)
|
6
|
-
#
|
7
|
-
class DeclareNewInstanceStructure < StatementStructure
|
8
|
-
|
9
|
-
#
|
10
|
-
# @param available_classes Any number of class instances that can be used
|
11
|
-
# when generating statements, e.g. MethodUsageClass.new
|
12
|
-
#
|
13
|
-
def initialize(*available_classes)
|
14
|
-
super()
|
15
|
-
available_classes.each {|x| self.push(x)}
|
16
|
-
end
|
17
|
-
|
18
|
-
# Returns an array of instance declaration statements using
|
19
|
-
# the available variables.
|
20
|
-
#
|
21
|
-
# @param available An array of variables that are made available
|
22
|
-
# when declaring new statements.
|
23
|
-
#
|
24
|
-
def statements(available=[])
|
25
|
-
|
26
|
-
# Get all the various arrangements of parameters at all the lengths (capped at 5)
|
27
|
-
arrangements = [[]]
|
28
|
-
|
29
|
-
# Add one of each available variable
|
30
|
-
available.each do |x|
|
31
|
-
arrangements.push([x])
|
32
|
-
end
|
33
|
-
|
34
|
-
# For each arrangement create a new statement declaration
|
35
|
-
results = []
|
36
|
-
|
37
|
-
# Create a number of declaration statements using the method classes
|
38
|
-
# e.g. Unknown.new,Equal.new,ClassMethodCallContainer.new(MethodUsageClass.new,New.new)
|
39
|
-
self.each do |x|
|
40
|
-
x.class_method_calls(available).each do |y|
|
41
|
-
new_statement = Statement.new(Unknown.new,Equal.new,y)
|
42
|
-
results.push(new_statement)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
return results
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# TODO I think this structure has been super seeded by DeclareVariableAsVariableStructure
|
2
|
-
# Example - where the method_a returns a RuntimeMethod instance
|
3
|
-
#
|
4
|
-
# var_a = method_a()
|
5
|
-
#
|
6
|
-
class DeclareRuntimeMethodStructure < StatementStructure
|
7
|
-
|
8
|
-
def initialize()
|
9
|
-
super([Unknown,Equal,RuntimeMethodParameter])
|
10
|
-
end
|
11
|
-
|
12
|
-
# Returns an array of possible statements that can be created
|
13
|
-
# using the available variables. Currently the only way to
|
14
|
-
# create runtime method instances is via a separate runtime
|
15
|
-
# method call.
|
16
|
-
#
|
17
|
-
# @param available An array of variables that can be used to
|
18
|
-
# to create the statements that declared new
|
19
|
-
# runtime variables.
|
20
|
-
#
|
21
|
-
def statements(available=[])
|
22
|
-
return [] if available.empty?
|
23
|
-
def_calls = available.find_all {|x| x.kind_of?(DefCall)}
|
24
|
-
results = []
|
25
|
-
def_calls.each do |x|
|
26
|
-
if x.response.class == RuntimeMethodParameter
|
27
|
-
new_statement = Statement.new(Unknown.new,Equal.new,x.copy)
|
28
|
-
results.push(new_statement)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
return results
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Example
|
3
|
-
#
|
4
|
-
# var = 6
|
5
|
-
# var = 'Shepard'
|
6
|
-
# var = []
|
7
|
-
#
|
8
|
-
class DeclareVariableAsLiteralStructure < StatementStructure
|
9
|
-
|
10
|
-
def initialize(*available_literals)
|
11
|
-
super([Unknown,Equal,Literal])
|
12
|
-
@available_literals = available_literals
|
13
|
-
end
|
14
|
-
|
15
|
-
# TODO Write tests for this
|
16
|
-
# Returns an array of possible statements that can be created
|
17
|
-
# given the variables supplied.
|
18
|
-
#
|
19
|
-
# @param available An array of possible variables that can be used to generate
|
20
|
-
# new statements. Although for this structure it is only
|
21
|
-
# interested in the literals.
|
22
|
-
#
|
23
|
-
def statements(available=[])
|
24
|
-
combined_available = @available_literals + available
|
25
|
-
return [] if combined_available.empty?
|
26
|
-
literals = combined_available.find_all {|x| x.kind_of?(Literal)}
|
27
|
-
results = literals.collect {|x| Statement.new(Unknown.new,Equal.new,x) }
|
28
|
-
return results
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
# NOTE: I'm not certain whether these types of strucutres are actually necessary
|
2
|
-
# but they did exist when I was using StatementStrucuture2.rb
|
3
|
-
#
|
4
|
-
# Example
|
5
|
-
#
|
6
|
-
# var_b = var_a
|
7
|
-
# var_c = var_b
|
8
|
-
# var_e = var_b.chop
|
9
|
-
|
10
|
-
class DeclareVariableAsVariableStructure < StatementStructure
|
11
|
-
|
12
|
-
def initialize()
|
13
|
-
super([Unknown,Equal,TypeVariable])
|
14
|
-
end
|
15
|
-
|
16
|
-
# Returns an array of statements constructed using the supplied
|
17
|
-
# variables.
|
18
|
-
#
|
19
|
-
def statements(available=[])
|
20
|
-
return [] if available.empty?
|
21
|
-
variables = available.select {|x| x.kind_of?(TypeVariable)}
|
22
|
-
|
23
|
-
# Generate all the possible direct variable declarations e.g. var_a = var_b
|
24
|
-
direct_declarations = variables.collect {|x| Statement.new(Unknown.new,Equal.new,x.copy)}
|
25
|
-
|
26
|
-
# Generate all the possible instance call declarations - I'm not sure if this will be used in this way
|
27
|
-
results = variables.collect do |x|
|
28
|
-
result = x.returning_instance_calls(available).collect do |y|
|
29
|
-
Statement.new(Unknown.new,Equal.new,y)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
# TODO This seems a bit sloppy - I should do it in a nicer way
|
34
|
-
instance_call_declarations = []
|
35
|
-
results.each do |x|
|
36
|
-
x.each {|y| instance_call_declarations.push(y)}
|
37
|
-
end
|
38
|
-
|
39
|
-
# Find all the possible method calss
|
40
|
-
# TODO Write tests for this method call bit
|
41
|
-
# TODO This doesn't allow for parameters
|
42
|
-
available.each do |x|
|
43
|
-
if x.kind_of?(DefCall)
|
44
|
-
instance_call_declarations.push(Statement.new(Unknown.new,Equal.new,x.copy))
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
return direct_declarations.concat(instance_call_declarations)
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|