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/cauldron/terminal.rb
CHANGED
@@ -9,6 +9,14 @@ module Cauldron
|
|
9
9
|
|
10
10
|
def initialize(output,auto=true)
|
11
11
|
@output, @cases, @auto = output, [], auto
|
12
|
+
|
13
|
+
# Create a logger for the user inputs
|
14
|
+
#file = File.open('user-input.log', File::WRONLY | File::APPEND)
|
15
|
+
file = File.open('user-input.log', 'w+')
|
16
|
+
# To create new (and to remove old) logfile, add File::CREAT like;
|
17
|
+
# file = open('foo.log', File::WRONLY | File::APPEND | File::CREAT)
|
18
|
+
@user_logger = Logger.new(file)
|
19
|
+
|
12
20
|
end
|
13
21
|
|
14
22
|
def start
|
@@ -26,21 +34,29 @@ module Cauldron
|
|
26
34
|
@output.puts "input,input,output"
|
27
35
|
@output.puts "For example "
|
28
36
|
@output.puts "'fish','animal'"
|
29
|
-
@output.puts "'cat','animal'"
|
30
37
|
@output.puts "'carrot','vegtable'"
|
31
38
|
@output.puts "and when you're done just type RUN"
|
32
|
-
|
39
|
+
|
33
40
|
# Wait for the user's inputs
|
34
41
|
unless @auto
|
35
42
|
loop do
|
36
43
|
submit gets
|
37
44
|
end
|
38
45
|
end
|
46
|
+
|
39
47
|
end
|
40
48
|
|
41
49
|
def submit(input)
|
50
|
+
|
51
|
+
@user_logger.info input
|
52
|
+
|
42
53
|
if input =~ /^RUN$/
|
43
|
-
|
54
|
+
@output.puts @pot.brew(@cases).reset_ids!.basic_write
|
55
|
+
elsif input =~ /^QUIT$/
|
56
|
+
# => TODO Include 'bye' output too
|
57
|
+
#Process.exit!(true)
|
58
|
+
at_exit {0}
|
59
|
+
exit
|
44
60
|
else
|
45
61
|
@cases << convert_to_example(separate_values(input))
|
46
62
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Cauldron
|
2
|
+
|
3
|
+
module Util
|
4
|
+
|
5
|
+
module Home
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
# Check that the home directory exists
|
10
|
+
def home
|
11
|
+
realHome = ["HOME", "HOMEPATH"].detect {|h| ENV[h] != nil}
|
12
|
+
if not realHome
|
13
|
+
StandardLogger.instance.warning "Couldn't detect a home directory"
|
14
|
+
end
|
15
|
+
return ENV[realHome]
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Cauldron::Util::Saver
|
2
|
+
|
3
|
+
def self.save(obj)
|
4
|
+
dir_path = FileUtils.mkdir(next_directory).first
|
5
|
+
begin
|
6
|
+
dump_file_path = File.join(dir_path,'dump')
|
7
|
+
dump_file = File.open(dump_file_path,'w+')
|
8
|
+
data = Marshal.dump(obj)
|
9
|
+
dump_file << data
|
10
|
+
return dump_file_path
|
11
|
+
ensure
|
12
|
+
dump_file.close
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.debug_directory
|
17
|
+
# the home directory code is duplicated
|
18
|
+
realHome = ["HOME", "HOMEPATH"].detect {|h| ENV[h] != nil}
|
19
|
+
if not realHome
|
20
|
+
StandardLogger.instance.warning "Couldn't detect a home directory"
|
21
|
+
end
|
22
|
+
return File.join(ENV[realHome],'cauldron','debug')
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.next_directory
|
26
|
+
FileUtils.mkdir(debug_directory) unless File.exists?(debug_directory)
|
27
|
+
highest_integer = 0
|
28
|
+
Dir.glob(File.join(debug_directory,'*')).each do |filename|
|
29
|
+
if filename.match(/(\d+)/)
|
30
|
+
highest_integer = $1.to_i if $1.to_i > highest_integer
|
31
|
+
end
|
32
|
+
end
|
33
|
+
return File.join(debug_directory,(highest_integer + 1).to_s)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.load(id)
|
37
|
+
Dir.glob(File.join(debug_directory,'*')).each do |filename|
|
38
|
+
if m = filename.match(/(\d+)/) and m[0].to_i == id
|
39
|
+
dump_file = File.open(File.join(filename,'dump'),'r')
|
40
|
+
return Marshal.load(dump_file.read)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
data/lib/core/Container.rb
CHANGED
@@ -91,15 +91,15 @@ module ActsAsRuntimeMethod
|
|
91
91
|
raise StandardError.new('Incorrect use of write ') if params.kind_of?(Fixnum)
|
92
92
|
|
93
93
|
line = "\n"
|
94
|
-
tab.times {|x| line += "
|
94
|
+
tab.times {|x| line += " " }
|
95
95
|
line += "#\n"
|
96
96
|
|
97
97
|
if params.nil?
|
98
98
|
|
99
99
|
@usage.each_with_index do |var,i|
|
100
100
|
|
101
|
-
tab.times {|x| line += "
|
102
|
-
line += "
|
101
|
+
tab.times {|x| line += " " }
|
102
|
+
line += "# @param "
|
103
103
|
|
104
104
|
# Get a description of the requirements (this can multiple lines)
|
105
105
|
line_prefix = ''
|
@@ -108,8 +108,8 @@ module ActsAsRuntimeMethod
|
|
108
108
|
line += line_prefix+l
|
109
109
|
|
110
110
|
# Assides the first line pre-fix a "# " to the start
|
111
|
-
(tab-1).times {|x| line += "
|
112
|
-
line_prefix = "
|
111
|
+
(tab-1).times {|x| line += " " }
|
112
|
+
line_prefix = "# "
|
113
113
|
|
114
114
|
end
|
115
115
|
|
@@ -118,8 +118,8 @@ module ActsAsRuntimeMethod
|
|
118
118
|
else
|
119
119
|
|
120
120
|
params.each_with_index do |var,i|
|
121
|
-
tab.times {|x| line += "
|
122
|
-
line += "
|
121
|
+
tab.times {|x| line += " " }
|
122
|
+
line += "# @param "
|
123
123
|
|
124
124
|
# Get a description of the requirements (this can multiple lines)
|
125
125
|
line_prefix = ''
|
@@ -129,8 +129,8 @@ module ActsAsRuntimeMethod
|
|
129
129
|
line += line_prefix+l
|
130
130
|
|
131
131
|
# Assides the first line pre-fix a "# " to the start
|
132
|
-
(tab-1).times {|x| line += "
|
133
|
-
line_prefix = "
|
132
|
+
(tab-1).times {|x| line += " " }
|
133
|
+
line_prefix = "# "
|
134
134
|
|
135
135
|
end
|
136
136
|
|
@@ -140,16 +140,16 @@ module ActsAsRuntimeMethod
|
|
140
140
|
|
141
141
|
# Add some some additional comment if supplied
|
142
142
|
unless additional_comments.nil?
|
143
|
-
tab.times {|x| line += "
|
143
|
+
tab.times {|x| line += " " }
|
144
144
|
line += "#"
|
145
|
-
tab.times {|x| line += "
|
145
|
+
tab.times {|x| line += " " }
|
146
146
|
line += additional_comments+"\n"
|
147
147
|
end
|
148
148
|
|
149
|
-
tab.times {|x| line += "
|
149
|
+
tab.times {|x| line += " " }
|
150
150
|
line += "#\n"
|
151
151
|
|
152
|
-
tab.times {|x| line += "
|
152
|
+
tab.times {|x| line += " "}
|
153
153
|
line += basic_write(tab)
|
154
154
|
|
155
155
|
end
|
@@ -168,7 +168,7 @@ module ActsAsRuntimeMethod
|
|
168
168
|
end
|
169
169
|
|
170
170
|
# Close the method
|
171
|
-
tab.times {|x| line += "
|
171
|
+
tab.times {|x| line += " " }
|
172
172
|
line += "end"+"\n"
|
173
173
|
|
174
174
|
return line
|
@@ -185,15 +185,15 @@ module ActsAsRuntimeMethod
|
|
185
185
|
raise StandardError.new('Incorrect use of write ') if params.kind_of?(Fixnum)
|
186
186
|
|
187
187
|
line = "\n"
|
188
|
-
tab.times {|x| line += "
|
188
|
+
tab.times {|x| line += " " }
|
189
189
|
line += "#\n"
|
190
190
|
|
191
191
|
if params.nil?
|
192
192
|
|
193
193
|
@usage.each_with_index do |var,i|
|
194
194
|
|
195
|
-
tab.times {|x| line += "
|
196
|
-
line += "
|
195
|
+
tab.times {|x| line += " " }
|
196
|
+
line += "# @param "
|
197
197
|
|
198
198
|
# Get a description of the requirements (this can multiple lines)
|
199
199
|
line_prefix = ''
|
@@ -202,8 +202,8 @@ module ActsAsRuntimeMethod
|
|
202
202
|
line += line_prefix+l
|
203
203
|
|
204
204
|
# Assides the first line pre-fix a "# " to the start
|
205
|
-
(tab-1).times {|x| line += "
|
206
|
-
line_prefix = "
|
205
|
+
(tab-1).times {|x| line += " " }
|
206
|
+
line_prefix = "# "
|
207
207
|
|
208
208
|
end
|
209
209
|
|
@@ -212,8 +212,8 @@ module ActsAsRuntimeMethod
|
|
212
212
|
else
|
213
213
|
|
214
214
|
params.each_with_index do |var,i|
|
215
|
-
tab.times {|x| line += "
|
216
|
-
line += "
|
215
|
+
tab.times {|x| line += " " }
|
216
|
+
line += "# @param "
|
217
217
|
|
218
218
|
# Get a description of the requirements (this can multiple lines)
|
219
219
|
line_prefix = ''
|
@@ -223,8 +223,8 @@ module ActsAsRuntimeMethod
|
|
223
223
|
line += line_prefix+l
|
224
224
|
|
225
225
|
# Assides the first line pre-fix a "# " to the start
|
226
|
-
(tab-1).times {|x| line += "
|
227
|
-
line_prefix = "
|
226
|
+
(tab-1).times {|x| line += " " }
|
227
|
+
line_prefix = "# "
|
228
228
|
|
229
229
|
end
|
230
230
|
|
@@ -234,16 +234,16 @@ module ActsAsRuntimeMethod
|
|
234
234
|
|
235
235
|
# Add some some additional comment if supplied
|
236
236
|
unless additional_comments.nil?
|
237
|
-
tab.times {|x| line += "
|
237
|
+
tab.times {|x| line += " " }
|
238
238
|
line += "#"
|
239
|
-
tab.times {|x| line += "
|
239
|
+
tab.times {|x| line += " " }
|
240
240
|
line += additional_comments+"\n"
|
241
241
|
end
|
242
242
|
|
243
|
-
tab.times {|x| line += "
|
243
|
+
tab.times {|x| line += " " }
|
244
244
|
line += "#\n"
|
245
245
|
|
246
|
-
tab.times {|x| line += "
|
246
|
+
tab.times {|x| line += " "}
|
247
247
|
line += 'def '+method_name
|
248
248
|
|
249
249
|
#line += write_params(@parameters)
|
@@ -257,7 +257,7 @@ module ActsAsRuntimeMethod
|
|
257
257
|
line += "\n" if self.empty?
|
258
258
|
|
259
259
|
# Close the method
|
260
|
-
tab.times {|x| line += "
|
260
|
+
tab.times {|x| line += " " }
|
261
261
|
line += "end"+"\n"
|
262
262
|
|
263
263
|
return line
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require "set"
|
2
1
|
# This class represents the code of a method generated at runitme
|
3
2
|
#
|
4
3
|
# This a variation on code set that contains usage and a return
|
@@ -68,21 +67,6 @@ class RuntimeMethod < StatementGroup
|
|
68
67
|
@method_id = id
|
69
68
|
end
|
70
69
|
|
71
|
-
# Returns a declaration instance for this particular runtime
|
72
|
-
# method. The declaration doesn't contain any of the internally
|
73
|
-
# generated statements.
|
74
|
-
#
|
75
|
-
# TODO Write tests on this with more variables and statements
|
76
|
-
#
|
77
|
-
def to_declaration
|
78
|
-
return VariableDeclaration.new(
|
79
|
-
self.class.to_s,
|
80
|
-
@usage.to_declaration,
|
81
|
-
@method_return.to_declaration,
|
82
|
-
*self.collect {|x| x.to_declaration}
|
83
|
-
)
|
84
|
-
end
|
85
|
-
|
86
70
|
def reset_ids!
|
87
71
|
copied_method = copy
|
88
72
|
copied_method.method_id = '0'
|
@@ -391,8 +375,6 @@ class RuntimeMethod < StatementGroup
|
|
391
375
|
# Returns a describtion of the method and the variables
|
392
376
|
# within it.
|
393
377
|
#
|
394
|
-
# TODO Write test for this method
|
395
|
-
#
|
396
378
|
def describe
|
397
379
|
line = write+"\n"
|
398
380
|
available_variables.each do |var|
|
@@ -661,7 +643,8 @@ class RuntimeMethod < StatementGroup
|
|
661
643
|
if x.kind_of?(Statement)
|
662
644
|
|
663
645
|
# Update the ids of the variables used in the statement to use the ids of the method usage
|
664
|
-
duplicated_statement = x.exchange_variables(id_conversion)
|
646
|
+
#duplicated_statement = x.exchange_variables(id_conversion)
|
647
|
+
duplicated_statement = x.copy
|
665
648
|
variable_values = abstract_variables_for_tracking(duplicated_statement)
|
666
649
|
copied.push(duplicated_statement)
|
667
650
|
copied.push(
|
@@ -738,13 +721,12 @@ class RuntimeMethod < StatementGroup
|
|
738
721
|
# array of literal values.
|
739
722
|
#
|
740
723
|
def realise2(params,additional_methods=[])
|
741
|
-
|
724
|
+
|
742
725
|
# TEMP
|
743
726
|
if(params.any? {|x| x.kind_of?(Variable)})
|
744
727
|
raise StandardError.new('Currently only literal values can be realised')
|
745
728
|
end
|
746
729
|
|
747
|
-
# TODO Is KnownVariable a better name than LiteralVariable
|
748
730
|
# Convert the passed paramters into literal variables with the appropriate ids
|
749
731
|
unless usage.length == params.length
|
750
732
|
raise StandardError.new('This method expects '+usage.length.to_s+' param(s) but '+params.length.to_s+' were passed')
|
@@ -772,13 +754,14 @@ class RuntimeMethod < StatementGroup
|
|
772
754
|
# Go through each statement and substitue any of the variables
|
773
755
|
# for those in the history object
|
774
756
|
self.each do |x|
|
757
|
+
|
775
758
|
if x.realised?
|
776
759
|
realised_runtime_method.push(x)
|
777
760
|
next
|
778
761
|
end
|
779
762
|
|
780
763
|
# Handle nested and single statements differently
|
781
|
-
if(x.kind_of?(Statement))
|
764
|
+
if(x.kind_of?(Statement))
|
782
765
|
realised_statement = x.realise2(past)
|
783
766
|
realised_runtime_method.push(realised_statement)
|
784
767
|
elsif(x.kind_of?(BlockStatement))
|
@@ -811,7 +794,7 @@ class RuntimeMethod < StatementGroup
|
|
811
794
|
|
812
795
|
realised_runtime_method.close
|
813
796
|
return realised_runtime_method
|
814
|
-
|
797
|
+
|
815
798
|
end
|
816
799
|
|
817
800
|
def cauldron_method_calls
|
@@ -3,16 +3,6 @@
|
|
3
3
|
#
|
4
4
|
module ActsAsStatement
|
5
5
|
|
6
|
-
# TODO I think I should start to fade out statement_type - I should start by finding calls where it
|
7
|
-
# is needed.
|
8
|
-
def statement_type
|
9
|
-
if @statement_type.nil?
|
10
|
-
@statement_type = identify_statement_type
|
11
|
-
end
|
12
|
-
raise UnknownStatementType.new('No statement type has been defined for this statement "'+self.write+'" ['+self.class.to_s+']') if @statement_type.nil?
|
13
|
-
return @statement_type
|
14
|
-
end
|
15
|
-
|
16
6
|
# Returns true if the statement (treated as an array) has all the
|
17
7
|
# same classes as the array supplied.
|
18
8
|
#
|
@@ -25,92 +15,6 @@ module ActsAsStatement
|
|
25
15
|
return false unless x.instance_of?(y)
|
26
16
|
end
|
27
17
|
return true
|
28
|
-
end
|
29
|
-
|
30
|
-
protected
|
31
|
-
|
32
|
-
# Attempts to identify the type of statement this is by its contents.
|
33
|
-
#
|
34
|
-
def identify_statement_type
|
35
|
-
case self.length
|
36
|
-
when 0
|
37
|
-
return StatementStructure::BLANK_STATEMENT
|
38
|
-
when 1
|
39
|
-
return StatementStructure::IF_STATEMENT if first.kind_of?(If)
|
40
|
-
#return StatementStructure::USAGE_STATEMENT if self.classes_match?(InstanceCallContainer)
|
41
|
-
if self.classes_match?(InstanceCallContainer)
|
42
|
-
if first.method_call.destructive?
|
43
|
-
return StatementStructure::MODIFYING_STATEMENT
|
44
|
-
else
|
45
|
-
return StatementStructure::USAGE_STATEMENT
|
46
|
-
end
|
47
|
-
end
|
48
|
-
# TODO Not sure if this should be a usage_statement
|
49
|
-
return StatementStructure::USAGE_STATEMENT if self.classes_match?(DefCall)
|
50
|
-
|
51
|
-
when 2
|
52
|
-
return StatementStructure::RETURN_STATEMENT if first.kind_of?(Return)
|
53
|
-
when 3
|
54
|
-
# TODO This should distinguish between modifying statements e.g. chop! and push
|
55
|
-
# var = var.chop
|
56
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,InstanceCallContainer)
|
57
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,ClassMethodCallContainer)
|
58
|
-
# TODO Is there a difference between a Literal and a LiteralDeclaration
|
59
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,Literal)
|
60
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,StringVariable)
|
61
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,ArrayVariable)
|
62
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,FixnumVariable)
|
63
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,StatementVariable)
|
64
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,RuntimeMethodParameter)
|
65
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,LiteralDeclaration)
|
66
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,NilVariable)
|
67
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,DefCall)
|
68
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,Fixnum)
|
69
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,UnknownVariable)
|
70
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(StringVariable,Equal,Literal)
|
71
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(StringVariable,Equal,LiteralDeclaration)
|
72
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(StringVariable,Equal,DefCall)
|
73
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(StringVariable,Equal,ArrayAccess)
|
74
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(FixnumVariable,Equal,InstanceCallContainer)
|
75
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(FixnumVariable,Equal,Literal)
|
76
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(FixnumVariable,Equal,DefCall)
|
77
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(ArrayVariable,Equal,Literal)
|
78
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(ArrayVariable,Equal,DefCall)
|
79
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(StatementVariable,Equal,DefCall)
|
80
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(VariableContainer,Equal,Literal)
|
81
|
-
# TODO I don't know if this should be possible/allowed
|
82
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,Unknown)
|
83
|
-
# TODO I'm not sure whether ArrayAccess should be USAGE_STATEMENT
|
84
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,ArrayAccess)
|
85
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(StringVariable,Equal,InstanceCallContainer)
|
86
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(MethodUsageVariable,Equal,ClassMethodCallContainer)
|
87
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(StatementVariable,Equal,ClassMethodCallContainer)
|
88
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(RuntimeMethodParameter,Equal,DefCall)
|
89
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(UnknownVariable,Equal,InstanceCallContainer)
|
90
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(RuntimeMethodParameter,Equal,ClassMethodCallContainer)
|
91
|
-
when 5
|
92
|
-
if self.classes_match?(Unknown,Equal,Unknown,Addition,Unknown)
|
93
|
-
return StatementStructure::DECLARATION_STATEMENT
|
94
|
-
end
|
95
|
-
if self.classes_match?(Unknown,Equal,Unknown,Subtract,Unknown)
|
96
|
-
return StatementStructure::DECLARATION_STATEMENT
|
97
|
-
end
|
98
|
-
if self.classes_match?(Unknown,Equal,FixnumVariable,Addition,FixnumVariable)
|
99
|
-
return StatementStructure::DECLARATION_STATEMENT
|
100
|
-
end
|
101
|
-
if self.classes_match?(Unknown,Equal,InstanceCallContainer,Addition,InstanceCallContainer )
|
102
|
-
return StatementStructure::DECLARATION_STATEMENT
|
103
|
-
end
|
104
|
-
if self.classes_match?(Unknown,Equal,MethodParameter,Addition,MethodParameter )
|
105
|
-
return StatementStructure::DECLARATION_STATEMENT
|
106
|
-
end
|
107
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(Unknown,Equal,StringVariable,Addition,StringVariable)
|
108
|
-
# TODO I don't know if I want this classed as a declaration statement since it might be replacing the
|
109
|
-
# value of a variable.
|
110
|
-
return StatementStructure::DECLARATION_STATEMENT if self.classes_match?(FixnumVariable,Equal,FixnumVariable,Addition,FixnumVariable)
|
111
|
-
end
|
112
|
-
|
113
|
-
raise StandardError.new('Unable to determine statement type for "'+self.write+'"'+self.inject('') {|x,y| x += y.class.to_s+' : ' })
|
114
18
|
end
|
115
19
|
|
116
20
|
end
|