cauldron 0.1.3 → 0.1.5

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.
Files changed (409) hide show
  1. data/.gitignore +51 -0
  2. data/Gemfile +6 -3
  3. data/Gemfile.lock +16 -3
  4. data/Rakefile +94 -92
  5. data/VERSION +1 -1
  6. data/bin/cauldron +2 -2
  7. data/cauldron.gemspec +15 -451
  8. data/features/cauldron_new_approach.feature +46 -0
  9. data/features/step_definitions/cauldron_steps.rb +11 -0
  10. data/features/step_definitions/terminal_steps.rb +0 -2
  11. data/features/support/env.rb +11 -1
  12. data/features/support/hooks.rb +5 -0
  13. data/lib/cauldron.rb +13 -7
  14. data/lib/cauldron/array_reverse_operator.rb +39 -0
  15. data/lib/cauldron/concat_operator.rb +34 -0
  16. data/lib/cauldron/if_relationship.rb +37 -0
  17. data/lib/cauldron/numeric_operator.rb +45 -0
  18. data/lib/cauldron/pot.rb +54 -162
  19. data/lib/cauldron/relationship.rb +5 -0
  20. data/lib/cauldron/terminal.rb +4 -60
  21. data/lib/cauldron/version.rb +3 -0
  22. data/lib/core/string.rb +21 -0
  23. data/sandbox.rb +27 -6
  24. data/spec/cauldron/array_reverse_operator_spec.rb +59 -0
  25. data/spec/cauldron/concat_operator_spec.rb +89 -0
  26. data/spec/cauldron/if_relationship_spec.rb +25 -0
  27. data/spec/cauldron/numeric_operator_spec.rb +70 -0
  28. data/spec/cauldron/pot_spec.rb +81 -151
  29. data/spec/cauldron/terminal_spec.rb +1 -39
  30. data/spec/examples/adding_if_statement.yml +13 -0
  31. data/spec/examples/simple_head_theory.txt +13 -0
  32. data/spec/spec_helper.rb +1 -14
  33. data/tasks/theory_tasks.rake +207 -207
  34. metadata +92 -532
  35. data/cauldron/.autotest +0 -23
  36. data/cauldron/History.txt +0 -6
  37. data/cauldron/Manifest.txt +0 -8
  38. data/cauldron/README.txt +0 -57
  39. data/cauldron/Rakefile +0 -27
  40. data/cauldron/bin/cauldron +0 -3
  41. data/cauldron/lib/cauldron.rb +0 -3
  42. data/cauldron/test/test_cauldron.rb +0 -8
  43. data/features/cauldron_example_cases.feature +0 -13
  44. data/features/cauldron_generates_runtime_method.feature +0 -16
  45. data/features/cauldron_generates_single_paramter_methods.feature +0 -25
  46. data/features/cauldron_interactive_start_terminal.feature +0 -17
  47. data/features/cauldron_quit_terminal.feature +0 -9
  48. data/features/cauldron_start_terminal.feature +0 -12
  49. data/features/support/method_1.example +0 -3
  50. data/features/support/method_2.example +0 -6
  51. data/lib/Chain.rb +0 -771
  52. data/lib/ChainMapping.rb +0 -172
  53. data/lib/CodeHandler.rb +0 -513
  54. data/lib/Mapping.rb +0 -27
  55. data/lib/MappingValues.rb +0 -24
  56. data/lib/PartialChain.rb +0 -253
  57. data/lib/Theory.rb +0 -295
  58. data/lib/UnifiedChain.rb +0 -351
  59. data/lib/cauldron/conversion.rb +0 -15
  60. data/lib/cauldron/demos.rb +0 -280
  61. data/lib/cauldron/env.rb +0 -1
  62. data/lib/cauldron/sexp2cauldron.rb +0 -139
  63. data/lib/cauldron/theory_factory.rb +0 -10
  64. data/lib/cauldron/util/home.rb +0 -21
  65. data/lib/cauldron/util/saver.rb +0 -45
  66. data/lib/core/ActsAsCode.rb +0 -25
  67. data/lib/core/BlockToken.rb +0 -33
  68. data/lib/core/CCall.rb +0 -7
  69. data/lib/core/CTestCase.rb +0 -27
  70. data/lib/core/ClassMethodCallContainer.rb +0 -58
  71. data/lib/core/Container.rb +0 -95
  72. data/lib/core/InstanceCallContainer.rb +0 -298
  73. data/lib/core/MethodUsage.rb +0 -65
  74. data/lib/core/PrintVariables.rb +0 -25
  75. data/lib/core/TheoryGenerator.rb +0 -753
  76. data/lib/core/Token.rb +0 -7
  77. data/lib/core/assignment/Assignment.rb +0 -18
  78. data/lib/core/assignment/Equal.rb +0 -39
  79. data/lib/core/assignment/Equivalent.rb +0 -20
  80. data/lib/core/assignment/NotEqual.rb +0 -14
  81. data/lib/core/call_container/CallContainer.rb +0 -72
  82. data/lib/core/class_method_call/New.rb +0 -15
  83. data/lib/core/class_method_call/RuntimeClassMethodCall.rb +0 -31
  84. data/lib/core/declaration/Declaration.rb +0 -16
  85. data/lib/core/declaration/LiteralDeclaration.rb +0 -47
  86. data/lib/core/declaration/VariableDeclaration.rb +0 -59
  87. data/lib/core/instance_call/ArrayEach.rb +0 -23
  88. data/lib/core/instance_call/ArrayLength.rb +0 -15
  89. data/lib/core/instance_call/Chop.rb +0 -19
  90. data/lib/core/instance_call/Copy.rb +0 -22
  91. data/lib/core/instance_call/DeclaredVariable.rb +0 -18
  92. data/lib/core/instance_call/InstanceCall.rb +0 -77
  93. data/lib/core/instance_call/Params.rb +0 -15
  94. data/lib/core/instance_call/Push.rb +0 -20
  95. data/lib/core/instance_call/StringLength.rb +0 -32
  96. data/lib/core/instance_call/Times.rb +0 -20
  97. data/lib/core/instance_call/instance_calls.rb +0 -176
  98. data/lib/core/instance_call/length_equal.rb +0 -15
  99. data/lib/core/kernal/EvalCall.rb +0 -15
  100. data/lib/core/kernal/LocalVariablesCall.rb +0 -15
  101. data/lib/core/literal/Literal.rb +0 -111
  102. data/lib/core/literal/Raw.rb +0 -23
  103. data/lib/core/literal/RuntimeMethodLiteral.rb +0 -21
  104. data/lib/core/literal/StatementLiteral.rb +0 -28
  105. data/lib/core/method_call/AvailableVariablesCall.rb +0 -25
  106. data/lib/core/method_call/ClassCall.rb +0 -33
  107. data/lib/core/method_call/DefCall.rb +0 -72
  108. data/lib/core/method_call/EvaluateClassCall.rb +0 -29
  109. data/lib/core/method_call/MethodNameCall.rb +0 -27
  110. data/lib/core/method_call/ToDeclarationCall.rb +0 -15
  111. data/lib/core/requirement/Requirement.rb +0 -292
  112. data/lib/core/runtime_class/ArrayClass.rb +0 -19
  113. data/lib/core/runtime_class/ClassCallClass.rb +0 -23
  114. data/lib/core/runtime_class/ClassEvaluationClass.rb +0 -19
  115. data/lib/core/runtime_class/ClassName.rb +0 -18
  116. data/lib/core/runtime_class/DefCallClass.rb +0 -21
  117. data/lib/core/runtime_class/EqualClass.rb +0 -19
  118. data/lib/core/runtime_class/FixnumClass.rb +0 -15
  119. data/lib/core/runtime_class/InstanceCallClass.rb +0 -19
  120. data/lib/core/runtime_class/InstanceCallContainerClass.rb +0 -16
  121. data/lib/core/runtime_class/InstanceClassCallClass.rb +0 -19
  122. data/lib/core/runtime_class/LiteralClass.rb +0 -19
  123. data/lib/core/runtime_class/MethodParameterClass.rb +0 -27
  124. data/lib/core/runtime_class/MethodUsageClass.rb +0 -27
  125. data/lib/core/runtime_class/RequirementClass.rb +0 -19
  126. data/lib/core/runtime_class/ReturnClass.rb +0 -21
  127. data/lib/core/runtime_class/RuntimeClass.rb +0 -30
  128. data/lib/core/runtime_class/RuntimeClassClass.rb +0 -19
  129. data/lib/core/runtime_class/RuntimeMethodClass.rb +0 -34
  130. data/lib/core/runtime_class/StatementClass.rb +0 -53
  131. data/lib/core/runtime_class/StringClass.rb +0 -23
  132. data/lib/core/runtime_class/StringLengthClass.rb +0 -19
  133. data/lib/core/runtime_class/StringVariableClass.rb +0 -19
  134. data/lib/core/runtime_class/ThisClass.rb +0 -15
  135. data/lib/core/runtime_class/UnknownClass.rb +0 -23
  136. data/lib/core/runtime_class/class_names.rb +0 -95
  137. data/lib/core/runtime_class/runtime_class.rb +0 -123
  138. data/lib/core/runtime_method/ActsAsRuntimeMethod.rb +0 -293
  139. data/lib/core/runtime_method/ParametersContainer.rb +0 -29
  140. data/lib/core/runtime_method/RealisedRuntimeMethod.rb +0 -94
  141. data/lib/core/runtime_method/RuntimeMethod.rb +0 -814
  142. data/lib/core/runtime_method/WriteParameters.rb +0 -35
  143. data/lib/core/statement/ActsAsStatement.rb +0 -20
  144. data/lib/core/statement/ArrayAccess.rb +0 -122
  145. data/lib/core/statement/BlockStatement.rb +0 -348
  146. data/lib/core/statement/DeclarationStatement.rb +0 -19
  147. data/lib/core/statement/HackStatement.rb +0 -25
  148. data/lib/core/statement/HashAccess.rb +0 -18
  149. data/lib/core/statement/OpenStatement.rb +0 -178
  150. data/lib/core/statement/RealisedStatement.rb +0 -5
  151. data/lib/core/statement/SingleLineBlockStatement.rb +0 -39
  152. data/lib/core/statement/Statement.rb +0 -1091
  153. data/lib/core/statement/StatementGroup.rb +0 -157
  154. data/lib/core/statement/StatementStructure2.rb +0 -224
  155. data/lib/core/statement/TheoryStatement.rb +0 -68
  156. data/lib/core/statement/TopologicalStatements.rb +0 -34
  157. data/lib/core/syntax/Addition.rb +0 -26
  158. data/lib/core/syntax/BlockContainer.rb +0 -102
  159. data/lib/core/syntax/Boolean.rb +0 -15
  160. data/lib/core/syntax/Code.rb +0 -11
  161. data/lib/core/syntax/Do.rb +0 -20
  162. data/lib/core/syntax/False.rb +0 -12
  163. data/lib/core/syntax/If.rb +0 -36
  164. data/lib/core/syntax/Nil.rb +0 -15
  165. data/lib/core/syntax/Return.rb +0 -33
  166. data/lib/core/syntax/Subtract.rb +0 -19
  167. data/lib/core/syntax/This.rb +0 -40
  168. data/lib/core/syntax/True.rb +0 -20
  169. data/lib/core/syntax/syntax.rb +0 -24
  170. data/lib/core/tracking/ActsAsTrackable.rb +0 -65
  171. data/lib/core/tracking/History.rb +0 -167
  172. data/lib/core/tracking/RuntimeTrackingMethod.rb +0 -32
  173. data/lib/core/tracking/Step.rb +0 -52
  174. data/lib/core/variable/ArrayVariable.rb +0 -76
  175. data/lib/core/variable/BaseVariable.rb +0 -152
  176. data/lib/core/variable/BlockVariable.rb +0 -92
  177. data/lib/core/variable/FixnumVariable.rb +0 -35
  178. data/lib/core/variable/HistoryVariable.rb +0 -8
  179. data/lib/core/variable/MethodParameter.rb +0 -179
  180. data/lib/core/variable/MethodUsageVariable.rb +0 -60
  181. data/lib/core/variable/NilVariable.rb +0 -29
  182. data/lib/core/variable/RuntimeMethodParameter.rb +0 -67
  183. data/lib/core/variable/StatementVariable.rb +0 -72
  184. data/lib/core/variable/StepVariable.rb +0 -7
  185. data/lib/core/variable/StringVariable.rb +0 -46
  186. data/lib/core/variable/TypeVariable.rb +0 -72
  187. data/lib/core/variable/Unknown.rb +0 -102
  188. data/lib/core/variable/UnknownVariable.rb +0 -29
  189. data/lib/core/variable/Variable.rb +0 -70
  190. data/lib/core/variable/VariableContainer.rb +0 -28
  191. data/lib/core/variable/VariableIncluded.rb +0 -27
  192. data/lib/core/variable/VariableReference.rb +0 -85
  193. data/lib/error/FailedToFindStatementContainerError.rb +0 -7
  194. data/lib/error/FailedToFindStatementError.rb +0 -7
  195. data/lib/error/FailedToFindVariableError.rb +0 -7
  196. data/lib/error/FailedToLiteraliseError.rb +0 -7
  197. data/lib/error/FailedVariableMatch.rb +0 -7
  198. data/lib/error/ImproperStatementUsageError.rb +0 -7
  199. data/lib/error/IncompatiableRequirementsError.rb +0 -7
  200. data/lib/error/InvalidStatementError.rb +0 -7
  201. data/lib/error/MethodSizeError.rb +0 -7
  202. data/lib/error/RuntimeSyntaxError.rb +0 -7
  203. data/lib/error/UnexpectedStatementTypeError.rb +0 -7
  204. data/lib/error/UnknownStatementType.rb +0 -7
  205. data/lib/error/UnliteralisableError.rb +0 -7
  206. data/lib/implemented_chain.rb +0 -35
  207. data/lib/intrinsic/IntrinsicLastRuntimeMethod.rb +0 -20
  208. data/lib/intrinsic/IntrinsicLiteral.rb +0 -26
  209. data/lib/intrinsic/IntrinsicObject.rb +0 -22
  210. data/lib/intrinsic/IntrinsicRuntimeMethod.rb +0 -27
  211. data/lib/intrinsic/IntrinsicTestCases.rb +0 -17
  212. data/lib/logger/StandardLogger.rb +0 -62
  213. data/lib/required.rb +0 -222
  214. data/lib/ruby_code/Array.rb +0 -95
  215. data/lib/ruby_code/Fixnum.rb +0 -39
  216. data/lib/ruby_code/Hash.rb +0 -25
  217. data/lib/ruby_code/NilClass.rb +0 -19
  218. data/lib/ruby_code/Object.rb +0 -24
  219. data/lib/ruby_code/String.rb +0 -63
  220. data/lib/ruby_code/Symbol.rb +0 -7
  221. data/lib/standard_library/Tasks.rb +0 -12
  222. data/lib/theories.rb +0 -166
  223. data/lib/theory/ActionImplementation.rb +0 -17
  224. data/lib/theory/TheoryAction.rb +0 -100
  225. data/lib/theory/TheoryChainValidator.rb +0 -103
  226. data/lib/theory/TheoryComponent.rb +0 -59
  227. data/lib/theory/TheoryConnector.rb +0 -756
  228. data/lib/theory/TheoryDependent.rb +0 -135
  229. data/lib/theory/TheoryImplementation.rb +0 -75
  230. data/lib/theory/TheoryResult.rb +0 -131
  231. data/lib/theory/TheoryVariable.rb +0 -63
  232. data/lib/theory/theory_collection.rb +0 -62
  233. data/lib/util/ClassEvaluation.rb +0 -44
  234. data/lib/util/CodeEvaluation.rb +0 -39
  235. data/lib/util/DeclarationStatementEvaluation.rb +0 -32
  236. data/lib/util/MethodEvaluation.rb +0 -49
  237. data/lib/util/MethodTester.rb +0 -71
  238. data/lib/util/MethodValidation.rb +0 -149
  239. data/lib/util/MethodWriter.rb +0 -66
  240. data/lib/util/Parser.rb +0 -305
  241. data/lib/util/StatementCheck.rb +0 -44
  242. data/lib/util/StringToTheory.rb +0 -142
  243. data/lib/util/System.rb +0 -8
  244. data/spec/cauldron/chain_spec.rb +0 -24
  245. data/spec/cauldron/demos_spec.rb +0 -30
  246. data/spec/cauldron/runtime_method_spec.rb +0 -92
  247. data/spec/cauldron/saver_spec.rb +0 -45
  248. data/spec/cauldron/sexp_2_cauldron_spec.rb +0 -118
  249. data/spec/cauldron/theory_action_spec.rb +0 -25
  250. data/spec/cauldron/theory_connector_spec.rb +0 -52
  251. data/spec/cauldron/theory_spec.rb +0 -59
  252. data/spec/cauldron/unified_chain_spec.rb +0 -140
  253. data/test/fixtures/chains/1/declaration.txt +0 -26
  254. data/test/fixtures/chains/1/dump +0 -0
  255. data/test/fixtures/chains/2/declaration.txt +0 -26
  256. data/test/fixtures/chains/2/dump +0 -0
  257. data/test/fixtures/chains/3/declaration.txt +0 -26
  258. data/test/fixtures/chains/3/dump +0 -0
  259. data/test/fixtures/implementation_results/0/declaration.txt +0 -3
  260. data/test/fixtures/implementation_results/0/dump +0 -0
  261. data/test/fixtures/theories/0/declaration.txt +0 -9
  262. data/test/fixtures/theories/0/desc +0 -10
  263. data/test/fixtures/theories/0/dump +0 -0
  264. data/test/fixtures/theories/1/declaration.txt +0 -15
  265. data/test/fixtures/theories/1/desc +0 -11
  266. data/test/fixtures/theories/1/dump +0 -0
  267. data/test/fixtures/theories/10/declaration.txt +0 -23
  268. data/test/fixtures/theories/10/desc +0 -17
  269. data/test/fixtures/theories/10/dump +0 -0
  270. data/test/fixtures/theories/11/declaration.txt +0 -20
  271. data/test/fixtures/theories/11/desc +0 -14
  272. data/test/fixtures/theories/11/dump +0 -0
  273. data/test/fixtures/theories/12/declaration.txt +0 -18
  274. data/test/fixtures/theories/12/desc +0 -12
  275. data/test/fixtures/theories/12/dump +0 -0
  276. data/test/fixtures/theories/13/declaration.txt +0 -24
  277. data/test/fixtures/theories/13/desc +0 -20
  278. data/test/fixtures/theories/13/dump +0 -0
  279. data/test/fixtures/theories/14/declaration.txt +0 -26
  280. data/test/fixtures/theories/14/desc +0 -20
  281. data/test/fixtures/theories/14/dump +0 -0
  282. data/test/fixtures/theories/15/declaration.txt +0 -20
  283. data/test/fixtures/theories/15/desc +0 -14
  284. data/test/fixtures/theories/15/dump +0 -0
  285. data/test/fixtures/theories/16/declaration.txt +0 -30
  286. data/test/fixtures/theories/16/desc +0 -14
  287. data/test/fixtures/theories/16/dump +0 -0
  288. data/test/fixtures/theories/17/declaration.txt +0 -25
  289. data/test/fixtures/theories/17/desc +0 -11
  290. data/test/fixtures/theories/17/dump +0 -0
  291. data/test/fixtures/theories/18/declaration.txt +0 -23
  292. data/test/fixtures/theories/18/desc +0 -11
  293. data/test/fixtures/theories/18/dump +0 -0
  294. data/test/fixtures/theories/19/declaration.txt +0 -23
  295. data/test/fixtures/theories/19/desc +0 -11
  296. data/test/fixtures/theories/19/dump +0 -0
  297. data/test/fixtures/theories/2/declaration.txt +0 -12
  298. data/test/fixtures/theories/2/desc +0 -10
  299. data/test/fixtures/theories/2/dump +0 -0
  300. data/test/fixtures/theories/20/declaration.txt +0 -23
  301. data/test/fixtures/theories/20/desc +0 -17
  302. data/test/fixtures/theories/20/dump +0 -0
  303. data/test/fixtures/theories/3/declaration.txt +0 -19
  304. data/test/fixtures/theories/3/desc +0 -11
  305. data/test/fixtures/theories/3/dump +0 -0
  306. data/test/fixtures/theories/4/declaration.txt +0 -11
  307. data/test/fixtures/theories/4/desc +0 -11
  308. data/test/fixtures/theories/4/dump +0 -0
  309. data/test/fixtures/theories/5/declaration.txt +0 -6
  310. data/test/fixtures/theories/5/desc +0 -9
  311. data/test/fixtures/theories/5/dump +0 -0
  312. data/test/fixtures/theories/6/declaration.txt +0 -13
  313. data/test/fixtures/theories/6/desc +0 -11
  314. data/test/fixtures/theories/6/dump +0 -0
  315. data/test/fixtures/theories/7/declaration.txt +0 -19
  316. data/test/fixtures/theories/7/desc +0 -11
  317. data/test/fixtures/theories/7/dump +0 -0
  318. data/test/fixtures/theories/8/declaration.txt +0 -21
  319. data/test/fixtures/theories/8/desc +0 -11
  320. data/test/fixtures/theories/8/dump +0 -0
  321. data/test/fixtures/theories/9/declaration.txt +0 -24
  322. data/test/fixtures/theories/9/desc +0 -20
  323. data/test/fixtures/theories/9/dump +0 -0
  324. data/test/fixtures/theory_implementations/0/declaration.txt +0 -11
  325. data/test/fixtures/theory_implementations/0/desc.txt +0 -9
  326. data/test/fixtures/theory_implementations/0/dump +0 -0
  327. data/test/fixtures/theory_implementations/0/theory_id +0 -1
  328. data/test/fixtures/theory_implementations/1/declaration.txt +0 -11
  329. data/test/fixtures/theory_implementations/1/desc.txt +0 -9
  330. data/test/fixtures/theory_implementations/1/dump +0 -1
  331. data/test/fixtures/theory_implementations/1/theory_id +0 -1
  332. data/test/fixtures/theory_implementations/2/declaration.txt +0 -11
  333. data/test/fixtures/theory_implementations/2/desc.txt +0 -9
  334. data/test/fixtures/theory_implementations/2/dump +0 -0
  335. data/test/fixtures/theory_implementations/2/theory_id +0 -1
  336. data/test/output/simple_method.txt +0 -5
  337. data/test/output/test_method/first_possible_method.txt +0 -6
  338. data/test/output/test_simple_cases/simple_case_01.txt +0 -8
  339. data/test/output/test_simple_cases/simple_case_02.txt +0 -7
  340. data/test/output/test_simple_cases/simple_case_03.txt +0 -8
  341. data/test/output/test_simple_cases/simple_case_04.txt +0 -8
  342. data/test/output/test_simple_cases/simple_case_05.txt +0 -8
  343. data/test/output/test_simple_cases/simple_case_06.txt +0 -9
  344. data/test/output/test_simple_cases/simple_case_07.txt +0 -9
  345. data/test/output/test_simple_cases/simple_case_08.txt +0 -9
  346. data/test/tc_describe.rb +0 -46
  347. data/test/tc_method.rb +0 -130
  348. data/test/tc_requirement.rb +0 -30
  349. data/test/tc_suite_complete.rb +0 -26
  350. data/test/tc_variable.rb +0 -52
  351. data/test/ts_complete.rb +0 -74
  352. data/test/ts_stable.rb +0 -81
  353. data/test/unit/core/declaration/tc_literal_declaration.rb +0 -34
  354. data/test/unit/core/method_call/tc_class_call.rb +0 -20
  355. data/test/unit/core/runtime_method/tc_realised_runtime_method.rb +0 -132
  356. data/test/unit/core/runtime_method/tc_runtime_method.rb +0 -546
  357. data/test/unit/core/statement/tc_array_access.rb +0 -63
  358. data/test/unit/core/statement/tc_block_statement.rb +0 -53
  359. data/test/unit/core/statement/tc_hack_statement.rb +0 -26
  360. data/test/unit/core/statement/tc_open_statement.rb +0 -79
  361. data/test/unit/core/statement/tc_statement.rb +0 -483
  362. data/test/unit/core/statement/tc_statement_group.rb +0 -35
  363. data/test/unit/core/statement/tc_statement_replace_variable.rb +0 -61
  364. data/test/unit/core/statement/tc_theory_statement.rb +0 -53
  365. data/test/unit/core/syntax/tc_block_container.rb +0 -32
  366. data/test/unit/core/syntax/tc_if_container.rb +0 -39
  367. data/test/unit/core/tc_class_method_call.rb +0 -34
  368. data/test/unit/core/tc_container.rb +0 -41
  369. data/test/unit/core/tc_ctest_case.rb +0 -25
  370. data/test/unit/core/tc_instance_call_container.rb +0 -93
  371. data/test/unit/core/tc_literal.rb +0 -30
  372. data/test/unit/core/tc_theory_generator.rb +0 -336
  373. data/test/unit/core/tc_theory_generator_heavy.rb +0 -42
  374. data/test/unit/core/tracking/tc_history.rb +0 -104
  375. data/test/unit/core/tracking/tc_step.rb +0 -65
  376. data/test/unit/core/variable/tc_array_variable.rb +0 -61
  377. data/test/unit/core/variable/tc_block_variable.rb +0 -17
  378. data/test/unit/core/variable/tc_fixnum_variable.rb +0 -54
  379. data/test/unit/core/variable/tc_method_parameter_variable.rb +0 -22
  380. data/test/unit/core/variable/tc_runtime_method_variable.rb +0 -32
  381. data/test/unit/core/variable/tc_string_variable.rb +0 -37
  382. data/test/unit/core/variable/tc_unknown.rb +0 -24
  383. data/test/unit/core/variable/tc_variable_reference.rb +0 -28
  384. data/test/unit/ruby_code/tc_array.rb +0 -64
  385. data/test/unit/ruby_code/tc_fixnum.rb +0 -18
  386. data/test/unit/ruby_code/tc_hash.rb +0 -41
  387. data/test/unit/ruby_code/tc_string.rb +0 -38
  388. data/test/unit/tc_chain.rb +0 -434
  389. data/test/unit/tc_chain_mapping.rb +0 -62
  390. data/test/unit/tc_chain_with_case_1.rb +0 -169
  391. data/test/unit/tc_instance_call.rb +0 -40
  392. data/test/unit/tc_method_usage.rb +0 -35
  393. data/test/unit/tc_pot.rb +0 -124
  394. data/test/unit/tc_runtime_tracking_method.rb +0 -40
  395. data/test/unit/tc_theory.rb +0 -531
  396. data/test/unit/tc_variable_declaration.rb +0 -32
  397. data/test/unit/theory/tc_theory_action.rb +0 -108
  398. data/test/unit/theory/tc_theory_action_implementation.rb +0 -23
  399. data/test/unit/theory/tc_theory_chain_validator.rb +0 -340
  400. data/test/unit/theory/tc_theory_connector.rb +0 -361
  401. data/test/unit/theory/tc_theory_dependent.rb +0 -153
  402. data/test/unit/theory/tc_theory_implementation.rb +0 -137
  403. data/test/unit/theory/tc_theory_result.rb +0 -112
  404. data/test/unit/theory/tc_theory_variable.rb +0 -45
  405. data/test/unit/util/tc_method_validation.rb +0 -101
  406. data/test/unit/util/tc_parser.rb +0 -110
  407. data/test/unit/util/tc_string_to_theory.rb +0 -300
  408. data/test/unit/variable/tc_method_usage_variable.rb +0 -25
  409. data/tmp/runtime_method_evaluation.rb +0 -16
