aas-core-codegen 0.0.16__py3-none-any.whl
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.
- aas_core_codegen/__init__.py +6 -0
- aas_core_codegen/__main__.py +8 -0
- aas_core_codegen/common.py +500 -0
- aas_core_codegen/cpp/__init__.py +1 -0
- aas_core_codegen/cpp/aas_common/__init__.py +6 -0
- aas_core_codegen/cpp/aas_common/_generate.py +713 -0
- aas_core_codegen/cpp/common.py +681 -0
- aas_core_codegen/cpp/constants/__init__.py +6 -0
- aas_core_codegen/cpp/constants/_generate.py +568 -0
- aas_core_codegen/cpp/description.py +654 -0
- aas_core_codegen/cpp/enhancing/__init__.py +4 -0
- aas_core_codegen/cpp/enhancing/_generate.py +993 -0
- aas_core_codegen/cpp/iteration/__init__.py +6 -0
- aas_core_codegen/cpp/iteration/_generate.py +2332 -0
- aas_core_codegen/cpp/jsonization/__init__.py +6 -0
- aas_core_codegen/cpp/jsonization/_generate.py +2619 -0
- aas_core_codegen/cpp/main.py +694 -0
- aas_core_codegen/cpp/naming.py +170 -0
- aas_core_codegen/cpp/optionaling.py +557 -0
- aas_core_codegen/cpp/pattern/__init__.py +6 -0
- aas_core_codegen/cpp/pattern/_generate.py +508 -0
- aas_core_codegen/cpp/revm/__init__.py +6 -0
- aas_core_codegen/cpp/revm/_generate.py +1149 -0
- aas_core_codegen/cpp/stringification/__init__.py +5 -0
- aas_core_codegen/cpp/stringification/_generate.py +955 -0
- aas_core_codegen/cpp/structure/__init__.py +7 -0
- aas_core_codegen/cpp/structure/_generate.py +1503 -0
- aas_core_codegen/cpp/transpilation.py +1383 -0
- aas_core_codegen/cpp/unrolling.py +159 -0
- aas_core_codegen/cpp/verification/__init__.py +6 -0
- aas_core_codegen/cpp/verification/_generate.py +3073 -0
- aas_core_codegen/cpp/visitation/__init__.py +6 -0
- aas_core_codegen/cpp/visitation/_generate.py +521 -0
- aas_core_codegen/cpp/wstringification/__init__.py +5 -0
- aas_core_codegen/cpp/wstringification/_generate.py +586 -0
- aas_core_codegen/cpp/xmlization/__init__.py +6 -0
- aas_core_codegen/cpp/xmlization/_generate.py +5373 -0
- aas_core_codegen/cpp/yielding.py +201 -0
- aas_core_codegen/csharp/__init__.py +1 -0
- aas_core_codegen/csharp/common.py +224 -0
- aas_core_codegen/csharp/constants/__init__.py +5 -0
- aas_core_codegen/csharp/constants/_generate.py +409 -0
- aas_core_codegen/csharp/copying/__init__.py +4 -0
- aas_core_codegen/csharp/copying/_generate.py +498 -0
- aas_core_codegen/csharp/description.py +1103 -0
- aas_core_codegen/csharp/enhancing/__init__.py +4 -0
- aas_core_codegen/csharp/enhancing/_generate.py +667 -0
- aas_core_codegen/csharp/jsonization/__init__.py +4 -0
- aas_core_codegen/csharp/jsonization/_generate.py +1630 -0
- aas_core_codegen/csharp/main.py +421 -0
- aas_core_codegen/csharp/naming.py +157 -0
- aas_core_codegen/csharp/reporting/__init__.py +4 -0
- aas_core_codegen/csharp/reporting/_generate.py +266 -0
- aas_core_codegen/csharp/stringification/__init__.py +4 -0
- aas_core_codegen/csharp/stringification/_generate.py +243 -0
- aas_core_codegen/csharp/structure/__init__.py +6 -0
- aas_core_codegen/csharp/structure/_generate.py +1341 -0
- aas_core_codegen/csharp/transpilation.py +990 -0
- aas_core_codegen/csharp/unrolling.py +211 -0
- aas_core_codegen/csharp/verification/__init__.py +6 -0
- aas_core_codegen/csharp/verification/_generate.py +1457 -0
- aas_core_codegen/csharp/visitation/__init__.py +5 -0
- aas_core_codegen/csharp/visitation/_generate.py +579 -0
- aas_core_codegen/csharp/xmlization/__init__.py +4 -0
- aas_core_codegen/csharp/xmlization/_generate.py +1980 -0
- aas_core_codegen/golang/__init__.py +1 -0
- aas_core_codegen/golang/aas_common/__init__.py +4 -0
- aas_core_codegen/golang/aas_common/_generate.py +152 -0
- aas_core_codegen/golang/common.py +303 -0
- aas_core_codegen/golang/constants/__init__.py +5 -0
- aas_core_codegen/golang/constants/_generate.py +339 -0
- aas_core_codegen/golang/description.py +501 -0
- aas_core_codegen/golang/enhancing/__init__.py +4 -0
- aas_core_codegen/golang/enhancing/_generate.py +527 -0
- aas_core_codegen/golang/jsonization/__init__.py +4 -0
- aas_core_codegen/golang/jsonization/_generate.py +1740 -0
- aas_core_codegen/golang/main.py +368 -0
- aas_core_codegen/golang/naming.py +412 -0
- aas_core_codegen/golang/pointering.py +631 -0
- aas_core_codegen/golang/reporting/__init__.py +4 -0
- aas_core_codegen/golang/reporting/_generate.py +218 -0
- aas_core_codegen/golang/stringification/__init__.py +4 -0
- aas_core_codegen/golang/stringification/_generate.py +394 -0
- aas_core_codegen/golang/structure/__init__.py +6 -0
- aas_core_codegen/golang/structure/_generate.py +1493 -0
- aas_core_codegen/golang/transpilation.py +1191 -0
- aas_core_codegen/golang/unrolling.py +159 -0
- aas_core_codegen/golang/verification/__init__.py +6 -0
- aas_core_codegen/golang/verification/_generate.py +1513 -0
- aas_core_codegen/golang/xmlization/__init__.py +4 -0
- aas_core_codegen/golang/xmlization/_generate.py +2507 -0
- aas_core_codegen/infer_for_schema/__init__.py +21 -0
- aas_core_codegen/infer_for_schema/_inline.py +693 -0
- aas_core_codegen/infer_for_schema/_len.py +527 -0
- aas_core_codegen/infer_for_schema/_pattern.py +311 -0
- aas_core_codegen/infer_for_schema/_set.py +394 -0
- aas_core_codegen/infer_for_schema/_stringify.py +201 -0
- aas_core_codegen/infer_for_schema/_types.py +135 -0
- aas_core_codegen/infer_for_schema/match.py +122 -0
- aas_core_codegen/intermediate/__init__.py +78 -0
- aas_core_codegen/intermediate/_hierarchy.py +397 -0
- aas_core_codegen/intermediate/_stringify.py +989 -0
- aas_core_codegen/intermediate/_translate.py +5128 -0
- aas_core_codegen/intermediate/_types.py +2901 -0
- aas_core_codegen/intermediate/construction.py +750 -0
- aas_core_codegen/intermediate/doc.py +344 -0
- aas_core_codegen/intermediate/pattern_verification.py +428 -0
- aas_core_codegen/intermediate/revm.py +985 -0
- aas_core_codegen/intermediate/type_inference.py +2266 -0
- aas_core_codegen/java/__init__.py +1 -0
- aas_core_codegen/java/common.py +197 -0
- aas_core_codegen/java/constants/__init__.py +5 -0
- aas_core_codegen/java/constants/_generate.py +334 -0
- aas_core_codegen/java/copying/__init__.py +4 -0
- aas_core_codegen/java/copying/_generate.py +502 -0
- aas_core_codegen/java/description.py +774 -0
- aas_core_codegen/java/enhancing/__init__.py +4 -0
- aas_core_codegen/java/enhancing/_generate.py +820 -0
- aas_core_codegen/java/generation/__init__.py +5 -0
- aas_core_codegen/java/generation/_generate.py +285 -0
- aas_core_codegen/java/jsonization/__init__.py +4 -0
- aas_core_codegen/java/jsonization/_generate.py +1472 -0
- aas_core_codegen/java/main.py +438 -0
- aas_core_codegen/java/naming.py +187 -0
- aas_core_codegen/java/optional.py +514 -0
- aas_core_codegen/java/reporting/__init__.py +4 -0
- aas_core_codegen/java/reporting/_generate.py +248 -0
- aas_core_codegen/java/stringification/__init__.py +4 -0
- aas_core_codegen/java/stringification/_generate.py +212 -0
- aas_core_codegen/java/structure/__init__.py +6 -0
- aas_core_codegen/java/structure/_generate.py +1767 -0
- aas_core_codegen/java/transpilation.py +1111 -0
- aas_core_codegen/java/verification/__init__.py +6 -0
- aas_core_codegen/java/verification/_generate.py +1536 -0
- aas_core_codegen/java/visitation/__init__.py +5 -0
- aas_core_codegen/java/visitation/_generate.py +689 -0
- aas_core_codegen/java/xmlization/__init__.py +4 -0
- aas_core_codegen/java/xmlization/_generate.py +2274 -0
- aas_core_codegen/jsonld/__init__.py +1 -0
- aas_core_codegen/jsonld/main.py +455 -0
- aas_core_codegen/jsonschema/__init__.py +1 -0
- aas_core_codegen/jsonschema/main.py +982 -0
- aas_core_codegen/main.py +245 -0
- aas_core_codegen/naming.py +133 -0
- aas_core_codegen/opcua/__init__.py +1 -0
- aas_core_codegen/opcua/main.py +1525 -0
- aas_core_codegen/opcua/naming.py +126 -0
- aas_core_codegen/parse/__init__.py +46 -0
- aas_core_codegen/parse/_rules.py +796 -0
- aas_core_codegen/parse/_stringify.py +532 -0
- aas_core_codegen/parse/_translate.py +3940 -0
- aas_core_codegen/parse/_types.py +973 -0
- aas_core_codegen/parse/retree/__init__.py +46 -0
- aas_core_codegen/parse/retree/_fix.py +434 -0
- aas_core_codegen/parse/retree/_parse.py +1143 -0
- aas_core_codegen/parse/retree/_render.py +298 -0
- aas_core_codegen/parse/retree/_stringify.py +199 -0
- aas_core_codegen/parse/retree/_types.py +362 -0
- aas_core_codegen/parse/retree/_visitor.py +70 -0
- aas_core_codegen/parse/tree.py +1303 -0
- aas_core_codegen/protobuf/__init__.py +1 -0
- aas_core_codegen/protobuf/common.py +225 -0
- aas_core_codegen/protobuf/description.py +1102 -0
- aas_core_codegen/protobuf/main.py +115 -0
- aas_core_codegen/protobuf/naming.py +143 -0
- aas_core_codegen/protobuf/structure/__init__.py +6 -0
- aas_core_codegen/protobuf/structure/_generate.py +502 -0
- aas_core_codegen/py.typed +1 -0
- aas_core_codegen/python/__init__.py +1 -0
- aas_core_codegen/python/aas_common/__init__.py +4 -0
- aas_core_codegen/python/aas_common/_generate.py +63 -0
- aas_core_codegen/python/common.py +406 -0
- aas_core_codegen/python/constants/__init__.py +5 -0
- aas_core_codegen/python/constants/_generate.py +377 -0
- aas_core_codegen/python/description.py +508 -0
- aas_core_codegen/python/jsonization/__init__.py +4 -0
- aas_core_codegen/python/jsonization/_generate.py +1391 -0
- aas_core_codegen/python/main.py +323 -0
- aas_core_codegen/python/naming.py +255 -0
- aas_core_codegen/python/stringification/__init__.py +4 -0
- aas_core_codegen/python/stringification/_generate.py +129 -0
- aas_core_codegen/python/structure/__init__.py +6 -0
- aas_core_codegen/python/structure/_generate.py +1801 -0
- aas_core_codegen/python/transpilation.py +958 -0
- aas_core_codegen/python/unrolling.py +156 -0
- aas_core_codegen/python/verification/__init__.py +6 -0
- aas_core_codegen/python/verification/_generate.py +1471 -0
- aas_core_codegen/python/xmlization/__init__.py +4 -0
- aas_core_codegen/python/xmlization/_generate.py +3003 -0
- aas_core_codegen/python_protobuf/__init__.py +1 -0
- aas_core_codegen/python_protobuf/main.py +1424 -0
- aas_core_codegen/python_protobuf/naming.py +85 -0
- aas_core_codegen/rdf_shacl/__init__.py +1 -0
- aas_core_codegen/rdf_shacl/_description.py +351 -0
- aas_core_codegen/rdf_shacl/common.py +206 -0
- aas_core_codegen/rdf_shacl/main.py +114 -0
- aas_core_codegen/rdf_shacl/naming.py +145 -0
- aas_core_codegen/rdf_shacl/rdf.py +435 -0
- aas_core_codegen/rdf_shacl/shacl.py +453 -0
- aas_core_codegen/run.py +124 -0
- aas_core_codegen/smoke/__init__.py +1 -0
- aas_core_codegen/smoke/main.py +219 -0
- aas_core_codegen/specific_implementations.py +72 -0
- aas_core_codegen/stringify.py +333 -0
- aas_core_codegen/typescript/__init__.py +1 -0
- aas_core_codegen/typescript/aas_common/__init__.py +4 -0
- aas_core_codegen/typescript/aas_common/_generate.py +472 -0
- aas_core_codegen/typescript/common.py +340 -0
- aas_core_codegen/typescript/constants/__init__.py +5 -0
- aas_core_codegen/typescript/constants/_generate.py +347 -0
- aas_core_codegen/typescript/description.py +530 -0
- aas_core_codegen/typescript/jsonization/__init__.py +4 -0
- aas_core_codegen/typescript/jsonization/_generate.py +1510 -0
- aas_core_codegen/typescript/main.py +258 -0
- aas_core_codegen/typescript/naming.py +189 -0
- aas_core_codegen/typescript/stringification/__init__.py +4 -0
- aas_core_codegen/typescript/stringification/_generate.py +367 -0
- aas_core_codegen/typescript/structure/__init__.py +6 -0
- aas_core_codegen/typescript/structure/_generate.py +2500 -0
- aas_core_codegen/typescript/transpilation.py +1051 -0
- aas_core_codegen/typescript/unrolling.py +159 -0
- aas_core_codegen/typescript/verification/__init__.py +6 -0
- aas_core_codegen/typescript/verification/_generate.py +1578 -0
- aas_core_codegen/xsd/__init__.py +1 -0
- aas_core_codegen/xsd/main.py +1187 -0
- aas_core_codegen/xsd/naming.py +83 -0
- aas_core_codegen/yielding/__init__.py +1 -0
- aas_core_codegen/yielding/flow.py +139 -0
- aas_core_codegen/yielding/linear.py +754 -0
- aas_core_codegen-0.0.16.dist-info/METADATA +211 -0
- aas_core_codegen-0.0.16.dist-info/RECORD +604 -0
- aas_core_codegen-0.0.16.dist-info/WHEEL +5 -0
- aas_core_codegen-0.0.16.dist-info/entry_points.txt +3 -0
- aas_core_codegen-0.0.16.dist-info/licenses/AUTHORS +9 -0
- aas_core_codegen-0.0.16.dist-info/licenses/LICENSE +23 -0
- aas_core_codegen-0.0.16.dist-info/top_level.txt +2 -0
- dev/continuous_integration/__init__.py +1 -0
- dev/continuous_integration/check_help_in_readme.py +208 -0
- dev/continuous_integration/check_init_and_pyproject_consistent.py +154 -0
- dev/continuous_integration/precommit.py +400 -0
- dev/dev_scripts/__init__.py +1 -0
- dev/dev_scripts/compare_rendered_regexes_against_source_py.py +42 -0
- dev/dev_scripts/copy_to_aas_core3_cpp.py +100 -0
- dev/dev_scripts/copy_to_aas_core3_java.py +90 -0
- dev/dev_scripts/download_latest_aas_core_meta_v3.py +114 -0
- dev/dev_scripts/draw_bipartite_graph_based_on_lines.py +37 -0
- dev/dev_scripts/run_tests_with_rerecord.py +69 -0
- dev/dev_scripts/update_to_aas_core_meta.py +174 -0
- dev/integration_tests/input/jsonschema/boilerplate/main.py +55 -0
- dev/integration_tests/input/meta_model.py +38 -0
- dev/integration_tests/input/python/boilerplate/main.py +153 -0
- dev/integration_tests/main.py +258 -0
- dev/test_data/csharp/test_structure/concrete_class_with_descendants/meta_model.py +15 -0
- dev/test_data/csharp/test_structure/constructor_without_arguments/all_properties_optional/meta_model.py +9 -0
- dev/test_data/csharp/test_structure/constructor_without_arguments/no_properties/meta_model.py +6 -0
- dev/test_data/csharp/test_verification/builtin_functions/len/on_list/meta_model.py +20 -0
- dev/test_data/csharp/test_verification/builtin_functions/len/on_str/meta_model.py +16 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/as_prefix/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/as_suffix/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/in_group_with_quantifier/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/in_the_middle/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/in_union/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/single_utf32_literal/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/with_quantifier_within_group/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/with_quantifier_without_group/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/at_the_beginning/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/at_the_end/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/in_the_middle/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/multiple/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/single/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/single_with_quantifier/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/mixed_with_non_utf32/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/more_than_two_high_surrogates/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/multiple_utf32_ranges/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/multiple_utf32_ranges_mixed_with_non_utf32/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/same_high_surrogate/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/same_high_surrogate_with_quantifier/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/two_high_surrogates/meta_model.py +8 -0
- dev/test_data/intermediate/expected/class/empty/meta_model.py +6 -0
- dev/test_data/intermediate/expected/class/implementation_specific_method/meta_model.py +8 -0
- dev/test_data/intermediate/expected/class/inheritance/meta_model.py +41 -0
- dev/test_data/intermediate/expected/class/methods_with_contracts/meta_model.py +15 -0
- dev/test_data/intermediate/expected/class/only_method_no_property/meta_model.py +7 -0
- dev/test_data/intermediate/expected/class/only_property_no_method/meta_model.py +9 -0
- dev/test_data/intermediate/expected/constant/constant_set/of_enum/meta_model.py +12 -0
- dev/test_data/intermediate/expected/constant/constant_set/of_str/meta_model.py +4 -0
- dev/test_data/intermediate/expected/constant/constant_set/with_description/meta_model.py +6 -0
- dev/test_data/intermediate/expected/constant/constant_set/with_superset_of/meta_model.py +14 -0
- dev/test_data/intermediate/expected/constant/constant_str/only_value/meta_model.py +7 -0
- dev/test_data/intermediate/expected/constant/constant_str/with_description/meta_model.py +5 -0
- dev/test_data/intermediate/expected/documentation/docstring_with_special_characters_in_literal/meta_model.py +20 -0
- dev/test_data/intermediate/expected/documentation/docstring_with_special_characters_outside_literal/meta_model.py +20 -0
- dev/test_data/intermediate/expected/empty/meta_model.py +2 -0
- dev/test_data/intermediate/expected/enumeration/meta_model.py +9 -0
- dev/test_data/intermediate/expected/interface/basic/meta_model.py +14 -0
- dev/test_data/intermediate/expected/interface/empty/meta_model.py +7 -0
- dev/test_data/intermediate/expected/interface/inheritance/meta_model.py +27 -0
- dev/test_data/intermediate/expected/interface/method_signature/meta_model.py +10 -0
- dev/test_data/intermediate/expected/interface/only_constructor/meta_model.py +11 -0
- dev/test_data/intermediate/expected/method/non_mutating/implementation_specific/meta_model.py +12 -0
- dev/test_data/intermediate/expected/method/non_mutating/understood/meta_model.py +11 -0
- dev/test_data/intermediate/expected/type_annotation/atomic/meta_model.py +9 -0
- dev/test_data/intermediate/expected/type_annotation/subscripted/class/meta_model.py +13 -0
- dev/test_data/intermediate/expected/type_annotation/subscripted/primitive/meta_model.py +9 -0
- dev/test_data/intermediate/unexpected/constant_set/of_enum/enumeration_literals_in_subset_outside_of_superset/meta_model.py +20 -0
- dev/test_data/intermediate/unexpected/constant_set/of_enum/invalid_literal/meta_model.py +11 -0
- dev/test_data/intermediate/unexpected/constant_set/of_enum/mismatch_between_enumeration_and_literal/meta_model.py +30 -0
- dev/test_data/intermediate/unexpected/constant_set/of_enum/mismatch_in_enumerations_between_subset_and_superset/meta_model.py +21 -0
- dev/test_data/intermediate/unexpected/constant_set/of_str/literals_in_subset_outside_of_superset/meta_model.py +18 -0
- dev/test_data/intermediate/unexpected/constant_set/of_str/mismatch_between_type_annotation_and_literals/meta_model.py +10 -0
- dev/test_data/intermediate/unexpected/constant_set/of_str/superset_and_subset_mismatch_in_type/meta_model.py +12 -0
- dev/test_data/intermediate/unexpected/constraints/dangling_constraintref/meta_model.py +18 -0
- dev/test_data/intermediate/unexpected/constraints/duplicate_constraints/meta_model.py +20 -0
- dev/test_data/intermediate/unexpected/documentation/unexpected_documentation_elements/meta_model.py +34 -0
- dev/test_data/intermediate/unexpected/invariant/class_invariant_uses_re/meta_model.py +10 -0
- dev/test_data/intermediate/unexpected/invariant/invariant_of_constrained_primitive_uses_re/meta_model.py +7 -0
- dev/test_data/intermediate/unexpected/invariant/unexpected_argument_count_to_len/meta_model.py +20 -0
- dev/test_data/intermediate/unexpected/invariant/unhandled_built_in_function/meta_model.py +16 -0
- dev/test_data/intermediate/unexpected/method_definitions/non_constant_default/meta_model.py +7 -0
- dev/test_data/intermediate/unexpected/optional_constructor_arguments_wo_default/default_non_none/meta_model.py +16 -0
- dev/test_data/intermediate/unexpected/optional_constructor_arguments_wo_default/no_default/meta_model.py +16 -0
- dev/test_data/intermediate/unexpected/properties_and_constructor_arguments_do_not_match/after_inheritance/meta_model.py +58 -0
- dev/test_data/intermediate/unexpected/properties_and_constructor_arguments_do_not_match/type_missmatch/meta_model.py +9 -0
- dev/test_data/intermediate/unexpected/properties_and_constructor_arguments_do_not_match/within_class/meta_model.py +22 -0
- dev/test_data/jsonschema/test_main/regression_when_len_constraints_on_inherited_property/meta_model.py +28 -0
- dev/test_data/opcua/test_main/abstract_and_concrete_classes/meta_model.py +37 -0
- dev/test_data/opcua/test_main/classes_with_invariants/meta_model.py +21 -0
- dev/test_data/opcua/test_main/concrete_class_with_descendant/meta_model.py +27 -0
- dev/test_data/opcua/test_main/concrete_class_with_enum/meta_model.py +21 -0
- dev/test_data/opcua/test_main/concrete_class_with_list_of_instances/meta_model.py +21 -0
- dev/test_data/opcua/test_main/concrete_class_with_primitive_attributes/meta_model.py +41 -0
- dev/test_data/opcua/test_main/concrete_class_with_string/meta_model.py +13 -0
- dev/test_data/opcua/test_main/constrained_primitive/meta_model.py +20 -0
- dev/test_data/opcua/test_main/multiple_inheritance/meta_model.py +25 -0
- dev/test_data/parse/expected/constant/constant_set/of_enum/meta_model.py +12 -0
- dev/test_data/parse/expected/constant/constant_set/of_str/meta_model.py +4 -0
- dev/test_data/parse/expected/constant/constant_set/with_description/meta_model.py +6 -0
- dev/test_data/parse/expected/constant/constant_set/with_superset_of/meta_model.py +14 -0
- dev/test_data/parse/expected/constant/constant_str/only_value/meta_model.py +7 -0
- dev/test_data/parse/expected/constant/constant_str/with_description/meta_model.py +5 -0
- dev/test_data/parse/expected/enum/ok/meta_model.py +15 -0
- dev/test_data/parse/expected/implementation_specific_class/properties_and_methods_in_implementation_specific_class/meta_model.py +17 -0
- dev/test_data/parse/expected/inheritance/basic/meta_model.py +11 -0
- dev/test_data/parse/expected/inheritance/diamond/meta_model.py +26 -0
- dev/test_data/parse/expected/inheritance/inheritance_from_concrete_class/meta_model.py +10 -0
- dev/test_data/parse/expected/invariants/in_relation/meta_model.py +16 -0
- dev/test_data/parse/expected/method/arguments/meta_model.py +7 -0
- dev/test_data/parse/expected/method/basic/meta_model.py +7 -0
- dev/test_data/parse/expected/method/contracts/condition_as_keyword_argument/meta_model.py +8 -0
- dev/test_data/parse/expected/method/contracts/condition_as_positional_argument/meta_model.py +8 -0
- dev/test_data/parse/expected/method/contracts/description_as_keyword_argument/meta_model.py +8 -0
- dev/test_data/parse/expected/method/contracts/description_as_positional_argument/meta_model.py +8 -0
- dev/test_data/parse/expected/method/contracts/multiple_contracts_in_order/meta_model.py +17 -0
- dev/test_data/parse/expected/method/contracts/postcondition/basic/meta_model.py +10 -0
- dev/test_data/parse/expected/method/contracts/postcondition/snapshot/with_keyword_arguments/meta_model.py +9 -0
- dev/test_data/parse/expected/method/contracts/postcondition/snapshot/with_positional_arguments/meta_model.py +9 -0
- dev/test_data/parse/expected/method/default/meta_model.py +9 -0
- dev/test_data/parse/expected/method/description/meta_model.py +8 -0
- dev/test_data/parse/expected/method/is_implementation_specific/meta_model.py +8 -0
- dev/test_data/parse/expected/method/non_mutating/meta_model.py +11 -0
- dev/test_data/parse/expected/method/returns_none/meta_model.py +7 -0
- dev/test_data/parse/expected/method/returns_something/meta_model.py +7 -0
- dev/test_data/parse/expected/single_class/description/meta_model.py +12 -0
- dev/test_data/parse/expected/single_class/empty/meta_model.py +6 -0
- dev/test_data/parse/expected/single_class/property/description/meta_model.py +14 -0
- dev/test_data/parse/expected/single_class/property/mandatory/meta_model.py +6 -0
- dev/test_data/parse/expected/single_class/property/optional/meta_model.py +6 -0
- dev/test_data/parse/expected/single_class/property/recursion_to_entity/meta_model.py +6 -0
- dev/test_data/parse/unexpected/class_decorators/non_name_decorator/meta_model.py +7 -0
- dev/test_data/parse/unexpected/class_decorators/unknown_decorator/meta_model.py +7 -0
- dev/test_data/parse/unexpected/class_definitions/is_abstract_and_implementation_specific/meta_model.py +8 -0
- dev/test_data/parse/unexpected/class_definitions/unexpected_docstring_before_a_method/meta_model.py +11 -0
- dev/test_data/parse/unexpected/class_definitions/unexpected_docstring_for_a_pass/meta_model.py +9 -0
- dev/test_data/parse/unexpected/class_definitions/unexpected_double_description_for_a_property/meta_model.py +10 -0
- dev/test_data/parse/unexpected/class_inheritances/inheriting_from_implementation_specific_parent/meta_model.py +20 -0
- dev/test_data/parse/unexpected/class_inheritances/non_name_super_class/meta_model.py +6 -0
- dev/test_data/parse/unexpected/enum/expression_as_assignment_value/meta_model.py +6 -0
- dev/test_data/parse/unexpected/enum/non_assignment/meta_model.py +8 -0
- dev/test_data/parse/unexpected/enum/non_string_literal/meta_model.py +6 -0
- dev/test_data/parse/unexpected/enum/unexpected_inheritance/meta_model.py +6 -0
- dev/test_data/parse/unexpected/method_contracts/contract/non_lambda_condition/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/contract/non_string_literal_description/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/contract/without_any_arguments/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/contract/without_condition/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/postcondition/OLD_in_postcondition_without_snapshot/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/postcondition/argument_missing_in_function/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/precondition/argument_missing_in_function/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/snapshot/argument_missing_in_function/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/snapshot/capture_not_a_lambda/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/snapshot/invalid_name/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/snapshot/name_not_a_string_literal/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/snapshot/without_a_capture/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/snapshot/without_a_name/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_decorators/non_mutating/non_mutating_constructor/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_decorators/non_mutating/non_mutating_verification_function/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_decorators/non_name_decorator/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_decorators/unknown_call_decorator/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_decorators/unknown_name_decorator/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_definitions/argument_with_final/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/argument_without_a_type_annotation/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/default_for_self/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/dunder/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/init_with_return_type/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/with_keyword_only_arguments/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/with_positional_arguments/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/with_type_annotation_for_self/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/with_variable_arguments/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/with_variable_keyword_arguments/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/without_arguments/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/without_self/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/without_type_annotation_for_result/meta_model.py +7 -0
- dev/test_data/parse/unexpected/property_definitions/final_without_subscript/meta_model.py +6 -0
- dev/test_data/parse/unexpected/property_definitions/nested_final/meta_model.py +6 -0
- dev/test_data/parse/unexpected/property_definitions/non_simple/meta_model.py +6 -0
- dev/test_data/parse/unexpected/property_definitions/unexpected_assignment/meta_model.py +6 -0
- dev/test_data/parse/unexpected/property_definitions/unexpected_non_name_property/meta_model.py +6 -0
- dev/test_data/parse/unexpected/property_definitions/without_type_annotation/meta_model.py +6 -0
- dev/test_data/parse/unexpected/symbol_table/constant_set_with_a_non_set_subset/meta_model.py +6 -0
- dev/test_data/parse/unexpected/symbol_table/dangling_inheritance/meta_model.py +6 -0
- dev/test_data/parse/unexpected/symbol_table/dangling_reference_in_type_annotation_of_a_property/meta_model.py +6 -0
- dev/test_data/parse/unexpected/symbol_table/dangling_reference_in_type_annotation_of_an_argument/meta_model.py +7 -0
- dev/test_data/parse/unexpected/symbol_table/dangling_reference_in_type_annotation_of_constant_set/meta_model.py +6 -0
- dev/test_data/parse/unexpected/symbol_table/dangling_subset_in_constant_set/meta_model.py +4 -0
- dev/test_data/parse/unexpected/symbol_table/inheritance_from_non_class/meta_model.py +10 -0
- dev/test_data/parse_retree/expected/character_set/common_escaping/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/complementing/double_caret/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/complementing/multiple_ranges/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/complementing/suffix_dash/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/escape_first_caret/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/literals_which_need_no_escaping_in_characters_set_but_need_escaping_outside/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/multiple_ranges/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/single_literal/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/single_range/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/unescaped_dash/only_dash/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/unescaped_dash/prefix_dash/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/unescaped_dash/suffix_dash/source.py +1 -0
- dev/test_data/parse_retree/expected/dot/source.py +1 -0
- dev/test_data/parse_retree/expected/empty/group/source.py +1 -0
- dev/test_data/parse_retree/expected/empty/group_in_a_group/source.py +1 -0
- dev/test_data/parse_retree/expected/empty/group_of_union_of_empty_concatenations/source.py +1 -0
- dev/test_data/parse_retree/expected/empty/regex/source.py +1 -0
- dev/test_data/parse_retree/expected/empty/union_of_empty_concatenations/source.py +1 -0
- dev/test_data/parse_retree/expected/escaped_literals/source.py +1 -0
- dev/test_data/parse_retree/expected/formatted_value/at_the_beginning/source.py +1 -0
- dev/test_data/parse_retree/expected/formatted_value/at_the_end/source.py +1 -0
- dev/test_data/parse_retree/expected/formatted_value/in_the_middle/source.py +1 -0
- dev/test_data/parse_retree/expected/formatted_value/single_formatted_value/source.py +1 -0
- dev/test_data/parse_retree/expected/literal/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/greedy/at_least_3/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/greedy/at_least_one/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/greedy/at_most_3/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/greedy/exactly_3/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/greedy/maybe/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/greedy/zero_or_more/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/non_greedy/at_least_3/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/non_greedy/at_least_one/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/non_greedy/at_most_3/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/non_greedy/exactly_3/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/non_greedy/maybe/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/non_greedy/zero_or_more/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/on_a_character_set/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/on_a_formatted_value/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/on_a_group/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/on_a_literal/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/double_end_symbol/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/double_start_symbol/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/end_symbol_in_the_middle/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/only_start_symbol/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/only_stop_symbol/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/start_symbol_at_the_beginning/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/start_symbol_in_the_middle/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/stop_symbol_at_the_end/source.py +1 -0
- dev/test_data/parse_retree/expected/union/of_character_sets/source.py +1 -0
- dev/test_data/parse_retree/expected/union/of_groups/source.py +1 -0
- dev/test_data/parse_retree/expected/union/of_string_literals/source.py +1 -0
- dev/test_data/parse_retree/expected/union/within_group/source.py +1 -0
- dev/test_data/parse_retree/expected/whitespace/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/Uxxxxxxxx_out_of_range/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/only_backslash/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/short_Uxxxxxxxx/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/short_uxxxx/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/short_x/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unexpected_escaping/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/digit/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/not_digit/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/not_whitespace/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/not_word/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/whitespace/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/word/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/Uxxxxxxxx_out_of_range/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/only_backslash/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/short_Uxxxxxxxx/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/short_uxxxx/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/short_x/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unexpected_escaping/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/digit/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/not_digit/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/not_whitespace/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/not_word/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/whitespace/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/word/source.py +1 -0
- dev/test_data/parse_retree/unexpected/invalid_character_range/source.py +1 -0
- dev/test_data/parse_retree/unexpected/invalid_quantifier/at_least_x/source.py +1 -0
- dev/test_data/parse_retree/unexpected/invalid_quantifier/between_3_and_x/source.py +1 -0
- dev/test_data/parse_retree/unexpected/invalid_quantifier/exactly_x/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unhandled_group_directives/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unterminated/character_set/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unterminated/group/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unterminated/group_of_union_of_empty_concatenations/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unterminated/quantifier/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unterminated/quantifier_with_comma/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unterminated/quantifier_with_number_and_comma/source.py +1 -0
- dev/test_data/proto/test_main/expected/abstract_and_concrete_classes/meta_model.py +37 -0
- dev/test_data/proto/test_main/expected/concrete_class_with_descendants/meta_model.py +30 -0
- dev/test_data/proto/test_main/expected/concrete_class_with_enum/meta_model.py +21 -0
- dev/test_data/proto/test_main/expected/concrete_class_with_list_of_instances/meta_model.py +21 -0
- dev/test_data/proto/test_main/expected/concrete_class_with_primitive_attributes/meta_model.py +41 -0
- dev/test_data/python_protobuf/test_main/abstract_and_concrete_classes/expected_output/pbization.py +532 -0
- dev/test_data/python_protobuf/test_main/abstract_and_concrete_classes/meta_model.py +37 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_descendant/expected_output/pbization.py +527 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_descendant/meta_model.py +27 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_enum/expected_output/pbization.py +290 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_enum/meta_model.py +21 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_list_of_instances/expected_output/pbization.py +328 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_list_of_instances/meta_model.py +23 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_primitive_attributes/expected_output/pbization.py +274 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_primitive_attributes/meta_model.py +41 -0
- dev/test_data/rdf_shacl/test_main/expected/regression_when_lang_string_class_is_missing/meta_model.py +29 -0
- dev/test_data/rdf_shacl/test_main/expected/regression_when_len_constraints_on_inherited_property/meta_model.py +27 -0
- dev/test_data/rdf_shacl/test_main/unexpected/regression_len_constraint_on_class_property/meta_model.py +61 -0
- dev/test_data/real_meta_models/aas_core_meta.v3.py +5721 -0
- dev/test_data/smoke/test_main/unexpected/infer_for_schema_error/meta_model.py +12 -0
- dev/test_data/smoke/test_main/unexpected/intermediate_error/meta_model.py +18 -0
- dev/test_data/smoke/test_main/unexpected/parse_error/meta_model.py +5 -0
- dev/test_data/smoke/test_main/unexpected/pattern_verification_unparsable_regex/direct_match/meta_model.py +8 -0
- dev/test_data/smoke/test_main/unexpected/type_error/meta_model.py +18 -0
- dev/tests/__init__.py +1 -0
- dev/tests/common.py +197 -0
- dev/tests/cpp/__init__.py +0 -0
- dev/tests/cpp/test_common.py +32 -0
- dev/tests/cpp/test_main.py +144 -0
- dev/tests/cpp/test_pattern.py +188 -0
- dev/tests/cpp/test_verification.py +189 -0
- dev/tests/cpp/test_yielding.py +225 -0
- dev/tests/csharp/__init__.py +0 -0
- dev/tests/csharp/live_test_main.py +109 -0
- dev/tests/csharp/test_common.py +28 -0
- dev/tests/csharp/test_description.py +684 -0
- dev/tests/csharp/test_main.py +129 -0
- dev/tests/csharp/test_structure.py +93 -0
- dev/tests/csharp/test_verification.py +82 -0
- dev/tests/description.py +29 -0
- dev/tests/golang/__init__.py +0 -0
- dev/tests/golang/test_common.py +78 -0
- dev/tests/golang/test_main.py +128 -0
- dev/tests/infer_for_schema/__init__.py +0 -0
- dev/tests/infer_for_schema/common.py +47 -0
- dev/tests/infer_for_schema/test_len_on_properties.py +955 -0
- dev/tests/infer_for_schema/test_len_on_self.py +580 -0
- dev/tests/infer_for_schema/test_patterns_on_properties.py +686 -0
- dev/tests/infer_for_schema/test_patterns_on_self.py +258 -0
- dev/tests/infer_for_schema/test_property_in_set_of_enumeration_literals.py +600 -0
- dev/tests/infer_for_schema/test_property_in_set_of_primitives.py +549 -0
- dev/tests/intermediate/__init__.py +0 -0
- dev/tests/intermediate/test_constructor.py +719 -0
- dev/tests/intermediate/test_hierarchy.py +221 -0
- dev/tests/intermediate/test_revm.py +134 -0
- dev/tests/intermediate/test_translate.py +337 -0
- dev/tests/intermediate/test_type_inference.py +333 -0
- dev/tests/intermediate/test_types.py +169 -0
- dev/tests/java/__init__.py +0 -0
- dev/tests/java/test_common.py +20 -0
- dev/tests/java/test_description.py +128 -0
- dev/tests/java/test_main.py +234 -0
- dev/tests/jsonld_context/test_main.py +79 -0
- dev/tests/opcua/__init__.py +3 -0
- dev/tests/opcua/test_main.py +110 -0
- dev/tests/our_jsonschema/__init__.py +3 -0
- dev/tests/our_jsonschema/test_main.py +232 -0
- dev/tests/parse/__init__.py +0 -0
- dev/tests/parse/test_parse.py +503 -0
- dev/tests/parse/test_retree.py +272 -0
- dev/tests/proto/__init__.py +0 -0
- dev/tests/proto/test_main.py +112 -0
- dev/tests/python/__init__.py +0 -0
- dev/tests/python/test_common.py +124 -0
- dev/tests/python/test_main.py +126 -0
- dev/tests/python/test_xml_playground.py +254 -0
- dev/tests/python_protobuf/__init__.py +0 -0
- dev/tests/python_protobuf/test_main.py +111 -0
- dev/tests/rdf_shacl/__init__.py +0 -0
- dev/tests/rdf_shacl/test_common.py +32 -0
- dev/tests/rdf_shacl/test_description.py +223 -0
- dev/tests/rdf_shacl/test_main.py +194 -0
- dev/tests/smoke/__init__.py +0 -0
- dev/tests/smoke/test_main.py +83 -0
- dev/tests/test_common.py +94 -0
- dev/tests/typescript/__init__.py +0 -0
- dev/tests/typescript/test_common.py +108 -0
- dev/tests/typescript/test_main.py +125 -0
- dev/tests/xsd/__init__.py +0 -0
- dev/tests/xsd/test_main.py +227 -0
- dev/tests/yielding/__init__.py +0 -0
- dev/tests/yielding/test_linear.py +558 -0
|
@@ -0,0 +1,1303 @@
|
|
|
1
|
+
"""Provide our own abstract syntax tree for contract transpilation."""
|
|
2
|
+
import abc
|
|
3
|
+
import ast
|
|
4
|
+
import enum
|
|
5
|
+
from typing import Sequence, Union, Generic, TypeVar, List, Optional, Iterator
|
|
6
|
+
|
|
7
|
+
from icontract import DBC
|
|
8
|
+
|
|
9
|
+
from aas_core_codegen import stringify
|
|
10
|
+
from aas_core_codegen.common import Identifier, assert_never
|
|
11
|
+
|
|
12
|
+
T = TypeVar("T")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Node(abc.ABC):
|
|
16
|
+
"""Represent an abstract node of our syntax tree."""
|
|
17
|
+
|
|
18
|
+
def __init__(self, original_node: ast.AST) -> None:
|
|
19
|
+
"""Initialize with the given values."""
|
|
20
|
+
self.original_node = original_node
|
|
21
|
+
|
|
22
|
+
@abc.abstractmethod
|
|
23
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
24
|
+
"""Accept the transformer."""
|
|
25
|
+
raise NotImplementedError()
|
|
26
|
+
|
|
27
|
+
@abc.abstractmethod
|
|
28
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
29
|
+
"""Accept the transformer."""
|
|
30
|
+
raise NotImplementedError()
|
|
31
|
+
|
|
32
|
+
def __str__(self) -> str:
|
|
33
|
+
"""Provide a human-readable representation of the instance."""
|
|
34
|
+
return dump(self)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class Statement(Node):
|
|
38
|
+
"""Represent a statement in a program."""
|
|
39
|
+
|
|
40
|
+
@abc.abstractmethod
|
|
41
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
42
|
+
"""Accept the transformer."""
|
|
43
|
+
raise NotImplementedError()
|
|
44
|
+
|
|
45
|
+
@abc.abstractmethod
|
|
46
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
47
|
+
"""Accept the transformer."""
|
|
48
|
+
raise NotImplementedError()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class Expression(Node):
|
|
52
|
+
"""Represent an expression in our abstract syntax tree."""
|
|
53
|
+
|
|
54
|
+
@abc.abstractmethod
|
|
55
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
56
|
+
"""Accept the transformer."""
|
|
57
|
+
raise NotImplementedError()
|
|
58
|
+
|
|
59
|
+
@abc.abstractmethod
|
|
60
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
61
|
+
"""Accept the transformer."""
|
|
62
|
+
raise NotImplementedError()
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class Member(Expression):
|
|
66
|
+
"""
|
|
67
|
+
Represent a member of an instance.
|
|
68
|
+
|
|
69
|
+
A member is either a property or a method.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
def __init__(
|
|
73
|
+
self, instance: "Expression", name: Identifier, original_node: ast.AST
|
|
74
|
+
) -> None:
|
|
75
|
+
"""Initialize with the given values."""
|
|
76
|
+
Expression.__init__(self, original_node=original_node)
|
|
77
|
+
self.instance = instance
|
|
78
|
+
self.name = name
|
|
79
|
+
|
|
80
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
81
|
+
"""Accept the transformer."""
|
|
82
|
+
return transformer.transform_member(self)
|
|
83
|
+
|
|
84
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
85
|
+
"""Accept the visitor."""
|
|
86
|
+
visitor.visit_member(self)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class Index(Expression):
|
|
90
|
+
"""Represent an index access on a collection."""
|
|
91
|
+
|
|
92
|
+
def __init__(
|
|
93
|
+
self, collection: "Expression", index: "Expression", original_node: ast.AST
|
|
94
|
+
) -> None:
|
|
95
|
+
"""Initialize with the given values."""
|
|
96
|
+
Expression.__init__(self, original_node=original_node)
|
|
97
|
+
self.collection = collection
|
|
98
|
+
self.index = index
|
|
99
|
+
|
|
100
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
101
|
+
"""Accept the transformer."""
|
|
102
|
+
return transformer.transform_index(self)
|
|
103
|
+
|
|
104
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
105
|
+
"""Accept the visitor."""
|
|
106
|
+
visitor.visit_index(self)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class Comparator(enum.Enum):
|
|
110
|
+
"""List comparison operands."""
|
|
111
|
+
|
|
112
|
+
LT = "LT"
|
|
113
|
+
LE = "LE"
|
|
114
|
+
GT = "GT"
|
|
115
|
+
GE = "GE"
|
|
116
|
+
EQ = "EQ"
|
|
117
|
+
NE = "NE"
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class Comparison(Expression):
|
|
121
|
+
"""Represent a comparison operation."""
|
|
122
|
+
|
|
123
|
+
def __init__(
|
|
124
|
+
self,
|
|
125
|
+
left: "Expression",
|
|
126
|
+
op: Comparator,
|
|
127
|
+
right: "Expression",
|
|
128
|
+
original_node: ast.AST,
|
|
129
|
+
) -> None:
|
|
130
|
+
Expression.__init__(self, original_node=original_node)
|
|
131
|
+
self.left = left
|
|
132
|
+
self.op = op
|
|
133
|
+
self.right = right
|
|
134
|
+
|
|
135
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
136
|
+
"""Accept the transformer."""
|
|
137
|
+
return transformer.transform_comparison(self)
|
|
138
|
+
|
|
139
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
140
|
+
"""Accept the visitor."""
|
|
141
|
+
visitor.visit_comparison(self)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
class IsIn(Expression):
|
|
145
|
+
"""Represent the membership ``x in A``."""
|
|
146
|
+
|
|
147
|
+
def __init__(
|
|
148
|
+
self, member: "Expression", container: "Expression", original_node: ast.AST
|
|
149
|
+
) -> None:
|
|
150
|
+
"""Initialize with the given values."""
|
|
151
|
+
Expression.__init__(self, original_node=original_node)
|
|
152
|
+
self.member = member
|
|
153
|
+
self.container = container
|
|
154
|
+
|
|
155
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
156
|
+
"""Accept the transformer."""
|
|
157
|
+
return transformer.transform_is_in(self)
|
|
158
|
+
|
|
159
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
160
|
+
"""Accept the visitor."""
|
|
161
|
+
visitor.visit_is_in(self)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class Implication(Expression):
|
|
165
|
+
"""Represent an implication of the form ``A => B``."""
|
|
166
|
+
|
|
167
|
+
def __init__(
|
|
168
|
+
self, antecedent: "Expression", consequent: "Expression", original_node: ast.AST
|
|
169
|
+
) -> None:
|
|
170
|
+
"""Initialize with the given values."""
|
|
171
|
+
Expression.__init__(self, original_node=original_node)
|
|
172
|
+
self.antecedent = antecedent
|
|
173
|
+
self.consequent = consequent
|
|
174
|
+
|
|
175
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
176
|
+
"""Accept the transformer."""
|
|
177
|
+
return transformer.transform_implication(self)
|
|
178
|
+
|
|
179
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
180
|
+
"""Accept the visitor."""
|
|
181
|
+
visitor.visit_implication(self)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class MethodCall(Expression):
|
|
185
|
+
"""Represent a method call."""
|
|
186
|
+
|
|
187
|
+
def __init__(
|
|
188
|
+
self, member: Member, args: Sequence["Expression"], original_node: ast.AST
|
|
189
|
+
) -> None:
|
|
190
|
+
"""Initialize with the given values."""
|
|
191
|
+
Expression.__init__(self, original_node=original_node)
|
|
192
|
+
self.member = member
|
|
193
|
+
self.args = args
|
|
194
|
+
|
|
195
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
196
|
+
"""Accept the transformer."""
|
|
197
|
+
return transformer.transform_method_call(self)
|
|
198
|
+
|
|
199
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
200
|
+
"""Accept the visitor."""
|
|
201
|
+
visitor.visit_method_call(self)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class Name(Expression):
|
|
205
|
+
"""Represent access to a variable with the given name."""
|
|
206
|
+
|
|
207
|
+
def __init__(self, identifier: Identifier, original_node: ast.AST) -> None:
|
|
208
|
+
"""Initialize with the given values."""
|
|
209
|
+
Expression.__init__(self, original_node=original_node)
|
|
210
|
+
self.identifier = identifier
|
|
211
|
+
|
|
212
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
213
|
+
"""Accept the transformer."""
|
|
214
|
+
return transformer.transform_name(self)
|
|
215
|
+
|
|
216
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
217
|
+
"""Accept the visitor."""
|
|
218
|
+
visitor.visit_name(self)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
class FunctionCall(Expression):
|
|
222
|
+
"""Represent a function call."""
|
|
223
|
+
|
|
224
|
+
def __init__(
|
|
225
|
+
self, name: Name, args: Sequence["Expression"], original_node: ast.AST
|
|
226
|
+
) -> None:
|
|
227
|
+
"""Initialize with the given values."""
|
|
228
|
+
Expression.__init__(self, original_node=original_node)
|
|
229
|
+
self.name = name
|
|
230
|
+
self.args = args
|
|
231
|
+
|
|
232
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
233
|
+
"""Accept the transformer."""
|
|
234
|
+
return transformer.transform_function_call(self)
|
|
235
|
+
|
|
236
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
237
|
+
"""Accept the visitor."""
|
|
238
|
+
visitor.visit_function_call(self)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
class Constant(Expression):
|
|
242
|
+
"""Represent a constant value."""
|
|
243
|
+
|
|
244
|
+
def __init__(
|
|
245
|
+
self, value: Union[bool, int, float, str], original_node: ast.AST
|
|
246
|
+
) -> None:
|
|
247
|
+
"""Initialize with the given values."""
|
|
248
|
+
Expression.__init__(self, original_node=original_node)
|
|
249
|
+
self.value = value
|
|
250
|
+
|
|
251
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
252
|
+
"""Accept the transformer."""
|
|
253
|
+
return transformer.transform_constant(self)
|
|
254
|
+
|
|
255
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
256
|
+
"""Accept the visitor."""
|
|
257
|
+
visitor.visit_constant(self)
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
class IsNone(Expression):
|
|
261
|
+
"""Represent a check whether something ``is None``."""
|
|
262
|
+
|
|
263
|
+
def __init__(self, value: Expression, original_node: ast.AST) -> None:
|
|
264
|
+
"""Initialize with the given values."""
|
|
265
|
+
Expression.__init__(self, original_node=original_node)
|
|
266
|
+
self.value = value
|
|
267
|
+
|
|
268
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
269
|
+
"""Accept the transformer."""
|
|
270
|
+
return transformer.transform_is_none(self)
|
|
271
|
+
|
|
272
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
273
|
+
"""Accept the visitor."""
|
|
274
|
+
visitor.visit_is_none(self)
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
class IsNotNone(Expression):
|
|
278
|
+
"""Represent a check whether something ``is not None``."""
|
|
279
|
+
|
|
280
|
+
def __init__(self, value: Expression, original_node: ast.AST) -> None:
|
|
281
|
+
"""Initialize with the given values."""
|
|
282
|
+
Expression.__init__(self, original_node=original_node)
|
|
283
|
+
self.value = value
|
|
284
|
+
|
|
285
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
286
|
+
"""Accept the transformer."""
|
|
287
|
+
return transformer.transform_is_not_none(self)
|
|
288
|
+
|
|
289
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
290
|
+
"""Accept the visitor."""
|
|
291
|
+
visitor.visit_is_not_none(self)
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
class Not(Expression):
|
|
295
|
+
"""Represent a negation."""
|
|
296
|
+
|
|
297
|
+
def __init__(self, operand: Expression, original_node: ast.AST) -> None:
|
|
298
|
+
"""Initialize with the given values."""
|
|
299
|
+
Expression.__init__(self, original_node=original_node)
|
|
300
|
+
self.operand = operand
|
|
301
|
+
|
|
302
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
303
|
+
"""Accept the transformer."""
|
|
304
|
+
return transformer.transform_not(self)
|
|
305
|
+
|
|
306
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
307
|
+
"""Accept the visitor."""
|
|
308
|
+
visitor.visit_not(self)
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
class And(Expression):
|
|
312
|
+
"""Represent a conjunction."""
|
|
313
|
+
|
|
314
|
+
def __init__(self, values: Sequence[Expression], original_node: ast.AST) -> None:
|
|
315
|
+
Expression.__init__(self, original_node=original_node)
|
|
316
|
+
self.values = values
|
|
317
|
+
|
|
318
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
319
|
+
"""Accept the transformer."""
|
|
320
|
+
return transformer.transform_and(self)
|
|
321
|
+
|
|
322
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
323
|
+
"""Accept the visitor."""
|
|
324
|
+
visitor.visit_and(self)
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
class Or(Expression):
|
|
328
|
+
"""Represent a disjunction."""
|
|
329
|
+
|
|
330
|
+
def __init__(self, values: Sequence[Expression], original_node: ast.AST) -> None:
|
|
331
|
+
Expression.__init__(self, original_node=original_node)
|
|
332
|
+
self.values = values
|
|
333
|
+
|
|
334
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
335
|
+
"""Accept the transformer."""
|
|
336
|
+
return transformer.transform_or(self)
|
|
337
|
+
|
|
338
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
339
|
+
"""Accept the visitor."""
|
|
340
|
+
visitor.visit_or(self)
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
class Add(Expression):
|
|
344
|
+
"""Represent an addition."""
|
|
345
|
+
|
|
346
|
+
def __init__(
|
|
347
|
+
self, left: Expression, right: Expression, original_node: ast.AST
|
|
348
|
+
) -> None:
|
|
349
|
+
Expression.__init__(self, original_node=original_node)
|
|
350
|
+
self.left = left
|
|
351
|
+
self.right = right
|
|
352
|
+
|
|
353
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
354
|
+
"""Accept the transformer."""
|
|
355
|
+
return transformer.transform_add(self)
|
|
356
|
+
|
|
357
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
358
|
+
"""Accept the visitor."""
|
|
359
|
+
visitor.visit_add(self)
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
class Sub(Expression):
|
|
363
|
+
"""Represent a subtraction."""
|
|
364
|
+
|
|
365
|
+
def __init__(
|
|
366
|
+
self, left: Expression, right: Expression, original_node: ast.AST
|
|
367
|
+
) -> None:
|
|
368
|
+
Expression.__init__(self, original_node=original_node)
|
|
369
|
+
self.left = left
|
|
370
|
+
self.right = right
|
|
371
|
+
|
|
372
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
373
|
+
"""Accept the transformer."""
|
|
374
|
+
return transformer.transform_sub(self)
|
|
375
|
+
|
|
376
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
377
|
+
"""Accept the visitor."""
|
|
378
|
+
visitor.visit_sub(self)
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
class FormattedValue(Node):
|
|
382
|
+
"""Represent a formatted value in a :py:class`JoinedStr`."""
|
|
383
|
+
|
|
384
|
+
def __init__(self, value: Expression, original_node: ast.AST) -> None:
|
|
385
|
+
"""Initialize with the given values."""
|
|
386
|
+
Node.__init__(self, original_node=original_node)
|
|
387
|
+
|
|
388
|
+
self.value = value
|
|
389
|
+
|
|
390
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
391
|
+
"""Accept the transformer."""
|
|
392
|
+
return transformer.transform_formatted_value(self)
|
|
393
|
+
|
|
394
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
395
|
+
"""Accept the visitor."""
|
|
396
|
+
visitor.visit_formatted_value(self)
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
class JoinedStr(Expression):
|
|
400
|
+
"""Represent a string interpolation."""
|
|
401
|
+
|
|
402
|
+
def __init__(
|
|
403
|
+
self, values: Sequence[Union[str, FormattedValue]], original_node: ast.AST
|
|
404
|
+
) -> None:
|
|
405
|
+
"""Initialize with the given values."""
|
|
406
|
+
Expression.__init__(self, original_node=original_node)
|
|
407
|
+
|
|
408
|
+
self.values = values
|
|
409
|
+
|
|
410
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
411
|
+
"""Accept the transformer."""
|
|
412
|
+
return transformer.transform_joined_str(self)
|
|
413
|
+
|
|
414
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
415
|
+
"""Accept the visitor."""
|
|
416
|
+
visitor.visit_joined_str(self)
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
class ForEach(Node):
|
|
420
|
+
"""Structure the information about the iteration over a collection."""
|
|
421
|
+
|
|
422
|
+
def __init__(
|
|
423
|
+
self, variable: Name, iteration: Expression, original_node: ast.AST
|
|
424
|
+
) -> None:
|
|
425
|
+
"""Initialize with the given values."""
|
|
426
|
+
Node.__init__(self, original_node=original_node)
|
|
427
|
+
self.variable = variable
|
|
428
|
+
self.iteration = iteration
|
|
429
|
+
|
|
430
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
431
|
+
"""Accept the transformer."""
|
|
432
|
+
return transformer.transform_for_each(self)
|
|
433
|
+
|
|
434
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
435
|
+
"""Accept the visitor."""
|
|
436
|
+
visitor.visit_for_each(self)
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
class ForRange(Node):
|
|
440
|
+
"""Structure the information about the iteration over a range of integers."""
|
|
441
|
+
|
|
442
|
+
def __init__(
|
|
443
|
+
self, variable: Name, start: Expression, end: Expression, original_node: ast.AST
|
|
444
|
+
) -> None:
|
|
445
|
+
"""Initialize with the given values."""
|
|
446
|
+
Node.__init__(self, original_node=original_node)
|
|
447
|
+
self.variable = variable
|
|
448
|
+
self.start = start
|
|
449
|
+
self.end = end
|
|
450
|
+
|
|
451
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
452
|
+
"""Accept the transformer."""
|
|
453
|
+
return transformer.transform_for_range(self)
|
|
454
|
+
|
|
455
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
456
|
+
"""Accept the visitor."""
|
|
457
|
+
visitor.visit_for_range(self)
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
ForUnion = Union[ForEach, ForRange]
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
class Any(Expression):
|
|
464
|
+
"""Represent an ``any(...)`` expression."""
|
|
465
|
+
|
|
466
|
+
def __init__(
|
|
467
|
+
self, generator: ForUnion, condition: Expression, original_node: ast.AST
|
|
468
|
+
) -> None:
|
|
469
|
+
"""Initialize with the given values."""
|
|
470
|
+
Expression.__init__(self, original_node=original_node)
|
|
471
|
+
self.generator = generator
|
|
472
|
+
self.condition = condition
|
|
473
|
+
|
|
474
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
475
|
+
"""Accept the transformer."""
|
|
476
|
+
return transformer.transform_any(self)
|
|
477
|
+
|
|
478
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
479
|
+
"""Accept the visitor."""
|
|
480
|
+
visitor.visit_any(self)
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
class All(Expression):
|
|
484
|
+
"""Represent an ``all(...)`` expression."""
|
|
485
|
+
|
|
486
|
+
def __init__(
|
|
487
|
+
self, generator: ForUnion, condition: Expression, original_node: ast.AST
|
|
488
|
+
) -> None:
|
|
489
|
+
"""Initialize with the given values."""
|
|
490
|
+
Expression.__init__(self, original_node=original_node)
|
|
491
|
+
self.generator = generator
|
|
492
|
+
self.condition = condition
|
|
493
|
+
|
|
494
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
495
|
+
"""Accept the transformer."""
|
|
496
|
+
return transformer.transform_all(self)
|
|
497
|
+
|
|
498
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
499
|
+
"""Accept the visitor."""
|
|
500
|
+
visitor.visit_all(self)
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
class Assignment(Statement):
|
|
504
|
+
"""Represent an assignment of a single value to a single target."""
|
|
505
|
+
|
|
506
|
+
def __init__(
|
|
507
|
+
self, target: Expression, value: Expression, original_node: ast.AST
|
|
508
|
+
) -> None:
|
|
509
|
+
"""Initialize with the given values."""
|
|
510
|
+
Statement.__init__(self, original_node=original_node)
|
|
511
|
+
self.target = target
|
|
512
|
+
self.value = value
|
|
513
|
+
|
|
514
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
515
|
+
"""Accept the transformer."""
|
|
516
|
+
return transformer.transform_assignment(self)
|
|
517
|
+
|
|
518
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
519
|
+
"""Accept the visitor."""
|
|
520
|
+
visitor.visit_assignment(self)
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
class Return(Statement):
|
|
524
|
+
"""Represent a return statement with a single return value."""
|
|
525
|
+
|
|
526
|
+
def __init__(self, value: Optional[Expression], original_node: ast.AST) -> None:
|
|
527
|
+
"""Initialize with the given values."""
|
|
528
|
+
Statement.__init__(self, original_node=original_node)
|
|
529
|
+
self.value = value
|
|
530
|
+
|
|
531
|
+
def transform(self, transformer: "Transformer[T]") -> T:
|
|
532
|
+
"""Accept the transformer."""
|
|
533
|
+
return transformer.transform_return(self)
|
|
534
|
+
|
|
535
|
+
def visit(self, visitor: "Visitor") -> None:
|
|
536
|
+
"""Accept the visitor."""
|
|
537
|
+
visitor.visit_return(self)
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
class Visitor(DBC):
|
|
541
|
+
"""
|
|
542
|
+
Visit all the nodes in the AST.
|
|
543
|
+
|
|
544
|
+
The default action for the generic visitor is to descend recursively into all the
|
|
545
|
+
children nodes.
|
|
546
|
+
"""
|
|
547
|
+
|
|
548
|
+
def visit(self, node: Node) -> None:
|
|
549
|
+
"""Dispatch to the appropriate visitation method."""
|
|
550
|
+
node.visit(self)
|
|
551
|
+
|
|
552
|
+
def visit_member(self, node: Member) -> None:
|
|
553
|
+
"""Visit a member."""
|
|
554
|
+
self.visit(node.instance)
|
|
555
|
+
|
|
556
|
+
def visit_index(self, node: Index) -> None:
|
|
557
|
+
"""Visit an index access."""
|
|
558
|
+
self.visit(node.collection)
|
|
559
|
+
self.visit(node.index)
|
|
560
|
+
|
|
561
|
+
def visit_comparison(self, node: Comparison) -> None:
|
|
562
|
+
"""Visit a comparison."""
|
|
563
|
+
self.visit(node.left)
|
|
564
|
+
self.visit(node.right)
|
|
565
|
+
|
|
566
|
+
def visit_is_in(self, node: IsIn) -> None:
|
|
567
|
+
"""Visit a membership relation."""
|
|
568
|
+
self.visit(node.member)
|
|
569
|
+
self.visit(node.container)
|
|
570
|
+
|
|
571
|
+
def visit_implication(self, node: Implication) -> None:
|
|
572
|
+
"""Visit an implication."""
|
|
573
|
+
self.visit(node.antecedent)
|
|
574
|
+
self.visit(node.consequent)
|
|
575
|
+
|
|
576
|
+
def visit_method_call(self, node: MethodCall) -> None:
|
|
577
|
+
"""Visit a method call."""
|
|
578
|
+
self.visit(node.member)
|
|
579
|
+
for arg in node.args:
|
|
580
|
+
self.visit(arg)
|
|
581
|
+
|
|
582
|
+
def visit_function_call(self, node: FunctionCall) -> None:
|
|
583
|
+
"""Visit a function call."""
|
|
584
|
+
for arg in node.args:
|
|
585
|
+
self.visit(arg)
|
|
586
|
+
|
|
587
|
+
def visit_constant(self, node: Constant) -> None:
|
|
588
|
+
"""Visit a constant."""
|
|
589
|
+
pass
|
|
590
|
+
|
|
591
|
+
def visit_is_none(self, node: IsNone) -> None:
|
|
592
|
+
"""Visit an is-none check."""
|
|
593
|
+
self.visit(node.value)
|
|
594
|
+
|
|
595
|
+
def visit_is_not_none(self, node: IsNotNone) -> None:
|
|
596
|
+
"""Visit an is-not-none check."""
|
|
597
|
+
self.visit(node.value)
|
|
598
|
+
|
|
599
|
+
def visit_name(self, node: Name) -> None:
|
|
600
|
+
"""Visit a variable access."""
|
|
601
|
+
pass
|
|
602
|
+
|
|
603
|
+
def visit_not(self, node: Not) -> None:
|
|
604
|
+
"""Visit a negation."""
|
|
605
|
+
self.visit(node.operand)
|
|
606
|
+
|
|
607
|
+
def visit_and(self, node: And) -> None:
|
|
608
|
+
"""Visit a conjunction."""
|
|
609
|
+
for value in node.values:
|
|
610
|
+
self.visit(value)
|
|
611
|
+
|
|
612
|
+
def visit_or(self, node: Or) -> None:
|
|
613
|
+
"""Visit a disjunction."""
|
|
614
|
+
for value in node.values:
|
|
615
|
+
self.visit(value)
|
|
616
|
+
|
|
617
|
+
def visit_add(self, node: Add) -> None:
|
|
618
|
+
"""Visit an addition."""
|
|
619
|
+
self.visit(node.left)
|
|
620
|
+
self.visit(node.right)
|
|
621
|
+
|
|
622
|
+
def visit_sub(self, node: Sub) -> None:
|
|
623
|
+
"""Visit a subtraction."""
|
|
624
|
+
self.visit(node.left)
|
|
625
|
+
self.visit(node.right)
|
|
626
|
+
|
|
627
|
+
def visit_formatted_value(self, node: FormattedValue) -> None:
|
|
628
|
+
"""Visit a formatted value in a joined string."""
|
|
629
|
+
self.visit(node.value)
|
|
630
|
+
|
|
631
|
+
def visit_joined_str(self, node: JoinedStr) -> None:
|
|
632
|
+
"""Visit a string interpolation."""
|
|
633
|
+
for value in node.values:
|
|
634
|
+
if isinstance(value, str):
|
|
635
|
+
pass
|
|
636
|
+
elif isinstance(value, FormattedValue):
|
|
637
|
+
self.visit(value)
|
|
638
|
+
else:
|
|
639
|
+
assert_never(value)
|
|
640
|
+
|
|
641
|
+
def visit_for_each(self, node: ForEach) -> None:
|
|
642
|
+
"""Visit a for-each in a generator."""
|
|
643
|
+
self.visit(node.iteration)
|
|
644
|
+
|
|
645
|
+
def visit_for_range(self, node: ForRange) -> None:
|
|
646
|
+
"""Visit a for-range in a generator."""
|
|
647
|
+
self.visit(node.start)
|
|
648
|
+
self.visit(node.end)
|
|
649
|
+
|
|
650
|
+
def visit_any(self, node: Any) -> None:
|
|
651
|
+
"""Visit an ``any(...)`` expression."""
|
|
652
|
+
self.visit(node.generator)
|
|
653
|
+
self.visit(node.condition)
|
|
654
|
+
|
|
655
|
+
def visit_all(self, node: All) -> None:
|
|
656
|
+
"""Visit an ``all(...)`` expression."""
|
|
657
|
+
self.visit(node.generator)
|
|
658
|
+
self.visit(node.condition)
|
|
659
|
+
|
|
660
|
+
def visit_assignment(self, node: Assignment) -> None:
|
|
661
|
+
"""Visit an assignment statement."""
|
|
662
|
+
self.visit(node.target)
|
|
663
|
+
self.visit(node.value)
|
|
664
|
+
|
|
665
|
+
def visit_return(self, node: Return) -> None:
|
|
666
|
+
"""Visit a return statement."""
|
|
667
|
+
if node.value is not None:
|
|
668
|
+
self.visit(node.value)
|
|
669
|
+
|
|
670
|
+
|
|
671
|
+
class Transformer(Generic[T], DBC):
|
|
672
|
+
"""Transform our AST into something."""
|
|
673
|
+
|
|
674
|
+
def transform(self, node: Node) -> T:
|
|
675
|
+
"""Dispatch to the appropriate transformation method."""
|
|
676
|
+
return node.transform(self)
|
|
677
|
+
|
|
678
|
+
@abc.abstractmethod
|
|
679
|
+
def transform_member(self, node: Member) -> T:
|
|
680
|
+
"""Transform a member to something."""
|
|
681
|
+
raise NotImplementedError(f"{node=}")
|
|
682
|
+
|
|
683
|
+
@abc.abstractmethod
|
|
684
|
+
def transform_index(self, node: Index) -> T:
|
|
685
|
+
"""Transform an index access to something."""
|
|
686
|
+
raise NotImplementedError(f"{node=}")
|
|
687
|
+
|
|
688
|
+
@abc.abstractmethod
|
|
689
|
+
def transform_comparison(self, node: Comparison) -> T:
|
|
690
|
+
"""Transform a comparison to something."""
|
|
691
|
+
raise NotImplementedError(f"{node=}")
|
|
692
|
+
|
|
693
|
+
@abc.abstractmethod
|
|
694
|
+
def transform_is_in(self, node: IsIn) -> T:
|
|
695
|
+
"""Transform a membership relation to something."""
|
|
696
|
+
raise NotImplementedError(f"{node=}")
|
|
697
|
+
|
|
698
|
+
@abc.abstractmethod
|
|
699
|
+
def transform_implication(self, node: Implication) -> T:
|
|
700
|
+
"""Transform an implication to something."""
|
|
701
|
+
raise NotImplementedError(f"{node=}")
|
|
702
|
+
|
|
703
|
+
@abc.abstractmethod
|
|
704
|
+
def transform_method_call(self, node: MethodCall) -> T:
|
|
705
|
+
"""Transform a method call into something."""
|
|
706
|
+
raise NotImplementedError(f"{node=}")
|
|
707
|
+
|
|
708
|
+
@abc.abstractmethod
|
|
709
|
+
def transform_function_call(self, node: FunctionCall) -> T:
|
|
710
|
+
"""Transform a function call into something."""
|
|
711
|
+
raise NotImplementedError(f"{node=}")
|
|
712
|
+
|
|
713
|
+
@abc.abstractmethod
|
|
714
|
+
def transform_constant(self, node: Constant) -> T:
|
|
715
|
+
"""Transform a constant into something."""
|
|
716
|
+
raise NotImplementedError(f"{node=}")
|
|
717
|
+
|
|
718
|
+
@abc.abstractmethod
|
|
719
|
+
def transform_is_none(self, node: IsNone) -> T:
|
|
720
|
+
"""Transform an is-none check into something."""
|
|
721
|
+
raise NotImplementedError(f"{node=}")
|
|
722
|
+
|
|
723
|
+
@abc.abstractmethod
|
|
724
|
+
def transform_is_not_none(self, node: IsNotNone) -> T:
|
|
725
|
+
"""Transform an is-not-none check into something."""
|
|
726
|
+
raise NotImplementedError(f"{node=}")
|
|
727
|
+
|
|
728
|
+
@abc.abstractmethod
|
|
729
|
+
def transform_name(self, node: Name) -> T:
|
|
730
|
+
"""Transform variable access into something."""
|
|
731
|
+
raise NotImplementedError(f"{node=}")
|
|
732
|
+
|
|
733
|
+
@abc.abstractmethod
|
|
734
|
+
def transform_not(self, node: Not) -> T:
|
|
735
|
+
"""Transform a negation into something."""
|
|
736
|
+
raise NotImplementedError(f"{node=}")
|
|
737
|
+
|
|
738
|
+
@abc.abstractmethod
|
|
739
|
+
def transform_and(self, node: And) -> T:
|
|
740
|
+
"""Transform a conjunction into something."""
|
|
741
|
+
raise NotImplementedError(f"{node=}")
|
|
742
|
+
|
|
743
|
+
@abc.abstractmethod
|
|
744
|
+
def transform_or(self, node: Or) -> T:
|
|
745
|
+
"""Transform a disjunction into something."""
|
|
746
|
+
raise NotImplementedError(f"{node=}")
|
|
747
|
+
|
|
748
|
+
@abc.abstractmethod
|
|
749
|
+
def transform_add(self, node: Add) -> T:
|
|
750
|
+
"""Transform an addition into something."""
|
|
751
|
+
raise NotImplementedError(f"{node=}")
|
|
752
|
+
|
|
753
|
+
@abc.abstractmethod
|
|
754
|
+
def transform_sub(self, node: Sub) -> T:
|
|
755
|
+
"""Transform a subtraction into something."""
|
|
756
|
+
raise NotImplementedError(f"{node=}")
|
|
757
|
+
|
|
758
|
+
@abc.abstractmethod
|
|
759
|
+
def transform_formatted_value(self, node: FormattedValue) -> T:
|
|
760
|
+
"""Transform a formatted value of a joined string into something."""
|
|
761
|
+
raise NotImplementedError(f"{node=}")
|
|
762
|
+
|
|
763
|
+
@abc.abstractmethod
|
|
764
|
+
def transform_joined_str(self, node: JoinedStr) -> T:
|
|
765
|
+
"""Transform a string interpolation into something."""
|
|
766
|
+
raise NotImplementedError(f"{node=}")
|
|
767
|
+
|
|
768
|
+
@abc.abstractmethod
|
|
769
|
+
def transform_for_each(self, node: ForEach) -> T:
|
|
770
|
+
"""Transform the for-each in a generator into something."""
|
|
771
|
+
raise NotImplementedError(f"{node=}")
|
|
772
|
+
|
|
773
|
+
@abc.abstractmethod
|
|
774
|
+
def transform_for_range(self, node: ForRange) -> T:
|
|
775
|
+
"""Transform the for-range in a generator into something."""
|
|
776
|
+
raise NotImplementedError(f"{node=}")
|
|
777
|
+
|
|
778
|
+
@abc.abstractmethod
|
|
779
|
+
def transform_any(self, node: Any) -> T:
|
|
780
|
+
"""Transform an ``any(...)`` into something."""
|
|
781
|
+
raise NotImplementedError(f"{node=}")
|
|
782
|
+
|
|
783
|
+
@abc.abstractmethod
|
|
784
|
+
def transform_all(self, node: All) -> T:
|
|
785
|
+
"""Transform an ``all(...)`` into something."""
|
|
786
|
+
raise NotImplementedError(f"{node=}")
|
|
787
|
+
|
|
788
|
+
@abc.abstractmethod
|
|
789
|
+
def transform_assignment(self, node: Assignment) -> T:
|
|
790
|
+
"""Transform an assignment into something."""
|
|
791
|
+
raise NotImplementedError(f"{node=}")
|
|
792
|
+
|
|
793
|
+
@abc.abstractmethod
|
|
794
|
+
def transform_return(self, node: Return) -> T:
|
|
795
|
+
"""Transform a return statement into something."""
|
|
796
|
+
raise NotImplementedError(f"{node=}")
|
|
797
|
+
|
|
798
|
+
|
|
799
|
+
class _StringifyTransformer(Transformer[stringify.Entity]):
|
|
800
|
+
"""Transform a node into a stringifiable representation."""
|
|
801
|
+
|
|
802
|
+
def transform(self, node: Node) -> stringify.Entity:
|
|
803
|
+
"""Dispatch to the appropriate transformation method."""
|
|
804
|
+
result = node.transform(self)
|
|
805
|
+
stringify.assert_compares_against_dict(entity=result, obj=node)
|
|
806
|
+
return result
|
|
807
|
+
|
|
808
|
+
def transform_member(self, node: Member) -> stringify.Entity:
|
|
809
|
+
return stringify.Entity(
|
|
810
|
+
name=node.__class__.__name__,
|
|
811
|
+
properties=[
|
|
812
|
+
stringify.Property("instance", self.transform(node.instance)),
|
|
813
|
+
stringify.Property("name", node.name),
|
|
814
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
815
|
+
],
|
|
816
|
+
)
|
|
817
|
+
|
|
818
|
+
def transform_index(self, node: Index) -> stringify.Entity:
|
|
819
|
+
return stringify.Entity(
|
|
820
|
+
name=node.__class__.__name__,
|
|
821
|
+
properties=[
|
|
822
|
+
stringify.Property("collection", self.transform(node.collection)),
|
|
823
|
+
stringify.Property("index", self.transform(node.index)),
|
|
824
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
825
|
+
],
|
|
826
|
+
)
|
|
827
|
+
|
|
828
|
+
def transform_comparison(self, node: Comparison) -> stringify.Entity:
|
|
829
|
+
return stringify.Entity(
|
|
830
|
+
name=node.__class__.__name__,
|
|
831
|
+
properties=[
|
|
832
|
+
stringify.Property("left", self.transform(node.left)),
|
|
833
|
+
stringify.Property("op", str(node.op.value)),
|
|
834
|
+
stringify.Property("right", self.transform(node.right)),
|
|
835
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
836
|
+
],
|
|
837
|
+
)
|
|
838
|
+
|
|
839
|
+
def transform_is_in(self, node: IsIn) -> stringify.Entity:
|
|
840
|
+
return stringify.Entity(
|
|
841
|
+
name=node.__class__.__name__,
|
|
842
|
+
properties=[
|
|
843
|
+
stringify.Property("member", self.transform(node.member)),
|
|
844
|
+
stringify.Property("container", self.transform(node.container)),
|
|
845
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
846
|
+
],
|
|
847
|
+
)
|
|
848
|
+
|
|
849
|
+
def transform_implication(self, node: Implication) -> stringify.Entity:
|
|
850
|
+
return stringify.Entity(
|
|
851
|
+
name=node.__class__.__name__,
|
|
852
|
+
properties=[
|
|
853
|
+
stringify.Property("antecedent", self.transform(node.antecedent)),
|
|
854
|
+
stringify.Property("consequent", self.transform(node.consequent)),
|
|
855
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
856
|
+
],
|
|
857
|
+
)
|
|
858
|
+
|
|
859
|
+
def transform_method_call(self, node: MethodCall) -> stringify.Entity:
|
|
860
|
+
return stringify.Entity(
|
|
861
|
+
name=node.__class__.__name__,
|
|
862
|
+
properties=[
|
|
863
|
+
stringify.Property("member", self.transform(node.member)),
|
|
864
|
+
stringify.Property("args", [self.transform(arg) for arg in node.args]),
|
|
865
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
866
|
+
],
|
|
867
|
+
)
|
|
868
|
+
|
|
869
|
+
def transform_function_call(self, node: FunctionCall) -> stringify.Entity:
|
|
870
|
+
return stringify.Entity(
|
|
871
|
+
name=node.__class__.__name__,
|
|
872
|
+
properties=[
|
|
873
|
+
stringify.Property("name", node.name.identifier),
|
|
874
|
+
stringify.Property("args", [self.transform(arg) for arg in node.args]),
|
|
875
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
876
|
+
],
|
|
877
|
+
)
|
|
878
|
+
|
|
879
|
+
def transform_constant(self, node: Constant) -> stringify.Entity:
|
|
880
|
+
return stringify.Entity(
|
|
881
|
+
name=node.__class__.__name__,
|
|
882
|
+
properties=[
|
|
883
|
+
stringify.Property("value", node.value),
|
|
884
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
885
|
+
],
|
|
886
|
+
)
|
|
887
|
+
|
|
888
|
+
def transform_is_none(self, node: IsNone) -> stringify.Entity:
|
|
889
|
+
return stringify.Entity(
|
|
890
|
+
name=node.__class__.__name__,
|
|
891
|
+
properties=[
|
|
892
|
+
stringify.Property("value", self.transform(node.value)),
|
|
893
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
894
|
+
],
|
|
895
|
+
)
|
|
896
|
+
|
|
897
|
+
def transform_is_not_none(self, node: IsNotNone) -> stringify.Entity:
|
|
898
|
+
return stringify.Entity(
|
|
899
|
+
name=node.__class__.__name__,
|
|
900
|
+
properties=[
|
|
901
|
+
stringify.Property("value", self.transform(node.value)),
|
|
902
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
903
|
+
],
|
|
904
|
+
)
|
|
905
|
+
|
|
906
|
+
def transform_name(self, node: Name) -> stringify.Entity:
|
|
907
|
+
return stringify.Entity(
|
|
908
|
+
name=node.__class__.__name__,
|
|
909
|
+
properties=[
|
|
910
|
+
stringify.Property("identifier", node.identifier),
|
|
911
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
912
|
+
],
|
|
913
|
+
)
|
|
914
|
+
|
|
915
|
+
def transform_not(self, node: Not) -> stringify.Entity:
|
|
916
|
+
return stringify.Entity(
|
|
917
|
+
name=node.__class__.__name__,
|
|
918
|
+
properties=[
|
|
919
|
+
stringify.Property("operand", self.transform(node.operand)),
|
|
920
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
921
|
+
],
|
|
922
|
+
)
|
|
923
|
+
|
|
924
|
+
def transform_and(self, node: And) -> stringify.Entity:
|
|
925
|
+
return stringify.Entity(
|
|
926
|
+
name=node.__class__.__name__,
|
|
927
|
+
properties=[
|
|
928
|
+
stringify.Property(
|
|
929
|
+
"values", [self.transform(value) for value in node.values]
|
|
930
|
+
),
|
|
931
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
932
|
+
],
|
|
933
|
+
)
|
|
934
|
+
|
|
935
|
+
def transform_or(self, node: Or) -> stringify.Entity:
|
|
936
|
+
return stringify.Entity(
|
|
937
|
+
name=node.__class__.__name__,
|
|
938
|
+
properties=[
|
|
939
|
+
stringify.Property(
|
|
940
|
+
"values", [self.transform(value) for value in node.values]
|
|
941
|
+
),
|
|
942
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
943
|
+
],
|
|
944
|
+
)
|
|
945
|
+
|
|
946
|
+
def transform_add(self, node: Add) -> stringify.Entity:
|
|
947
|
+
return stringify.Entity(
|
|
948
|
+
name=node.__class__.__name__,
|
|
949
|
+
properties=[
|
|
950
|
+
stringify.Property("left", self.transform(node.left)),
|
|
951
|
+
stringify.Property("right", self.transform(node.right)),
|
|
952
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
953
|
+
],
|
|
954
|
+
)
|
|
955
|
+
|
|
956
|
+
def transform_sub(self, node: Sub) -> stringify.Entity:
|
|
957
|
+
return stringify.Entity(
|
|
958
|
+
name=node.__class__.__name__,
|
|
959
|
+
properties=[
|
|
960
|
+
stringify.Property("left", self.transform(node.left)),
|
|
961
|
+
stringify.Property("right", self.transform(node.right)),
|
|
962
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
963
|
+
],
|
|
964
|
+
)
|
|
965
|
+
|
|
966
|
+
def transform_formatted_value(self, node: FormattedValue) -> stringify.Entity:
|
|
967
|
+
return stringify.Entity(
|
|
968
|
+
name=node.__class__.__name__,
|
|
969
|
+
properties=[
|
|
970
|
+
stringify.Property("value", self.transform(node.value)),
|
|
971
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
972
|
+
],
|
|
973
|
+
)
|
|
974
|
+
|
|
975
|
+
def transform_joined_str(self, node: JoinedStr) -> stringify.Entity:
|
|
976
|
+
values = [] # type: List[Union[stringify.Entity, str]]
|
|
977
|
+
for value in node.values:
|
|
978
|
+
if isinstance(value, str):
|
|
979
|
+
values.append(value)
|
|
980
|
+
elif isinstance(value, FormattedValue):
|
|
981
|
+
values.append(self.transform(value))
|
|
982
|
+
else:
|
|
983
|
+
assert_never(value)
|
|
984
|
+
|
|
985
|
+
return stringify.Entity(
|
|
986
|
+
name=node.__class__.__name__,
|
|
987
|
+
properties=[
|
|
988
|
+
stringify.Property(
|
|
989
|
+
"values",
|
|
990
|
+
values,
|
|
991
|
+
),
|
|
992
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
993
|
+
],
|
|
994
|
+
)
|
|
995
|
+
|
|
996
|
+
def transform_for_each(self, node: ForEach) -> stringify.Entity:
|
|
997
|
+
return stringify.Entity(
|
|
998
|
+
name=node.__class__.__name__,
|
|
999
|
+
properties=[
|
|
1000
|
+
stringify.Property("variable", self.transform(node.variable)),
|
|
1001
|
+
stringify.Property("iteration", self.transform(node.iteration)),
|
|
1002
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
1003
|
+
],
|
|
1004
|
+
)
|
|
1005
|
+
|
|
1006
|
+
def transform_for_range(self, node: ForRange) -> stringify.Entity:
|
|
1007
|
+
return stringify.Entity(
|
|
1008
|
+
name=node.__class__.__name__,
|
|
1009
|
+
properties=[
|
|
1010
|
+
stringify.Property("variable", self.transform(node.variable)),
|
|
1011
|
+
stringify.Property("start", self.transform(node.start)),
|
|
1012
|
+
stringify.Property("end", self.transform(node.end)),
|
|
1013
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
1014
|
+
],
|
|
1015
|
+
)
|
|
1016
|
+
|
|
1017
|
+
def transform_any(self, node: Any) -> stringify.Entity:
|
|
1018
|
+
return stringify.Entity(
|
|
1019
|
+
name=node.__class__.__name__,
|
|
1020
|
+
properties=[
|
|
1021
|
+
stringify.Property("generator", self.transform(node.generator)),
|
|
1022
|
+
stringify.Property("condition", self.transform(node.condition)),
|
|
1023
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
1024
|
+
],
|
|
1025
|
+
)
|
|
1026
|
+
|
|
1027
|
+
def transform_all(self, node: All) -> stringify.Entity:
|
|
1028
|
+
return stringify.Entity(
|
|
1029
|
+
name=node.__class__.__name__,
|
|
1030
|
+
properties=[
|
|
1031
|
+
stringify.Property("generator", self.transform(node.generator)),
|
|
1032
|
+
stringify.Property("condition", self.transform(node.condition)),
|
|
1033
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
1034
|
+
],
|
|
1035
|
+
)
|
|
1036
|
+
|
|
1037
|
+
def transform_assignment(self, node: Assignment) -> stringify.Entity:
|
|
1038
|
+
return stringify.Entity(
|
|
1039
|
+
name=node.__class__.__name__,
|
|
1040
|
+
properties=[
|
|
1041
|
+
stringify.Property("target", self.transform(node.target)),
|
|
1042
|
+
stringify.Property("value", self.transform(node.value)),
|
|
1043
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
1044
|
+
],
|
|
1045
|
+
)
|
|
1046
|
+
|
|
1047
|
+
def transform_return(self, node: Return) -> stringify.Entity:
|
|
1048
|
+
return stringify.Entity(
|
|
1049
|
+
name=node.__class__.__name__,
|
|
1050
|
+
properties=[
|
|
1051
|
+
stringify.Property(
|
|
1052
|
+
"value",
|
|
1053
|
+
self.transform(node.value) if node.value is not None else None,
|
|
1054
|
+
),
|
|
1055
|
+
stringify.PropertyEllipsis("original_node", node.original_node),
|
|
1056
|
+
],
|
|
1057
|
+
)
|
|
1058
|
+
|
|
1059
|
+
|
|
1060
|
+
def dump(node: Node) -> str:
|
|
1061
|
+
"""Produce a string representation of the tree."""
|
|
1062
|
+
transformer = _StringifyTransformer()
|
|
1063
|
+
return stringify.dump(transformer.transform(node=node))
|
|
1064
|
+
|
|
1065
|
+
|
|
1066
|
+
class RestrictedTransformer(Transformer[T]):
|
|
1067
|
+
"""
|
|
1068
|
+
Transform our AST into something where only a part of the tree is handled.
|
|
1069
|
+
|
|
1070
|
+
This class is helpful for cases where you are sure that certain nodes *can not*
|
|
1071
|
+
appear.
|
|
1072
|
+
"""
|
|
1073
|
+
|
|
1074
|
+
def transform_member(self, node: Member) -> T:
|
|
1075
|
+
"""Transform a member to something."""
|
|
1076
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1077
|
+
|
|
1078
|
+
def transform_index(self, node: Index) -> T:
|
|
1079
|
+
"""Transform an index access to something."""
|
|
1080
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1081
|
+
|
|
1082
|
+
def transform_comparison(self, node: Comparison) -> T:
|
|
1083
|
+
"""Transform a comparison to something."""
|
|
1084
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1085
|
+
|
|
1086
|
+
def transform_is_in(self, node: IsIn) -> T:
|
|
1087
|
+
"""Transform a membership relation to something."""
|
|
1088
|
+
raise NotImplementedError(f"{node=}")
|
|
1089
|
+
|
|
1090
|
+
def transform_implication(self, node: Implication) -> T:
|
|
1091
|
+
"""Transform an implication to something."""
|
|
1092
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1093
|
+
|
|
1094
|
+
def transform_method_call(self, node: MethodCall) -> T:
|
|
1095
|
+
"""Transform a method call into something."""
|
|
1096
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1097
|
+
|
|
1098
|
+
def transform_function_call(self, node: FunctionCall) -> T:
|
|
1099
|
+
"""Transform a function call into something."""
|
|
1100
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1101
|
+
|
|
1102
|
+
def transform_constant(self, node: Constant) -> T:
|
|
1103
|
+
"""Transform a constant into something."""
|
|
1104
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1105
|
+
|
|
1106
|
+
def transform_is_none(self, node: IsNone) -> T:
|
|
1107
|
+
"""Transform an is-none check into something."""
|
|
1108
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1109
|
+
|
|
1110
|
+
def transform_is_not_none(self, node: IsNotNone) -> T:
|
|
1111
|
+
"""Transform an is-not-none check into something."""
|
|
1112
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1113
|
+
|
|
1114
|
+
def transform_name(self, node: Name) -> T:
|
|
1115
|
+
"""Transform variable access into something."""
|
|
1116
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1117
|
+
|
|
1118
|
+
def transform_not(self, node: Not) -> T:
|
|
1119
|
+
"""Transform a negation into something."""
|
|
1120
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1121
|
+
|
|
1122
|
+
def transform_and(self, node: And) -> T:
|
|
1123
|
+
"""Transform a conjunction into something."""
|
|
1124
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1125
|
+
|
|
1126
|
+
def transform_or(self, node: Or) -> T:
|
|
1127
|
+
"""Transform a disjunction into something."""
|
|
1128
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1129
|
+
|
|
1130
|
+
def transform_add(self, node: Add) -> T:
|
|
1131
|
+
"""Transform an addition into something."""
|
|
1132
|
+
raise NotImplementedError(f"{node=}")
|
|
1133
|
+
|
|
1134
|
+
def transform_sub(self, node: Sub) -> T:
|
|
1135
|
+
"""Transform a subtraction into something."""
|
|
1136
|
+
raise NotImplementedError(f"{node=}")
|
|
1137
|
+
|
|
1138
|
+
def transform_formatted_value(self, node: FormattedValue) -> T:
|
|
1139
|
+
"""Transform a formatted value in a joined string into something."""
|
|
1140
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1141
|
+
|
|
1142
|
+
def transform_joined_str(self, node: JoinedStr) -> T:
|
|
1143
|
+
"""Transform a string interpolation into something."""
|
|
1144
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1145
|
+
|
|
1146
|
+
def transform_for_each(self, node: ForEach) -> T:
|
|
1147
|
+
"""Transform a for-each in a generator expression into something."""
|
|
1148
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1149
|
+
|
|
1150
|
+
def transform_for_range(self, node: ForRange) -> T:
|
|
1151
|
+
"""Transform a for-range in a generator expression into something."""
|
|
1152
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1153
|
+
|
|
1154
|
+
def transform_any(self, node: Any) -> T:
|
|
1155
|
+
"""Transform an ``any(...)`` expression into something."""
|
|
1156
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1157
|
+
|
|
1158
|
+
def transform_all(self, node: All) -> T:
|
|
1159
|
+
"""Transform an ``all(...)`` expression into something."""
|
|
1160
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1161
|
+
|
|
1162
|
+
def transform_assignment(self, node: Assignment) -> T:
|
|
1163
|
+
"""Transform an assignment into something."""
|
|
1164
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1165
|
+
|
|
1166
|
+
def transform_return(self, node: Return) -> T:
|
|
1167
|
+
"""Transform a return statement into something."""
|
|
1168
|
+
raise AssertionError(f"Unexpected node: {dump(node)}")
|
|
1169
|
+
|
|
1170
|
+
|
|
1171
|
+
class _IterationTransformer(Transformer[Iterator[Node]]):
|
|
1172
|
+
"""Transform a node into an iterator over nodes."""
|
|
1173
|
+
|
|
1174
|
+
def transform(self, node: Node) -> Iterator[Node]:
|
|
1175
|
+
"""Dispatch to the appropriate transformation method."""
|
|
1176
|
+
yield from node.transform(self)
|
|
1177
|
+
|
|
1178
|
+
def transform_member(self, node: Member) -> Iterator[Node]:
|
|
1179
|
+
yield node
|
|
1180
|
+
yield from self.transform(node.instance)
|
|
1181
|
+
|
|
1182
|
+
def transform_index(self, node: Index) -> Iterator[Node]:
|
|
1183
|
+
yield node
|
|
1184
|
+
yield from self.transform(node.collection)
|
|
1185
|
+
yield from self.transform(node.index)
|
|
1186
|
+
|
|
1187
|
+
def transform_comparison(self, node: Comparison) -> Iterator[Node]:
|
|
1188
|
+
yield node
|
|
1189
|
+
yield from self.transform(node.left)
|
|
1190
|
+
yield from self.transform(node.right)
|
|
1191
|
+
|
|
1192
|
+
def transform_is_in(self, node: IsIn) -> Iterator[Node]:
|
|
1193
|
+
yield node
|
|
1194
|
+
yield from self.transform(node.member)
|
|
1195
|
+
yield from self.transform(node.container)
|
|
1196
|
+
|
|
1197
|
+
def transform_implication(self, node: Implication) -> Iterator[Node]:
|
|
1198
|
+
yield node
|
|
1199
|
+
yield from self.transform(node.antecedent)
|
|
1200
|
+
yield from self.transform(node.consequent)
|
|
1201
|
+
|
|
1202
|
+
def transform_method_call(self, node: MethodCall) -> Iterator[Node]:
|
|
1203
|
+
yield node
|
|
1204
|
+
yield from self.transform(node.member)
|
|
1205
|
+
for arg in node.args:
|
|
1206
|
+
yield from self.transform(arg)
|
|
1207
|
+
|
|
1208
|
+
def transform_function_call(self, node: FunctionCall) -> Iterator[Node]:
|
|
1209
|
+
yield node
|
|
1210
|
+
for arg in node.args:
|
|
1211
|
+
yield from self.transform(arg)
|
|
1212
|
+
|
|
1213
|
+
def transform_constant(self, node: Constant) -> Iterator[Node]:
|
|
1214
|
+
yield node
|
|
1215
|
+
|
|
1216
|
+
def transform_is_none(self, node: IsNone) -> Iterator[Node]:
|
|
1217
|
+
yield node
|
|
1218
|
+
yield from self.transform(node.value)
|
|
1219
|
+
|
|
1220
|
+
def transform_is_not_none(self, node: IsNotNone) -> Iterator[Node]:
|
|
1221
|
+
yield node
|
|
1222
|
+
yield from self.transform(node.value)
|
|
1223
|
+
|
|
1224
|
+
def transform_name(self, node: Name) -> Iterator[Node]:
|
|
1225
|
+
yield node
|
|
1226
|
+
|
|
1227
|
+
def transform_not(self, node: Not) -> Iterator[Node]:
|
|
1228
|
+
yield node
|
|
1229
|
+
yield from self.transform(node.operand)
|
|
1230
|
+
|
|
1231
|
+
def transform_and(self, node: And) -> Iterator[Node]:
|
|
1232
|
+
yield node
|
|
1233
|
+
for value in node.values:
|
|
1234
|
+
yield from self.transform(value)
|
|
1235
|
+
|
|
1236
|
+
def transform_or(self, node: Or) -> Iterator[Node]:
|
|
1237
|
+
yield node
|
|
1238
|
+
for value in node.values:
|
|
1239
|
+
yield from self.transform(value)
|
|
1240
|
+
|
|
1241
|
+
def transform_add(self, node: Add) -> Iterator[Node]:
|
|
1242
|
+
yield node
|
|
1243
|
+
yield from self.transform(node.left)
|
|
1244
|
+
yield from self.transform(node.right)
|
|
1245
|
+
|
|
1246
|
+
def transform_sub(self, node: Sub) -> Iterator[Node]:
|
|
1247
|
+
yield node
|
|
1248
|
+
yield from self.transform(node.left)
|
|
1249
|
+
yield from self.transform(node.right)
|
|
1250
|
+
|
|
1251
|
+
def transform_formatted_value(self, node: FormattedValue) -> Iterator[Node]:
|
|
1252
|
+
yield node
|
|
1253
|
+
yield from self.transform(node.value)
|
|
1254
|
+
|
|
1255
|
+
def transform_joined_str(self, node: JoinedStr) -> Iterator[Node]:
|
|
1256
|
+
yield node
|
|
1257
|
+
|
|
1258
|
+
for value in node.values:
|
|
1259
|
+
if isinstance(value, str):
|
|
1260
|
+
pass
|
|
1261
|
+
elif isinstance(value, FormattedValue):
|
|
1262
|
+
yield from self.transform(value)
|
|
1263
|
+
else:
|
|
1264
|
+
assert_never(value)
|
|
1265
|
+
|
|
1266
|
+
def transform_for_each(self, node: ForEach) -> Iterator[Node]:
|
|
1267
|
+
yield node
|
|
1268
|
+
yield from self.transform(node.variable)
|
|
1269
|
+
yield from self.transform(node.iteration)
|
|
1270
|
+
|
|
1271
|
+
def transform_for_range(self, node: ForRange) -> Iterator[Node]:
|
|
1272
|
+
yield node
|
|
1273
|
+
yield from self.transform(node.variable)
|
|
1274
|
+
yield from self.transform(node.start)
|
|
1275
|
+
yield from self.transform(node.end)
|
|
1276
|
+
|
|
1277
|
+
def transform_any(self, node: Any) -> Iterator[Node]:
|
|
1278
|
+
yield node
|
|
1279
|
+
yield from self.transform(node.generator)
|
|
1280
|
+
yield from self.transform(node.condition)
|
|
1281
|
+
|
|
1282
|
+
def transform_all(self, node: All) -> Iterator[Node]:
|
|
1283
|
+
yield node
|
|
1284
|
+
yield from self.transform(node.generator)
|
|
1285
|
+
yield from self.transform(node.condition)
|
|
1286
|
+
|
|
1287
|
+
def transform_assignment(self, node: Assignment) -> Iterator[Node]:
|
|
1288
|
+
yield node
|
|
1289
|
+
yield from self.transform(node.target)
|
|
1290
|
+
yield from self.transform(node.value)
|
|
1291
|
+
|
|
1292
|
+
def transform_return(self, node: Return) -> Iterator[Node]:
|
|
1293
|
+
yield node
|
|
1294
|
+
if node.value is not None:
|
|
1295
|
+
yield from self.transform(node.value)
|
|
1296
|
+
|
|
1297
|
+
|
|
1298
|
+
_ITERATION_TRANSFORMER = _IterationTransformer()
|
|
1299
|
+
|
|
1300
|
+
|
|
1301
|
+
def over_nodes(node: Node) -> Iterator[Node]:
|
|
1302
|
+
"""Iterate recursively over the ``node``, including the ``node`` itself."""
|
|
1303
|
+
yield from _ITERATION_TRANSFORMER.transform(node)
|