cauldron 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/Gemfile +13 -0
- data/LICENSE.txt +20 -0
- data/README +1 -0
- data/README.rdoc +19 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/bin/cauldron +10 -0
- data/cauldron/.autotest +23 -0
- data/cauldron/History.txt +6 -0
- data/cauldron/Manifest.txt +8 -0
- data/cauldron/README.txt +57 -0
- data/cauldron/Rakefile +27 -0
- data/cauldron/bin/cauldron +3 -0
- data/cauldron/lib/cauldron.rb +3 -0
- data/cauldron/test/test_cauldron.rb +8 -0
- data/features/cauldron_example_cases.feature +13 -0
- data/features/cauldron_generates_runtime_method.feature +12 -0
- data/features/cauldron_start_terminal.feature +13 -0
- data/features/step_definitions/cauldron_steps.rb +16 -0
- data/features/step_definitions/terminal_steps.rb +34 -0
- data/features/support/env.rb +19 -0
- data/lib/Chain.rb +879 -0
- data/lib/ChainMapping.rb +172 -0
- data/lib/CodeHandler.rb +517 -0
- data/lib/Mapping.rb +26 -0
- data/lib/MappingValues.rb +24 -0
- data/lib/ScopeDependencies.rb +7 -0
- data/lib/Theory.rb +274 -0
- data/lib/UnifiedChain.rb +110 -0
- data/lib/cauldron.rb +6 -0
- data/lib/cauldron/conversion.rb +15 -0
- data/lib/cauldron/pot.rb +134 -0
- data/lib/cauldron/sexp2cauldron.rb +156 -0
- data/lib/cauldron/terminal.rb +120 -0
- data/lib/cauldron/theory_factory.rb +10 -0
- data/lib/core/ActsAsCode.rb +25 -0
- data/lib/core/BlockToken.rb +33 -0
- data/lib/core/CCall.rb +7 -0
- data/lib/core/CTestCase.rb +27 -0
- data/lib/core/ClassMethodCallContainer.rb +45 -0
- data/lib/core/Container.rb +85 -0
- data/lib/core/InstanceCallContainer.rb +272 -0
- data/lib/core/MethodUsage.rb +66 -0
- data/lib/core/PrintVariables.rb +25 -0
- data/lib/core/TheoryGenerator.rb +764 -0
- data/lib/core/Token.rb +7 -0
- data/lib/core/assignment/Assignment.rb +18 -0
- data/lib/core/assignment/Equal.rb +39 -0
- data/lib/core/assignment/Equivalent.rb +20 -0
- data/lib/core/assignment/NotEqual.rb +14 -0
- data/lib/core/call_container/CallContainer.rb +66 -0
- data/lib/core/class_method_call/New.rb +15 -0
- data/lib/core/class_method_call/RuntimeClassMethodCall.rb +31 -0
- data/lib/core/declaration/Declaration.rb +16 -0
- data/lib/core/declaration/LiteralDeclaration.rb +47 -0
- data/lib/core/declaration/VariableDeclaration.rb +59 -0
- data/lib/core/instance_call/ArrayEach.rb +23 -0
- data/lib/core/instance_call/ArrayLength.rb +15 -0
- data/lib/core/instance_call/Chop.rb +28 -0
- data/lib/core/instance_call/Copy.rb +22 -0
- data/lib/core/instance_call/DeclaredVariable.rb +18 -0
- data/lib/core/instance_call/InstanceCall.rb +77 -0
- data/lib/core/instance_call/Params.rb +15 -0
- data/lib/core/instance_call/Push.rb +20 -0
- data/lib/core/instance_call/StringLength.rb +32 -0
- data/lib/core/instance_call/Times.rb +20 -0
- data/lib/core/instance_call/instance_calls.rb +168 -0
- data/lib/core/instance_call/length_equal.rb +15 -0
- data/lib/core/kernal/EvalCall.rb +15 -0
- data/lib/core/kernal/LocalVariablesCall.rb +15 -0
- data/lib/core/literal/Literal.rb +111 -0
- data/lib/core/literal/Raw.rb +23 -0
- data/lib/core/literal/RuntimeMethodLiteral.rb +21 -0
- data/lib/core/literal/StatementLiteral.rb +28 -0
- data/lib/core/method_call/AvailableVariablesCall.rb +25 -0
- data/lib/core/method_call/ClassCall.rb +33 -0
- data/lib/core/method_call/DefCall.rb +72 -0
- data/lib/core/method_call/EvaluateClassCall.rb +29 -0
- data/lib/core/method_call/MethodNameCall.rb +27 -0
- data/lib/core/method_call/ToDeclarationCall.rb +15 -0
- data/lib/core/requirement/Requirement.rb +291 -0
- data/lib/core/runtime_class/ArrayClass.rb +19 -0
- data/lib/core/runtime_class/ClassCallClass.rb +23 -0
- data/lib/core/runtime_class/ClassEvaluationClass.rb +19 -0
- data/lib/core/runtime_class/ClassName.rb +18 -0
- data/lib/core/runtime_class/DefCallClass.rb +21 -0
- data/lib/core/runtime_class/EqualClass.rb +19 -0
- data/lib/core/runtime_class/FixnumClass.rb +15 -0
- data/lib/core/runtime_class/IfStatementClass.rb +12 -0
- data/lib/core/runtime_class/InstanceCallClass.rb +19 -0
- data/lib/core/runtime_class/InstanceCallContainerClass.rb +16 -0
- data/lib/core/runtime_class/InstanceClassCallClass.rb +19 -0
- data/lib/core/runtime_class/LiteralClass.rb +19 -0
- data/lib/core/runtime_class/MethodParameterClass.rb +27 -0
- data/lib/core/runtime_class/MethodUsageClass.rb +27 -0
- data/lib/core/runtime_class/RequirementClass.rb +19 -0
- data/lib/core/runtime_class/ReturnClass.rb +21 -0
- data/lib/core/runtime_class/RuntimeClass.rb +30 -0
- data/lib/core/runtime_class/RuntimeClassClass.rb +19 -0
- data/lib/core/runtime_class/RuntimeMethodClass.rb +34 -0
- data/lib/core/runtime_class/StatementClass.rb +53 -0
- data/lib/core/runtime_class/StringClass.rb +23 -0
- data/lib/core/runtime_class/StringLengthClass.rb +19 -0
- data/lib/core/runtime_class/StringVariableClass.rb +19 -0
- data/lib/core/runtime_class/ThisClass.rb +15 -0
- data/lib/core/runtime_class/UnknownClass.rb +23 -0
- data/lib/core/runtime_class/class_names.rb +95 -0
- data/lib/core/runtime_class/runtime_class.rb +123 -0
- data/lib/core/runtime_method/ActsAsRuntimeMethod.rb +300 -0
- data/lib/core/runtime_method/ParametersContainer.rb +29 -0
- data/lib/core/runtime_method/RealisedRuntimeMethod.rb +94 -0
- data/lib/core/runtime_method/RuntimeMethod.rb +817 -0
- data/lib/core/runtime_method/WriteParameters.rb +35 -0
- data/lib/core/statement/ActsAsStatement.rb +116 -0
- data/lib/core/statement/ArrayAccess.rb +96 -0
- data/lib/core/statement/BlockStatement.rb +348 -0
- data/lib/core/statement/DeclarationStatement.rb +19 -0
- data/lib/core/statement/HackStatement.rb +25 -0
- data/lib/core/statement/HashAccess.rb +18 -0
- data/lib/core/statement/OpenStatement.rb +171 -0
- data/lib/core/statement/RealisedStatement.rb +5 -0
- data/lib/core/statement/SingleLineBlockStatement.rb +39 -0
- data/lib/core/statement/Statement.rb +1223 -0
- data/lib/core/statement/StatementDependencies.rb +271 -0
- data/lib/core/statement/StatementGroup.rb +157 -0
- data/lib/core/statement/StatementStructure2.rb +224 -0
- data/lib/core/statement/TheoryStatement.rb +60 -0
- data/lib/core/statement/TopologicalStatements.rb +34 -0
- data/lib/core/structure/DeclareNewInstanceStructure.rb +49 -0
- data/lib/core/structure/DeclareRuntimeMethodStructure.rb +34 -0
- data/lib/core/structure/DeclareVariableAsLiteralStructure.rb +31 -0
- data/lib/core/structure/DeclareVariableAsVariableStructure.rb +52 -0
- data/lib/core/structure/FixnumAdditionStructure.rb +56 -0
- data/lib/core/structure/InstanceCallContainerStructure.rb +50 -0
- data/lib/core/structure/InstanceCallStructure.rb +53 -0
- data/lib/core/structure/InstanceMethodCallStructure.rb +21 -0
- data/lib/core/structure/ReturnStructure.rb +20 -0
- data/lib/core/structure/StatementStructure.rb +11 -0
- data/lib/core/syntax/Addition.rb +25 -0
- data/lib/core/syntax/BlockContainer.rb +130 -0
- data/lib/core/syntax/Boolean.rb +15 -0
- data/lib/core/syntax/Code.rb +11 -0
- data/lib/core/syntax/Do.rb +20 -0
- data/lib/core/syntax/False.rb +12 -0
- data/lib/core/syntax/If.rb +28 -0
- data/lib/core/syntax/IfContainer.rb +100 -0
- data/lib/core/syntax/Nil.rb +15 -0
- data/lib/core/syntax/Return.rb +33 -0
- data/lib/core/syntax/Subtract.rb +19 -0
- data/lib/core/syntax/This.rb +40 -0
- data/lib/core/syntax/True.rb +20 -0
- data/lib/core/syntax/syntax.rb +24 -0
- data/lib/core/tracking/ActsAsTrackable.rb +65 -0
- data/lib/core/tracking/History.rb +167 -0
- data/lib/core/tracking/RuntimeTrackingMethod.rb +32 -0
- data/lib/core/tracking/Step.rb +52 -0
- data/lib/core/variable/ArrayVariable.rb +76 -0
- data/lib/core/variable/BaseVariable.rb +154 -0
- data/lib/core/variable/BlockVariable.rb +92 -0
- data/lib/core/variable/FixnumVariable.rb +36 -0
- data/lib/core/variable/HistoryVariable.rb +8 -0
- data/lib/core/variable/MethodParameter.rb +206 -0
- data/lib/core/variable/MethodUsageVariable.rb +60 -0
- data/lib/core/variable/NilVariable.rb +29 -0
- data/lib/core/variable/RuntimeMethodParameter.rb +67 -0
- data/lib/core/variable/StatementVariable.rb +72 -0
- data/lib/core/variable/StepVariable.rb +7 -0
- data/lib/core/variable/StringVariable.rb +46 -0
- data/lib/core/variable/TypeVariable.rb +72 -0
- data/lib/core/variable/Unknown.rb +116 -0
- data/lib/core/variable/UnknownVariable.rb +29 -0
- data/lib/core/variable/Variable.rb +70 -0
- data/lib/core/variable/VariableContainer.rb +28 -0
- data/lib/core/variable/VariableIncluded.rb +27 -0
- data/lib/core/variable/VariableReference.rb +85 -0
- data/lib/error/FailedToFindStatementContainerError.rb +7 -0
- data/lib/error/FailedToFindStatementError.rb +7 -0
- data/lib/error/FailedToFindVariableError.rb +7 -0
- data/lib/error/FailedToLiteraliseError.rb +7 -0
- data/lib/error/FailedVariableMatch.rb +7 -0
- data/lib/error/ImproperStatementUsageError.rb +7 -0
- data/lib/error/IncompatiableRequirementsError.rb +7 -0
- data/lib/error/InvalidStatementError.rb +7 -0
- data/lib/error/MethodSizeError.rb +7 -0
- data/lib/error/RuntimeSyntaxError.rb +7 -0
- data/lib/error/UnexpectedStatementTypeError.rb +7 -0
- data/lib/error/UnknownStatementType.rb +7 -0
- data/lib/error/UnliteralisableError.rb +7 -0
- data/lib/implemented_chain.rb +34 -0
- data/lib/intrinsic/IntrinsicLastRuntimeMethod.rb +20 -0
- data/lib/intrinsic/IntrinsicLiteral.rb +26 -0
- data/lib/intrinsic/IntrinsicObject.rb +22 -0
- data/lib/intrinsic/IntrinsicRuntimeMethod.rb +27 -0
- data/lib/intrinsic/IntrinsicTestCases.rb +17 -0
- data/lib/logger/StandardLogger.rb +62 -0
- data/lib/required.rb +236 -0
- data/lib/ruby_code/Array.rb +95 -0
- data/lib/ruby_code/Fixnum.rb +39 -0
- data/lib/ruby_code/Hash.rb +25 -0
- data/lib/ruby_code/NilClass.rb +19 -0
- data/lib/ruby_code/Object.rb +24 -0
- data/lib/ruby_code/String.rb +86 -0
- data/lib/ruby_code/Symbol.rb +7 -0
- data/lib/standard_library/Tasks.rb +12 -0
- data/lib/theories.rb +143 -0
- data/lib/theory/ActionImplementation.rb +17 -0
- data/lib/theory/TheoryAction.rb +70 -0
- data/lib/theory/TheoryChainValidator.rb +101 -0
- data/lib/theory/TheoryComponent.rb +42 -0
- data/lib/theory/TheoryConnector.rb +755 -0
- data/lib/theory/TheoryDependent.rb +135 -0
- data/lib/theory/TheoryImplementation.rb +74 -0
- data/lib/theory/TheoryResult.rb +131 -0
- data/lib/theory/TheoryVariable.rb +63 -0
- data/lib/theory/theory_collection.rb +62 -0
- data/lib/util/ClassEvaluation.rb +68 -0
- data/lib/util/CodeEvaluation.rb +35 -0
- data/lib/util/DeclarationStatementEvaluation.rb +31 -0
- data/lib/util/MethodEvaluation.rb +49 -0
- data/lib/util/MethodTester.rb +71 -0
- data/lib/util/MethodValidation.rb +145 -0
- data/lib/util/MethodWriter.rb +66 -0
- data/lib/util/Parser.rb +299 -0
- data/lib/util/StatementCheck.rb +42 -0
- data/lib/util/StringToTheory.rb +119 -0
- data/lib/util/System.rb +8 -0
- data/spec/cauldron/pot_spec.rb +6 -0
- data/spec/cauldron/runtime_method_spec.rb +36 -0
- data/spec/cauldron/sexp_2_cauldron_spec.rb +26 -0
- data/spec/cauldron/terminal_spec.rb +38 -0
- data/spec/cauldron/theory_action_spec.rb +5 -0
- data/spec/spec_helper.rb +4 -0
- data/test/fixtures/chains/1/declaration.txt +26 -0
- data/test/fixtures/chains/1/dump +0 -0
- data/test/fixtures/chains/2/declaration.txt +26 -0
- data/test/fixtures/chains/2/dump +0 -0
- data/test/fixtures/chains/3/declaration.txt +26 -0
- data/test/fixtures/chains/3/dump +0 -0
- data/test/fixtures/implementation_results/0/declaration.txt +3 -0
- data/test/fixtures/implementation_results/0/dump +0 -0
- data/test/fixtures/theories/0/declaration.txt +9 -0
- data/test/fixtures/theories/0/desc +10 -0
- data/test/fixtures/theories/0/dump +0 -0
- data/test/fixtures/theories/1/declaration.txt +15 -0
- data/test/fixtures/theories/1/desc +11 -0
- data/test/fixtures/theories/1/dump +0 -0
- data/test/fixtures/theories/10/declaration.txt +23 -0
- data/test/fixtures/theories/10/desc +17 -0
- data/test/fixtures/theories/10/dump +0 -0
- data/test/fixtures/theories/11/declaration.txt +20 -0
- data/test/fixtures/theories/11/desc +14 -0
- data/test/fixtures/theories/11/dump +0 -0
- data/test/fixtures/theories/12/declaration.txt +18 -0
- data/test/fixtures/theories/12/desc +12 -0
- data/test/fixtures/theories/12/dump +0 -0
- data/test/fixtures/theories/13/declaration.txt +24 -0
- data/test/fixtures/theories/13/desc +20 -0
- data/test/fixtures/theories/13/dump +0 -0
- data/test/fixtures/theories/14/declaration.txt +26 -0
- data/test/fixtures/theories/14/desc +20 -0
- data/test/fixtures/theories/14/dump +0 -0
- data/test/fixtures/theories/15/declaration.txt +20 -0
- data/test/fixtures/theories/15/desc +14 -0
- data/test/fixtures/theories/15/dump +0 -0
- data/test/fixtures/theories/16/declaration.txt +30 -0
- data/test/fixtures/theories/16/desc +14 -0
- data/test/fixtures/theories/16/dump +0 -0
- data/test/fixtures/theories/17/declaration.txt +25 -0
- data/test/fixtures/theories/17/desc +11 -0
- data/test/fixtures/theories/17/dump +0 -0
- data/test/fixtures/theories/18/declaration.txt +23 -0
- data/test/fixtures/theories/18/desc +11 -0
- data/test/fixtures/theories/18/dump +0 -0
- data/test/fixtures/theories/19/declaration.txt +23 -0
- data/test/fixtures/theories/19/desc +11 -0
- data/test/fixtures/theories/19/dump +0 -0
- data/test/fixtures/theories/2/declaration.txt +12 -0
- data/test/fixtures/theories/2/desc +10 -0
- data/test/fixtures/theories/2/dump +0 -0
- data/test/fixtures/theories/20/declaration.txt +23 -0
- data/test/fixtures/theories/20/desc +17 -0
- data/test/fixtures/theories/20/dump +0 -0
- data/test/fixtures/theories/3/declaration.txt +19 -0
- data/test/fixtures/theories/3/desc +11 -0
- data/test/fixtures/theories/3/dump +0 -0
- data/test/fixtures/theories/4/declaration.txt +11 -0
- data/test/fixtures/theories/4/desc +11 -0
- data/test/fixtures/theories/4/dump +0 -0
- data/test/fixtures/theories/5/declaration.txt +6 -0
- data/test/fixtures/theories/5/desc +9 -0
- data/test/fixtures/theories/5/dump +0 -0
- data/test/fixtures/theories/6/declaration.txt +13 -0
- data/test/fixtures/theories/6/desc +11 -0
- data/test/fixtures/theories/6/dump +0 -0
- data/test/fixtures/theories/7/declaration.txt +19 -0
- data/test/fixtures/theories/7/desc +11 -0
- data/test/fixtures/theories/7/dump +0 -0
- data/test/fixtures/theories/8/declaration.txt +21 -0
- data/test/fixtures/theories/8/desc +11 -0
- data/test/fixtures/theories/8/dump +0 -0
- data/test/fixtures/theories/9/declaration.txt +24 -0
- data/test/fixtures/theories/9/desc +20 -0
- data/test/fixtures/theories/9/dump +0 -0
- data/test/fixtures/theory_implementations/0/declaration.txt +11 -0
- data/test/fixtures/theory_implementations/0/desc.txt +9 -0
- data/test/fixtures/theory_implementations/0/dump +0 -0
- data/test/fixtures/theory_implementations/0/theory_id +1 -0
- data/test/fixtures/theory_implementations/1/desc.txt +9 -0
- data/test/fixtures/theory_implementations/1/dump +0 -0
- data/test/fixtures/theory_implementations/1/theory_id +1 -0
- data/test/fixtures/theory_implementations/2/desc.txt +9 -0
- data/test/fixtures/theory_implementations/2/dump +0 -0
- data/test/fixtures/theory_implementations/2/theory_id +1 -0
- data/test/output/simple_method.txt +6 -0
- data/test/output/test_method/first_possible_method.txt +6 -0
- data/test/output/test_simple_cases/simple_case_01.txt +8 -0
- data/test/output/test_simple_cases/simple_case_02.txt +7 -0
- data/test/output/test_simple_cases/simple_case_03.txt +8 -0
- data/test/output/test_simple_cases/simple_case_04.txt +8 -0
- data/test/output/test_simple_cases/simple_case_05.txt +8 -0
- data/test/output/test_simple_cases/simple_case_06.txt +9 -0
- data/test/output/test_simple_cases/simple_case_07.txt +9 -0
- data/test/output/test_simple_cases/simple_case_08.txt +9 -0
- data/test/tc_contextual_variables.rb +87 -0
- data/test/tc_describe.rb +47 -0
- data/test/tc_method.rb +133 -0
- data/test/tc_requirement.rb +30 -0
- data/test/tc_suite_complete.rb +26 -0
- data/test/tc_variable.rb +52 -0
- data/test/ts_complete.rb +84 -0
- data/test/ts_stable.rb +81 -0
- data/test/unit/core/declaration/tc_literal_declaration.rb +34 -0
- data/test/unit/core/method_call/tc_class_call.rb +20 -0
- data/test/unit/core/runtime_method/tc_realised_runtime_method.rb +129 -0
- data/test/unit/core/runtime_method/tc_runtime_method.rb +616 -0
- data/test/unit/core/statement/tc_array_access.rb +63 -0
- data/test/unit/core/statement/tc_block_statement.rb +51 -0
- data/test/unit/core/statement/tc_hack_statement.rb +26 -0
- data/test/unit/core/statement/tc_open_statement.rb +70 -0
- data/test/unit/core/statement/tc_statement.rb +681 -0
- data/test/unit/core/statement/tc_statement_dependencies.rb +146 -0
- data/test/unit/core/statement/tc_statement_group.rb +35 -0
- data/test/unit/core/statement/tc_statement_replace_variable.rb +61 -0
- data/test/unit/core/statement/tc_theory_statement.rb +51 -0
- data/test/unit/core/structure/tc_declare_new_instance_structure.rb +41 -0
- data/test/unit/core/structure/tc_declare_variable_as_literal_structure.rb +41 -0
- data/test/unit/core/structure/tc_declare_variable_as_variable_structure.rb +66 -0
- data/test/unit/core/structure/tc_instance_call_container_structure.rb +41 -0
- data/test/unit/core/structure/tc_return_structure.rb +32 -0
- data/test/unit/core/syntax/tc_block_container.rb +32 -0
- data/test/unit/core/syntax/tc_if_container.rb +39 -0
- data/test/unit/core/tc_class_method_call.rb +34 -0
- data/test/unit/core/tc_container.rb +41 -0
- data/test/unit/core/tc_ctest_case.rb +25 -0
- data/test/unit/core/tc_instance_call_container.rb +93 -0
- data/test/unit/core/tc_literal.rb +30 -0
- data/test/unit/core/tc_theory_generator.rb +336 -0
- data/test/unit/core/tc_theory_generator_heavy.rb +42 -0
- data/test/unit/core/tracking/tc_history.rb +102 -0
- data/test/unit/core/tracking/tc_step.rb +65 -0
- data/test/unit/core/variable/tc_array_variable.rb +61 -0
- data/test/unit/core/variable/tc_block_variable.rb +17 -0
- data/test/unit/core/variable/tc_fixnum_variable.rb +54 -0
- data/test/unit/core/variable/tc_method_parameter_variable.rb +22 -0
- data/test/unit/core/variable/tc_runtime_method_variable.rb +32 -0
- data/test/unit/core/variable/tc_string_variable.rb +37 -0
- data/test/unit/core/variable/tc_unknown.rb +24 -0
- data/test/unit/core/variable/tc_variable_reference.rb +28 -0
- data/test/unit/ruby_code/tc_array.rb +64 -0
- data/test/unit/ruby_code/tc_fixnum.rb +18 -0
- data/test/unit/ruby_code/tc_hash.rb +41 -0
- data/test/unit/ruby_code/tc_string.rb +38 -0
- data/test/unit/tc_chain.rb +434 -0
- data/test/unit/tc_chain_mapping.rb +62 -0
- data/test/unit/tc_chain_with_case_1.rb +169 -0
- data/test/unit/tc_instance_call.rb +40 -0
- data/test/unit/tc_instance_call_structure.rb +35 -0
- data/test/unit/tc_method_usage.rb +35 -0
- data/test/unit/tc_pot.rb +124 -0
- data/test/unit/tc_runtime_tracking_method.rb +40 -0
- data/test/unit/tc_statement_structure_2.rb +43 -0
- data/test/unit/tc_theory.rb +533 -0
- data/test/unit/tc_variable_declaration.rb +32 -0
- data/test/unit/theory/tc_theory_action.rb +80 -0
- data/test/unit/theory/tc_theory_action_implementation.rb +23 -0
- data/test/unit/theory/tc_theory_chain_validator.rb +340 -0
- data/test/unit/theory/tc_theory_connector.rb +396 -0
- data/test/unit/theory/tc_theory_dependent.rb +151 -0
- data/test/unit/theory/tc_theory_implementation.rb +133 -0
- data/test/unit/theory/tc_theory_result.rb +111 -0
- data/test/unit/theory/tc_theory_variable.rb +45 -0
- data/test/unit/util/tc_method_validation.rb +98 -0
- data/test/unit/util/tc_parser.rb +108 -0
- data/test/unit/util/tc_string_to_theory.rb +299 -0
- data/test/unit/variable/tc_method_usage_variable.rb +25 -0
- data/tmp/runtime_method_evaluation.rb +10 -0
- metadata +522 -0
@@ -0,0 +1,271 @@
|
|
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
|
@@ -0,0 +1,157 @@
|
|
1
|
+
class StatementGroup < Array
|
2
|
+
attr_reader :scope, :scope_id, :statement_level
|
3
|
+
attr_writer :scope, :scope_id, :statement_level
|
4
|
+
|
5
|
+
# The scope id is used to determine what variables are available with the nested statement
|
6
|
+
@@scope_id = 0
|
7
|
+
|
8
|
+
alias :array_push :push
|
9
|
+
|
10
|
+
def initialize(*statements)
|
11
|
+
super()
|
12
|
+
statements.each {|x| self.push(x)}
|
13
|
+
|
14
|
+
# Update the scope id for the nested statement
|
15
|
+
@scope_id = @@scope_id
|
16
|
+
@@scope_id += 1
|
17
|
+
|
18
|
+
@scope = [@scope_id]
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
def cauldron_method_calls
|
23
|
+
return ['.statement_id']
|
24
|
+
end
|
25
|
+
|
26
|
+
def write(tab=0)
|
27
|
+
line = ''
|
28
|
+
self.each {|x| line += x.write(tab)+"\n" }
|
29
|
+
return line
|
30
|
+
end
|
31
|
+
|
32
|
+
def describe(tab=0)
|
33
|
+
line = ''
|
34
|
+
#self.each {|x| line += x.describe(tab)+"\n" }
|
35
|
+
self.each do |x|
|
36
|
+
line += x.describe(tab)+"\n"
|
37
|
+
end
|
38
|
+
return line
|
39
|
+
end
|
40
|
+
|
41
|
+
# Removes any statements that simple re-declare an existing statement
|
42
|
+
# e.g var_a = var_b.
|
43
|
+
#
|
44
|
+
def remove_simple
|
45
|
+
results = StatementGroup.new
|
46
|
+
self.each do |x|
|
47
|
+
results.push x unless x.is_simple?
|
48
|
+
end
|
49
|
+
return results
|
50
|
+
end
|
51
|
+
|
52
|
+
def push(*entries)
|
53
|
+
self.entries.each do |x|
|
54
|
+
x.scope = [@scope_id]
|
55
|
+
end
|
56
|
+
#super.array_push(*entries)
|
57
|
+
entries.each do |y|
|
58
|
+
|
59
|
+
# TODO Oddly super.array_push seems to add it twice - might investigate
|
60
|
+
#super.array_push(y)
|
61
|
+
array_push(y)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# TODO This method name doesn't suit what it returns
|
66
|
+
def statement_id
|
67
|
+
return @scope_id
|
68
|
+
end
|
69
|
+
|
70
|
+
# Returns a statement container (either a runtime method or a nested statement)
|
71
|
+
# thats scope is the statement level specified. This means that any statements
|
72
|
+
# with the statement level specified should reside directly in the statement
|
73
|
+
# container.
|
74
|
+
#
|
75
|
+
# @param statement_level The statement level the statement group should
|
76
|
+
# contain statements at.
|
77
|
+
#
|
78
|
+
def find_container_at_level(statement_level)
|
79
|
+
return self if scope_id == statement_level
|
80
|
+
self.each do |x|
|
81
|
+
if x.kind_of?(StatementGroup)
|
82
|
+
begin
|
83
|
+
return x.find_container_at_level(statement_level)
|
84
|
+
rescue FailedToFindStatementContainerError => e
|
85
|
+
next
|
86
|
+
end
|
87
|
+
#result = x.find_container_at_level(statement_level)
|
88
|
+
#return result unless result.nil?
|
89
|
+
end
|
90
|
+
end
|
91
|
+
raise FailedToFindStatementContainerError.new('Failed to find containing statement with id '+statement_level.to_s)
|
92
|
+
#return nil
|
93
|
+
#raise StandardEror.new('There is no container at level '+)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Returns the statement thats id matches that supplied.
|
97
|
+
#
|
98
|
+
# @param id The id of the statement should exist in the runtime method
|
99
|
+
#
|
100
|
+
def find_statement(id)
|
101
|
+
self.each do |x|
|
102
|
+
begin
|
103
|
+
return x.find_statement(id)
|
104
|
+
rescue FailedToFindStatementError => e
|
105
|
+
next
|
106
|
+
end
|
107
|
+
end
|
108
|
+
raise FailedToFindStatementError.new('Couldn\'t find statement with id '+id.to_s)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Returns an array of all the runtime method instances that are
|
112
|
+
# required for this statement group. This is essentially the
|
113
|
+
# runtime methods referenced in DefCalls.
|
114
|
+
#
|
115
|
+
def find_all_required_runtime_methods
|
116
|
+
results = []
|
117
|
+
self.each do |x|
|
118
|
+
results += x.find_all_required_runtime_methods
|
119
|
+
end
|
120
|
+
return results
|
121
|
+
end
|
122
|
+
|
123
|
+
def copy
|
124
|
+
result = self.class.new(*self.collect {|x| x.copy })
|
125
|
+
result.scope_id = scope_id
|
126
|
+
result.scope = scope
|
127
|
+
result.statement_level = statement_level
|
128
|
+
return result
|
129
|
+
end
|
130
|
+
|
131
|
+
# Identify any of the contained statements that override an
|
132
|
+
# existing variable.
|
133
|
+
#
|
134
|
+
# @param already_declared An array of previously declared variable ids in the
|
135
|
+
# following format. [{:variable_id=>43},{:variable_id=>12}, ..]
|
136
|
+
#
|
137
|
+
def identify_overriding_statements(already_declared=[])
|
138
|
+
self.each do |x|
|
139
|
+
x.identify_overriding_statements(already_declared)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
# Returns an array of overriding statements that reside inside
|
144
|
+
# this statement group. A overriding statement is a statement that
|
145
|
+
# re-declares or modifies a previously declared variable.
|
146
|
+
#
|
147
|
+
# @param overriding_statements An array of statements that have been overriden
|
148
|
+
# within the statement group.
|
149
|
+
#
|
150
|
+
def find_overriding_statements(overriding_statements=[])
|
151
|
+
self.each do |x|
|
152
|
+
x.find_overriding_statements(overriding_statements)
|
153
|
+
end
|
154
|
+
return overriding_statements
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
@@ -0,0 +1,224 @@
|
|
1
|
+
# Move this class to the structure folder
|
2
|
+
#
|
3
|
+
# TODO This is more a StatementStructureFactory
|
4
|
+
class StatementStructure2 < Array
|
5
|
+
|
6
|
+
# attr_reader :declared_fixnum
|
7
|
+
#
|
8
|
+
# @@DECLARED_FIXNUM = 'declared_fixnum'
|
9
|
+
# DECLARE_STRING = 'declared_string'
|
10
|
+
# DECLARE_STRING_ADDITION = 'declared_string_addition'
|
11
|
+
TIMES_ON_FIXNUM = 'times_on_fixnum'
|
12
|
+
|
13
|
+
# TODO I don't think I really need to pass the parameters anymore
|
14
|
+
def initialize(name)
|
15
|
+
# TODO What are the two parameters an array expects
|
16
|
+
super()
|
17
|
+
|
18
|
+
@structure_name = name
|
19
|
+
|
20
|
+
# Add the parameters to the array
|
21
|
+
structure().each do |code|
|
22
|
+
self.push(code)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# var = 'test'+'ing'
|
27
|
+
def StatementStructure2.declared_string_addition
|
28
|
+
return 'declared_string_addition'
|
29
|
+
end
|
30
|
+
|
31
|
+
def StatementStructure2.times_on_fixnum
|
32
|
+
return 'times_on_fixnum'
|
33
|
+
end
|
34
|
+
|
35
|
+
def StatementStructure2.declared_array
|
36
|
+
return 'declared_array'
|
37
|
+
end
|
38
|
+
|
39
|
+
def StatementStructure2.declared_runtime_method
|
40
|
+
return 'declared_runtime_method'
|
41
|
+
end
|
42
|
+
|
43
|
+
# var = 5+8
|
44
|
+
def StatementStructure2.declared_fixnum_addition
|
45
|
+
return 'declared_fixnum_addition'
|
46
|
+
end
|
47
|
+
|
48
|
+
def StatementStructure2.declared_statement
|
49
|
+
return 'declared_statement'
|
50
|
+
end
|
51
|
+
|
52
|
+
def structure
|
53
|
+
case @structure_name
|
54
|
+
# when StatementStructure2.declared_fixnum
|
55
|
+
# return [Unknown,Equal,FixnumVariable]
|
56
|
+
# when StatementStructure2.declared_string
|
57
|
+
# return [Unknown,Equal,StringVariable]
|
58
|
+
when StatementStructure2.declared_array
|
59
|
+
return [Unknown,Equal,ArrayVariable]
|
60
|
+
when StatementStructure2.declared_runtime_method
|
61
|
+
return DeclareRuntimeMethodStructure.new()
|
62
|
+
when StatementStructure2.declared_string_addition
|
63
|
+
return [Unknown,Equal,StringVariable,Addition,StringVariable]
|
64
|
+
when StatementStructure2.declared_fixnum_addition
|
65
|
+
return FixnumAdditionStructure.new()
|
66
|
+
when StatementStructure2.declared_statement
|
67
|
+
return DeclareStatementStructure.new()
|
68
|
+
else
|
69
|
+
raise StandardError.new('Unknown statement structure "'+@structure_name+'"')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Returns an array of possible statements that can be
|
74
|
+
# created to follow the structure of the statement.
|
75
|
+
#
|
76
|
+
# Any method calls are considered as their returned value. So
|
77
|
+
# a method that returns a string is just considered as a
|
78
|
+
# RuntimeVariable with a string class requirement.
|
79
|
+
#
|
80
|
+
def statements(available=[])
|
81
|
+
|
82
|
+
# Retrieve the statements for
|
83
|
+
if(@structure_name==StatementStructure2.times_on_fixnum)
|
84
|
+
return fixnum_times_statements(available)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Create an array of statements that gets extended
|
88
|
+
partial_statements = [Statement.new]
|
89
|
+
|
90
|
+
# Go through each element of the statement structure
|
91
|
+
self.each do |statement_element|
|
92
|
+
|
93
|
+
# Creates an array of updated statements
|
94
|
+
updated_statements = []
|
95
|
+
|
96
|
+
# If it is an unknown variable just add it
|
97
|
+
if(statement_element == Unknown)
|
98
|
+
partial_statements = add_unknown_variable(partial_statements)
|
99
|
+
next
|
100
|
+
end
|
101
|
+
|
102
|
+
# Just include it if it's a = sign
|
103
|
+
if(statement_element == Equal)or(statement_element == Addition)
|
104
|
+
|
105
|
+
# Go through each element in the partial statements and add a copy of the new element
|
106
|
+
partial_statements.each do |partial|
|
107
|
+
copied_statement = partial.copy
|
108
|
+
copied_statement.push(statement_element.new)
|
109
|
+
updated_statements.push copied_statement
|
110
|
+
end
|
111
|
+
partial_statements = updated_statements
|
112
|
+
next
|
113
|
+
end
|
114
|
+
|
115
|
+
# Go through each of the available elements and see if they meet the statement elements
|
116
|
+
available.each do |avail|
|
117
|
+
|
118
|
+
# If any of the values match - include them in the statement
|
119
|
+
if avail.kind_of?(statement_element)
|
120
|
+
|
121
|
+
# Go through each element in the partial statements and add a copy of the new element
|
122
|
+
partial_statements.each do |partial|
|
123
|
+
copied_statement = partial.copy
|
124
|
+
copied_statement.push(avail.copy)
|
125
|
+
updated_statements.push copied_statement
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
# Now see what instance calls are available to the passed avail
|
131
|
+
if avail.kind_of?(Variable)
|
132
|
+
|
133
|
+
# Retrieve any instance calls available for that variable
|
134
|
+
# TODO Availabe should not include the variable with the same id
|
135
|
+
instance_calls = avail.instance_calls(available)
|
136
|
+
instance_calls.each do |x|
|
137
|
+
|
138
|
+
if x.response.class == statement_element
|
139
|
+
|
140
|
+
partial_statements.each do |partial|
|
141
|
+
copied_statement = partial.copy
|
142
|
+
copied_statement.push(x.copy)
|
143
|
+
updated_statements.push copied_statement
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
# If it is a definition call then check against the response value
|
152
|
+
if avail.kind_of?(DefCall)
|
153
|
+
if avail.response.class == statement_element
|
154
|
+
partial_statements.each do |y|
|
155
|
+
copied_statement = y.copy
|
156
|
+
copied_statement.push(avail.copy)
|
157
|
+
updated_statements.push copied_statement
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
163
|
+
|
164
|
+
partial_statements = updated_statements
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
# # Save the structure used to create the statement - this structure type will
|
169
|
+
# # become deprecated soom.
|
170
|
+
# partial_statements.each do |x|
|
171
|
+
# x.structure = self.class
|
172
|
+
# end
|
173
|
+
|
174
|
+
return partial_statements
|
175
|
+
|
176
|
+
end
|
177
|
+
|
178
|
+
# Returns a general description of the statement to
|
179
|
+
# indicate whether it declares a new variable or
|
180
|
+
# modifies an existing variable or nothing.
|
181
|
+
#
|
182
|
+
def self.statement_type
|
183
|
+
#raise StandardError.new('This method should be overridden "'+self.to_s+'"')
|
184
|
+
StandardLogger.instance.warning('This method should be used')
|
185
|
+
#return StatementStructure.DECLARATION_STATEMENT
|
186
|
+
return 'declaration_statement'
|
187
|
+
end
|
188
|
+
|
189
|
+
protected
|
190
|
+
|
191
|
+
# TODO Write tests
|
192
|
+
# Adds a unknown variable to each statement in the supplied
|
193
|
+
# array and returns the result.
|
194
|
+
#
|
195
|
+
def add_unknown_variable(current_statements)
|
196
|
+
results = []
|
197
|
+
current_statements.each do |x|
|
198
|
+
copied = x.copy
|
199
|
+
copied.push(Unknown.new)
|
200
|
+
results.push copied
|
201
|
+
end
|
202
|
+
return results
|
203
|
+
end
|
204
|
+
|
205
|
+
# Get the possible .times statements from the available
|
206
|
+
# fixnum variables
|
207
|
+
#
|
208
|
+
def fixnum_times_statements(available=[])
|
209
|
+
|
210
|
+
# If there aren't any fixnum variables there is nothing to return
|
211
|
+
return [] unless available.any? {|x| x.kind_of?(FixnumVariable)}
|
212
|
+
|
213
|
+
# Use each of the fixnum variables
|
214
|
+
results = []
|
215
|
+
available.find_all {|x| x.kind_of?(FixnumVariable) }.each do |y|
|
216
|
+
new_statement = BlockStatement.new(Statement.new(InstanceCallContainer.new(y.copy,Times.new)),BlockContainer.new(BlockVariable.new))
|
217
|
+
new_statement.structure = self.class
|
218
|
+
results.push(new_statement)
|
219
|
+
end
|
220
|
+
|
221
|
+
return results
|
222
|
+
end
|
223
|
+
|
224
|
+
end
|