@@ -1,172 +0,0 @@
1
- # note about the global mapping=>
2
- #
3
- # This method needs to map the theory variables used in one theory to the
4
- # rest. This basically means there is a global theory that has a respective
5
- # id in each of the other theories in the chain. e.g.
6
- #
7
- # +----------+--------+--------+--------+--------+
8
- # |Global #ID| head | link#2 | link#3 | link#4 |
9
- # +----------+--------+--------+--------+--------+
10
- # | 0 | 1 | 1 | 2 | 89 |
11
- # +----------+--------+--------+--------+--------+
12
- # | 1 | 2 | 4 | 6 | 1 |
13
- # +----------+--------+--------+--------+--------+
14
-
15
- class ChainMapping
16
- attr_reader :mapping, :history
17
-
18
- def initialize(mapping={},history=[])
19
- @history, @mapping = history, mapping
20
- end
21
-
22
- def copy
23
- return ChainMapping.new(@mapping.copy,@history.copy)
24
- end
25
-
26
- # Returns the global id for the this theory variable in this theory.
27
- #
28
- # @param theory_id The id of the theory that is being retreived
29
- # @param variable_id The id of the theory variable in the context of the single theory
30
- #
31
- def find_global(theory_instance_id,variable_id)
32
- res = @mapping.detect do |key,value|
33
- value.has_key?(theory_instance_id) && value[theory_instance_id] == variable_id
34
- end
35
- return nil if res.nil?
36
- return res[0]
37
- end
38
-
39
- def same?(chain_map)
40
- return false if @mapping.length != chain_map.mapping.length
41
- return false if @history.length != chain_map.history.length
42
- return @history == chain_map.history
43
- end
44
-
45
- # Adds a new variable mapping to a global id
46
- # TODO Assigning global_id should probably not be allowed publically
47
- #
48
- def add_mapping(global_id,theory_instance_id,variable_id)
49
- if @mapping[global_id].nil?
50
- @mapping[global_id] = {}
51
- end
52
- # TODO Write tests to check that the error is raised
53
- unless @mapping[global_id][theory_instance_id].nil?
54
- if @mapping[global_id][theory_instance_id] != variable_id
55
- raise ChainMappingError.new('This global variable has already been defined')
56
- end
57
- end
58
- # TODO Should check that the theory_id#variable_id has not already been assigned to a global id
59
- @mapping[global_id][theory_instance_id] = variable_id
60
- end
61
-
62
- # TODO I'd like to change global ids to letters for clarity
63
- # Returns the next key that hasn't been defined in the mapping
64
- def next_free_global_id
65
- a = (0..100).to_a.detect() {|x| !@mapping.has_key?(x)}
66
- raise StandardError.new('No more free global id') if a.nil?
67
- return a
68
- end
69
-
70
- # Returns a string listing all the dependent to result connections
71
- # that have been made.
72
- #
73
- def display_history
74
- @history.each do |x|
75
- end
76
- end
77
-
78
- # TODO This is temporary - it doesn't resolve the issue of the same theory
79
- # being used twice.
80
- # Returns all the components that have been sucessfully connected to another
81
- # component.
82
- #
83
- def connected_component_ids
84
- @history.inject([]) {|total,x| total += x}
85
- end
86
-
87
- # Either returns an updated chain mapping if the mapping works or returns the
88
- # existing mapping.
89
- #
90
- def apply_mapping_update(theory_a,component_a_id,theory_b,component_b_id)
91
- updated_mapping = copy
92
- begin
93
- updated_mapping.connect(theory_a,component_a_id,theory_b,component_b_id)
94
- rescue ChainMappingError => e
95
- StandardLogger.instance.warning e
96
- return self.copy
97
- end
98
- return updated_mapping
99
- end
100
-
101
- # TODO I need to include a mapping that doesn't declare a globlal_id. A global id only needs
102
- # identified when connecting separate theories.
103
-
104
- # TODO Mapping is not about theory_component_id it is about what is connected to what and
105
- # when - consider when the same theory is added twice but connected differently.
106
-
107
- # TODO This needs wrapped in some transaction incase one of the mappings won't work
108
- # or in the wider context some of the other connections won't work.
109
-
110
- # Updates the global mapping to connect the two theories so that
111
- # they share the same global mapping
112
- #
113
- # TODO Need to include the theories instance id
114
- #
115
- def connect(theory_a,component_a_id,theory_b,component_b_id)
116
-
117
- # Retrieve each of the components
118
- component_a = theory_a.find_component(component_a_id)
119
- component_b = theory_b.find_component(component_b_id)
120
-
121
- # Check that the number of variables match
122
- unless component_a.theory_variables.length == component_b.theory_variables.length
123
- raise ChainMappingError.new('These components do not have the same number of variables')
124
- end
125
-
126
- # Go through each variable and confirm they have the same global mapping
127
- component_a.theory_variables.zip(component_b.theory_variables) do |variable_a,variable_b|
128
-
129
- # Do any of the theory variables already have a global id
130
- global_var_a = find_global(theory_a.theory_instance_id,variable_a.theory_variable_id)
131
- global_var_b = find_global(theory_b.theory_instance_id,variable_b.theory_variable_id)
132
-
133
- # Nearly variables has been added as global - add new global connections
134
- if ([global_var_a,global_var_b].all? {|x| x.nil?})
135
- mapping_global_id = next_free_global_id
136
- add_mapping(mapping_global_id,theory_a.theory_instance_id,variable_a.theory_variable_id)
137
- add_mapping(mapping_global_id,theory_b.theory_instance_id,variable_b.theory_variable_id)
138
- else
139
-
140
- # If both the global ids are defined then they should be the same value.
141
- if([global_var_a,global_var_b].all? {|x| !x.nil? })
142
- if global_var_a != global_var_b
143
- raise ChainMappingError.new(
144
- 'Both global ids have already been defiend but are not equal '+global_var_a.to_s+' and '+global_var_b.to_s
145
- )
146
- end
147
- next
148
- end
149
-
150
- # Get the id of the only defined global id
151
- global_id = [global_var_a,global_var_b].detect {|x| !x.nil? }
152
-
153
- # Add the mapping for both
154
- add_mapping(global_id,theory_a.theory_instance_id,variable_a.theory_variable_id)
155
- add_mapping(global_id,theory_b.theory_instance_id,variable_b.theory_variable_id)
156
- end
157
-
158
- end
159
-
160
- @history.unshift([theory_a.theory_instance_id,component_a_id,theory_b.theory_instance_id,component_b_id])
161
-
162
- end
163
-
164
- end
165
-
166
- class ChainMappingError < StandardError
167
-
168
- def initialize(msg)
169
- super(msg)
170
- end
171
-
172
- end
@@ -1,513 +0,0 @@
1
- require "tsort"
2
-
3
- # A code handler continualy considers how to extend the complexity
4
- # of a method in a custom class given the intial starting methods
5
- # already availble within the class.
6
- #
7
- # It also can refactor the code into separate methods thereby
8
- # reusing the same functionality.
9
- #
10
- # Essentially it just tries to create as many uniquely new variables as it
11
- # can. Note they are consider unique if the process to create them is
12
- # new, NOT whether or not there value is new.
13
- #
14
- class CodeHandler
15
-
16
- attr_reader :runtime_methods
17
- attr_writer :default_structures
18
-
19
- @@CODE_HANDLER_ID = 0
20
-
21
- def initialize(runtime_methods=[],structures=nil)
22
- @runtime_methods = runtime_methods
23
- @entrance_method = create_entrance_method
24
- @code_handler_id = @@CODE_HANDLER_ID
25
- @@CODE_HANDLER_ID += 1
26
-
27
- # These are the default statement structures if non-are supplied
28
- @default_structures = [
29
- DeclareVariableAsVariableStructure.new,
30
- StatementStructure2.new(StatementStructure2.declared_runtime_method),
31
- StatementStructure2.new(StatementStructure2.declared_array),
32
- StatementStructure2.new(StatementStructure2.declared_string_addition),
33
- DeclareNewInstanceStructure.new(MethodUsageClass.new,RuntimeMethodClass.new)
34
- ]
35
-
36
- # If structures are supplied the overwrite the default structures
37
- @default_structures = structures unless structures.nil?
38
- end
39
-
40
- # Returns a string that prints out how the dynamic code for the
41
- # code handler currently looks.
42
- #
43
- def write
44
-
45
- dynamic_code = "class #{class_name}"+"\n"
46
-
47
- # Include each of the avaialble runtime methods
48
- @runtime_methods.each do |x|
49
- dynamic_code += x.write(ParametersContainer.new,1)
50
- end
51
-
52
- # Now add the entrance method
53
- dynamic_code += @entrance_method.write(ParametersContainer.new,1)
54
-
55
- dynamic_code += "end"
56
- return dynamic_code
57
- end
58
-
59
- # Returns an array of method instances containing various numbers of statements.
60
- #
61
- # 1. At this point we are creating a statement to go straight into a method or
62
- # into a nested statement. First we find all the available variables in the
63
- # context. For this to work the variables should be saved with a scope. At
64
- # this point it isn't concerning it's self with the dependencies for the variable.
65
- # It does however have to take into consideration scope. As such every nested
66
- # statement maintains an array of it's level e.g. [5,7] for a two level nested
67
- # statement. This would mean that varibles with a scope level of 5 or 7 would
68
- # be valid consideration.
69
- #
70
- # 2. Next using the variables available to it it constructs a number of different
71
- # statements.
72
- #
73
- # 3. From this statement it needs to work backwards to construct the full method.
74
- # It does this by finding all the dependencies that have the same scope level.
75
- # After that has been done, if finds and adds all the dependcies on the other
76
- # scope level.
77
- #
78
- # 4. With the method constructed the value for the new variable can be asscertained.
79
- # The asscertained value gets added to available array. Also if a variable is
80
- # overwritten within the nested statement then its value is included with a scope
81
- # value outside the nested statement. Specifically a scope level the same as the
82
- # variable that was overridden. The variable simple has a depencey on the nested
83
- # statement. This allows it to rebuild the statements in the correct order. It
84
- # can then check the scopes and wrap the nested statement accordingly.
85
- #
86
- # @param count The number of itterations to go through when generating new
87
- # runtime method arrangements.
88
- # @param additional_available Any additional values that should be made available when
89
- # generating statements.
90
- #
91
- def itterate(count=1,additional_available=[])
92
-
93
- # Create an array to contain the vessels currently available
94
- initial_copied_method = @entrance_method.copy
95
- initial_copied_method.clear
96
- vessels = [initial_copied_method]
97
-
98
- # Create the array to contain the available variables and the initial runtime method calls
99
- available = []
100
- available += additional_available
101
- @runtime_methods.each {|x| available += x.callable_combinations}
102
-
103
- # Set the scope id for all the method calls
104
- available.each {|x| x.scope_id = initial_copied_method.scope_id}
105
-
106
- # Maintains all the statements and their dependencies
107
- dependencies = StatementDependencies.new
108
-
109
- # Completed methods
110
- results = []
111
-
112
- # Itterate over the number of times specified
113
- count.times do |i|
114
-
115
- # Keep track of the newly created variables
116
- newly_created_variable = []
117
-
118
- # Keeps track of newly created vessels
119
- newly_created_vessels = []
120
-
121
- # For each vessel create appropriate statements
122
- vessels.each do |vessel|
123
-
124
- # Find potential new statements available to the current vessel
125
- new_statement_results = find_possible_new_statements(vessel,available,dependencies)
126
-
127
- # Find the statement dependencies for each statement
128
- new_statement_results.each do |y|
129
-
130
- # Create the vessel for the new statement
131
- new_vessel = vessel.copy
132
-
133
- # Create a runtime method with the statement and all the dependencies
134
- copied_method = build_minimalist_method(@entrance_method,y,dependencies)
135
-
136
- # Realise the generated method
137
- begin
138
- realised_method = copied_method.realise2(ParametersContainer.new,@runtime_methods)
139
- rescue ImproperStatementUsageError => e
140
-
141
- # TODO I have rejected statements "var = <#statement_variable>.declare_variable" if the statement
142
- # variable doesn't represent a declaration statement. I don't know if this is the right way to
143
- # do things. It might be better to return a NilVariable or prevent it from ever being created.
144
-
145
- # TODO I should check this is logged
146
- StandardLogger.instance.warning('Method rejeceted')
147
- StandardLogger.instance.warning(e)
148
- next
149
- end
150
-
151
- results.push(realised_method)
152
-
153
- # TODO I should determine the nature of the statement and then
154
- # determine the new variables available.
155
- # - I should maybe save structures with statements.
156
-
157
- raise StandardError.new('Statement type has not defined for this statement') if y.statement_type.nil?
158
-
159
- # Determine the id of the statement that declares the value
160
- #case(y.statement_type)
161
- # when StatementStructure::DECLARATION_STATEMENT
162
- if((y.statement_type == StatementStructure::MODIFYING_STATEMENT)or(y.statement_type == StatementStructure::DECLARATION_STATEMENT))
163
-
164
- #declared_variable_id = y.created_variable.variable_id
165
- variable_uniq_id = y.created_variable.uniq_id
166
-
167
- # Find the value of the variable within the realised method and set it's scope
168
- #resulting_variable = realised_method.find_variable(declared_variable_id)
169
- resulting_variable = realised_method.find_variable(variable_uniq_id)
170
-
171
- if y.kind_of?(BlockStatement)
172
- resulting_variable.scope_id = y.scope_id
173
- resulting_variable.clear
174
- else
175
- resulting_variable.scope_id = vessel.scope_id
176
- end
177
- newly_created_variable.push(resulting_variable)
178
-
179
- #new_vessel = realised_method.find_statement_that_declares_variable(declared_variable_id)
180
- # TODO Check this works with uniq_id
181
- new_vessel = realised_method.find_statement_that_created_variable(variable_uniq_id)
182
-
183
- # Find the statement from the typed method that declares the variable
184
- # NOTE I wonder if it would be quicker and safe to add the realised statement here
185
- #declaring_statement = realised_method.find_statement_that_declares_variable(declared_variable_id)
186
- # TODO Check this works with uniq_id
187
- declaring_statement = realised_method.find_statement_that_created_variable(variable_uniq_id)
188
- dependencies.push(declaring_statement)
189
-
190
- # If the new statement was a nested statement then add as vessel
191
- if y.kind_of?(BlockStatement)
192
- new_vessels_scope = [new_vessel.scope_id]
193
- new_vessels_scope += vessel.scope
194
- new_vessel.scope = new_vessels_scope
195
- new_vessel.clear
196
- newly_created_vessels.push(new_vessel)
197
- end
198
-
199
- # when StatementStructure::MODIFYING_STATEMENT:
200
-
201
- # # exit
202
- # # Need to save modified statement;
203
- # StandardLogger.instance.warning('I think I need to treat modifying statements as if they declare new variables')
204
- #
205
- # # TODO I'm not certain this isn't going to add loads of statement
206
- # StandardLogger.instance.info('Statement ID: '+y.statement_id.to_s)
207
- # StandardLogger.instance.info(': '+y.write)
208
- #
209
- # # Adding the statement the newly modified statement
210
- # dependencies.push(realised_method.select {|stment| stment.statement_id == y.statement_id}.first)
211
- # elsif(StatementStructure::USAGE_STATEMENT)
212
- else
213
- raise StandardError.new('Unknown statement_type "'+y.statement_type+'" "'+y.write+'"')
214
- end
215
-
216
- end
217
-
218
- end
219
-
220
- # Add the new variables to available list
221
- # TODO newly_created_variable is an array - it should be newly_created_variables
222
- available += newly_created_variable
223
-
224
- # Add the new vessel to the list
225
- vessels += newly_created_vessels
226
-
227
- end
228
- return results
229
-
230
- end
231
-
232
- def self.reset_global_id
233
- #http://www.zenspider.com/Languages/Ruby/QuickRef.html
234
- unless $".include?('test/unit.rb')
235
- StandardLogger.log 'WARNING: Resetting variable id, this should only be done for tests'
236
- end
237
- @@CODE_HANDLER_ID = 0
238
- end
239
-
240
- def class_name
241
- return "RuntimeCodeHandler"+@code_handler_id.to_s
242
- end
243
-
244
- protected
245
-
246
- # Returns an array of new statements after removing any statements
247
- # that have previously been considered when generating code.
248
- #
249
- # TODO This needs re-thought for seanarios when new containers become
250
- # available.
251
- #
252
- # @param possible_statements
253
- # @param considered_statements
254
- #
255
- def new_statements(possible_statements,considered_statements)
256
-
257
- # TODO I imagine there is a nicer way of doing this method using Procs or
258
- # passing blocks.
259
-
260
- results = StatementGroup.new
261
- possible_statements.each do |x|
262
-
263
- # Declare the statement that is being considered - for block statements
264
- # e.g. test.each do |x| only the "test.each" bit is considered
265
- if x.kind_of?(BlockStatement)
266
- subject = x.opening_statement
267
- end
268
- subject ||= x
269
-
270
- catch(:already_exists) do
271
- considered_statements.each do |y|
272
-
273
- if y.kind_of?(BlockStatement)
274
- other = y.opening_statement
275
- end
276
- other ||= y
277
-
278
- catch(:different_from_this_statement) do
279
-
280
- # Checks whether the statements are equivalent
281
- if subject.equivalent?(other)
282
- throw :already_exists
283
- end
284
- throw :different_from_this_statement
285
- end
286
- end
287
- results.push(x)
288
- end
289
- end
290
- return results
291
- end
292
-
293
- # Return the next set of available statements given the
294
- # elements avialable.
295
- #
296
- def next_statements(available=[])
297
-
298
- # Collect a number of runtime variables
299
- results = StatementGroup.new
300
- statement_structures.each do |structure|
301
- results += structure.statements(available)
302
- end
303
- return results
304
- end
305
-
306
- # Retuns a runtime method instance that is the starting
307
- # point when generating unique variable journeys.
308
- #
309
- def create_entrance_method
310
- return RuntimeMethod.new(MethodUsage.new,NilVariable.new)
311
- end
312
-
313
- # Returns an array of potential statement structures
314
- # e.g.
315
- #
316
- # Structure.new(Unknown,Equal,FixnumVariable,Addition,FixnumVariable)
317
- #
318
- # TODO Write more tests for StatementStructure2
319
- # TODO I don't know if I want to declare the structures here. It might be
320
- # nicer to keep them with the variables. They need to be with the variables
321
- # since even if they were created by the same StatementStrucutre this is
322
- # no guarantee that they will have the same the structure. e..g
323
- #
324
- # var_a.push(var_b);
325
- #
326
- def statement_structures
327
- return @default_structures
328
- end
329
-
330
- # Returns the current runtime class instance
331
- def to_runtime_class
332
- runtime_class = RuntimeClass.new(class_name)
333
- @runtime_methods.each do |x|
334
- runtime_class.push x.copy
335
- end
336
- runtime_class.push @entrance_method
337
- return runtime_class
338
- end
339
-
340
- # Returns an array of statements that need
341
- # DEPENDENCY - check ruby code
342
- # TODO Look up Matrix in ruby p694
343
- def requisite_statements_for(entrance_method,statement,journeys)
344
- statement.required_variable_ids.each do |x|
345
- journeys[x].each do |y|
346
- entrance_method.push(y)
347
- end
348
- end
349
- end
350
-
351
- # Returns an array of statements based on the available variables and
352
- # previously created statements.
353
- #
354
- def create_statements(available,dependencies,vessel)
355
-
356
- # Now attempt to create statements with each of the elements
357
- statements = next_statements(available)
358
-
359
- # Remove out of scope dependencies
360
- # If a statement is used in a new scope it should be considered a new statement
361
- # NOTE For now I wont allow this
362
-
363
- # Remove statements that may have been considered at previous itteration
364
- statements = new_statements(statements,dependencies)
365
-
366
- # Remove any statements that simple declare an existing variable var_a = var_b
367
- # TODO With better structures this shouldn't be necessary
368
- statements = statements.remove_simple
369
-
370
- return statements
371
- end
372
-
373
- # Returns an updated array of variables thats scope is with
374
- # the tolerance specified.
375
- #
376
- # @param available A array of available variables
377
- # @param scope An array indicating the scope to allow e.g.
378
- # [5,7].
379
- #
380
- def filter_within_scope(available,scope)
381
- results = available.find_all {|x| scope.any?{|y| x.scope_id==y} }
382
- return results
383
- end
384
-
385
- # Returns an array of statements in the order of their depenence.
386
- #
387
- # @param dependencies A statement dependencies instance containing the
388
- # depenency structure.
389
- # @param statement The most recently added statement that's depenencies
390
- # need found for.
391
- #
392
- def find_prerequisite_statements(dependencies,statement)
393
-
394
- # TODO Call this method within dependencies
395
- # Find the dependcies for the statement - the last one is the current statement
396
- required_ids = dependencies.tsort_for_statement(statement)
397
- required_ids.pop
398
-
399
- # Add the dependent statements
400
- results = []
401
- required_ids.each do |y|
402
- dependencies.each do |z|
403
- results.push(z.copy) if z.statement_id == y
404
- end
405
- end
406
- return results
407
-
408
- end
409
-
410
- # Strips out all the variables that are used as part of the
411
- # the nested statements. This is to avoid editing variables
412
- # that are being itterated over. For example
413
- #
414
- # var_a = ['test']
415
- # var_a.each do |x|
416
- # var_a.push('test')
417
- # end
418
- #
419
- # @param vars An array of in-scope variables (relative to the supplied vessel)
420
- # @param vessel The nested statement or method thats structure is being considered
421
- # @param dependencies The dependencey structure of all the statements.
422
- #
423
- def strip_dependent_variables(vars,vessel,dependencies)
424
- # Go through each nested statement in scope and remove any variables used in the statemnet
425
- # this is to prevent variables being itterated over being used in the nested statement.
426
- nested_statements = dependencies.find_all {|x| x.kind_of?(BlockStatement)}
427
- vessel.scope.each do |used_scope|
428
- nested_statement = nested_statements.detect {|x| x.scope_id == used_scope}
429
- next if nested_statement.nil?
430
-
431
- # Find the id of the variable used in the nested statement and remove it as a in_scope_variables
432
- # TODO This presumes allot about the position of the variable in the statement
433
- vars.delete_if {|x| x.kind_of?(Variable) && x.variable_id == nested_statement.opening_statement.first.variable.variable_id }
434
- end
435
- return vars
436
- end
437
-
438
- # Returns an array of possible new statements given the currently
439
- # available variables, scope limitations and statement dependencies.
440
- #
441
- # @param vessel A vessel is something that contains statements. This
442
- # is either a nested statement or a runtime method.
443
- # @param available Is an array of all the variables and method calls. Note
444
- # this has not been tailored to suit the vessel so some
445
- # of the variables shouldn't be available.
446
- # @param dependencies A statement dependencies instance that maintains what statements
447
- # are dependent on what.
448
- #
449
- def find_possible_new_statements(vessel,available,dependencies)
450
-
451
- # Filter the array of available variables to only include those within scope.
452
- in_scope_variables = filter_within_scope(available,vessel.scope)
453
-
454
- # Strip out parent itterating variables
455
- in_scope_variables = strip_dependent_variables(in_scope_variables,vessel,dependencies)
456
-
457
- # Create statements with the available variables
458
- new_statement_results = create_statements(in_scope_variables,dependencies,vessel)
459
-
460
- # All new statements should have the statement level of the vessel scope_id
461
- new_statement_results.each {|x| x.statement_level = vessel.scope_id}
462
-
463
- return new_statement_results
464
-
465
- end
466
-
467
- # Returns an updated method that includes a specified statement and
468
- # all of its dependencies in the correct order and depth.
469
- #
470
- # @param initial_method
471
- #
472
- def build_minimalist_method(initial_method,statement,dependencies)
473
-
474
- # Find all the pre-requisite statements for the leading statement
475
- prerequisite_statements = find_prerequisite_statements(dependencies,statement)
476
-
477
- # Create an empty initial method to contain each arrangement
478
- constructing_method = initial_method.copy
479
- constructing_method.clear
480
-
481
- # Add all the statement in their scope order
482
- prerequisite_statements.copy.each do |remaining_statement|
483
- unless remaining_statement.statement_level == constructing_method.scope_id
484
-
485
- # Find the pre-requiste statement the statement should reside in
486
- actual_statement = prerequisite_statements.delete_if {|z| z.statement_id == remaining_statement.statement_id}
487
-
488
- prerequisite_statements.each do |h|
489
- if h.kind_of?(StatementGroup)
490
- if h.scope_id == actual_statement.statement_level
491
- h.push(actual_statement)
492
- break
493
- end
494
- end
495
- end
496
- exit
497
- end
498
- end
499
-
500
- # Add each pre-requisite statement to the copied method
501
- prerequisite_statements.each do |f|
502
- constructing_method.push(f)
503
- end
504
-
505
- # Find the statement with the correct statement level and add the new statement
506
- container_statement = constructing_method.find_container_at_level(statement.statement_level)
507
- container_statement.push(statement)
508
-
509
- return constructing_method
510
-
511
- end
512
-
513
- end