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,1191 @@
|
|
|
1
|
+
"""Transpile Python to Go code."""
|
|
2
|
+
import abc
|
|
3
|
+
from typing import (
|
|
4
|
+
Tuple,
|
|
5
|
+
Optional,
|
|
6
|
+
List,
|
|
7
|
+
Mapping,
|
|
8
|
+
Union,
|
|
9
|
+
Set,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
from icontract import ensure
|
|
13
|
+
|
|
14
|
+
from aas_core_codegen import intermediate
|
|
15
|
+
from aas_core_codegen.common import (
|
|
16
|
+
Error,
|
|
17
|
+
Stripped,
|
|
18
|
+
assert_never,
|
|
19
|
+
Identifier,
|
|
20
|
+
indent_but_first_line,
|
|
21
|
+
)
|
|
22
|
+
from aas_core_codegen.golang import (
|
|
23
|
+
common as golang_common,
|
|
24
|
+
naming as golang_naming,
|
|
25
|
+
pointering as golang_pointering,
|
|
26
|
+
)
|
|
27
|
+
from aas_core_codegen.golang.common import (
|
|
28
|
+
INDENT as I,
|
|
29
|
+
INDENT2 as II,
|
|
30
|
+
INDENT3 as III,
|
|
31
|
+
)
|
|
32
|
+
from aas_core_codegen.intermediate import type_inference as intermediate_type_inference
|
|
33
|
+
from aas_core_codegen.parse import tree as parse_tree
|
|
34
|
+
|
|
35
|
+
# NOTE (mristin, 2023-06-01):
|
|
36
|
+
# We have to implement a very similar function for generating type annotations to
|
|
37
|
+
# aas_core_codegen.golang.common.generate_type since we can not simply pass
|
|
38
|
+
# intermediate_type_inference.TypeAnnotationUnion to
|
|
39
|
+
# aas_core_codegen.golang.common.generate_type.
|
|
40
|
+
|
|
41
|
+
PRIMITIVE_TYPE_MAP = {
|
|
42
|
+
intermediate_type_inference.PrimitiveType.BOOL: Stripped("bool"),
|
|
43
|
+
intermediate_type_inference.PrimitiveType.INT: Stripped("int64"),
|
|
44
|
+
intermediate_type_inference.PrimitiveType.FLOAT: Stripped("float64"),
|
|
45
|
+
intermediate_type_inference.PrimitiveType.STR: Stripped("string"),
|
|
46
|
+
intermediate_type_inference.PrimitiveType.BYTEARRAY: Stripped("[]byte"),
|
|
47
|
+
intermediate_type_inference.PrimitiveType.NONE: Stripped("struct{}"),
|
|
48
|
+
intermediate_type_inference.PrimitiveType.LENGTH: Stripped("int"),
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
|
|
53
|
+
def generate_type(
|
|
54
|
+
type_annotation: intermediate_type_inference.TypeAnnotationUnion,
|
|
55
|
+
types_package: Optional[Identifier] = None,
|
|
56
|
+
) -> Tuple[Optional[Stripped], Optional[str]]:
|
|
57
|
+
"""
|
|
58
|
+
Generate the Go type for the given type annotation.
|
|
59
|
+
|
|
60
|
+
If ``types_package`` is specified, it is prepended to all our types.
|
|
61
|
+
|
|
62
|
+
(mristin, 2023-06-01): We do not handle all the type annotations from
|
|
63
|
+
:py:mod:`aas_core_codegen.intermediate.type_inference` as that would be
|
|
64
|
+
YAGNI (*e.g.*, verification functions, built-in functions *etc.*).
|
|
65
|
+
If we do not know how to generate the type in Go, we return an error message.
|
|
66
|
+
"""
|
|
67
|
+
if isinstance(type_annotation, intermediate_type_inference.PrimitiveTypeAnnotation):
|
|
68
|
+
return PRIMITIVE_TYPE_MAP[type_annotation.a_type], None
|
|
69
|
+
|
|
70
|
+
elif isinstance(type_annotation, intermediate_type_inference.OurTypeAnnotation):
|
|
71
|
+
our_type = type_annotation.our_type
|
|
72
|
+
|
|
73
|
+
if isinstance(our_type, intermediate.Enumeration):
|
|
74
|
+
enum_name = golang_naming.enum_name(type_annotation.our_type.name)
|
|
75
|
+
if types_package is None:
|
|
76
|
+
return enum_name, None
|
|
77
|
+
|
|
78
|
+
return Stripped(f"{types_package}.{enum_name}"), None
|
|
79
|
+
|
|
80
|
+
elif isinstance(our_type, intermediate.ConstrainedPrimitive):
|
|
81
|
+
return golang_common.PRIMITIVE_TYPE_MAP[our_type.constrainee], None
|
|
82
|
+
|
|
83
|
+
elif isinstance(
|
|
84
|
+
our_type, (intermediate.AbstractClass, intermediate.ConcreteClass)
|
|
85
|
+
):
|
|
86
|
+
# NOTE (mristin, 2023-03-28):
|
|
87
|
+
# We always refer to interfaces even in cases of concrete classes without
|
|
88
|
+
# concrete descendants since we want to allow enhancing.
|
|
89
|
+
interface_name = golang_naming.interface_name(our_type.name)
|
|
90
|
+
|
|
91
|
+
if types_package is None:
|
|
92
|
+
return interface_name, None
|
|
93
|
+
|
|
94
|
+
return Stripped(f"{types_package}.{interface_name}"), None
|
|
95
|
+
|
|
96
|
+
elif isinstance(type_annotation, intermediate_type_inference.ListTypeAnnotation):
|
|
97
|
+
item_type, error_msg = generate_type(
|
|
98
|
+
type_annotation=type_annotation.items, types_package=types_package
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
if error_msg is not None:
|
|
102
|
+
return None, error_msg
|
|
103
|
+
|
|
104
|
+
assert item_type is not None
|
|
105
|
+
|
|
106
|
+
return Stripped(f"[]{item_type}"), None
|
|
107
|
+
|
|
108
|
+
elif isinstance(
|
|
109
|
+
type_annotation, intermediate_type_inference.OptionalTypeAnnotation
|
|
110
|
+
):
|
|
111
|
+
value_type, error_msg = generate_type(
|
|
112
|
+
type_annotation=type_annotation.value, types_package=types_package
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
if error_msg is not None:
|
|
116
|
+
return None, error_msg
|
|
117
|
+
|
|
118
|
+
assert value_type is not None
|
|
119
|
+
|
|
120
|
+
if golang_pointering.is_pointer_type(type_annotation):
|
|
121
|
+
return Stripped(f"*{value_type}"), None
|
|
122
|
+
|
|
123
|
+
return value_type, None
|
|
124
|
+
|
|
125
|
+
else:
|
|
126
|
+
return None, (
|
|
127
|
+
f"(mristin, 2023-06-01): We do not handle "
|
|
128
|
+
f"the type annotation {type_annotation} from "
|
|
129
|
+
"aas_core_codegen.intermediate.type_inference as that was, "
|
|
130
|
+
"at this time point, YAGNI (*e.g.*, verification functions, "
|
|
131
|
+
"built-in functions *etc.*). If you need this feature, please "
|
|
132
|
+
"contact the developers."
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
raise AssertionError("Should not have gotten here")
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class Transpiler(
|
|
139
|
+
parse_tree.RestrictedTransformer[Tuple[Optional[Stripped], Optional[Error]]]
|
|
140
|
+
):
|
|
141
|
+
"""Transpile a node of our AST to Go code, or return an error."""
|
|
142
|
+
|
|
143
|
+
_GOLANG_COMPARISON_MAP = {
|
|
144
|
+
parse_tree.Comparator.LT: "<",
|
|
145
|
+
parse_tree.Comparator.LE: "<=",
|
|
146
|
+
parse_tree.Comparator.GT: ">",
|
|
147
|
+
parse_tree.Comparator.GE: ">=",
|
|
148
|
+
parse_tree.Comparator.EQ: "==",
|
|
149
|
+
parse_tree.Comparator.NE: "!=",
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
def __init__(
|
|
153
|
+
self,
|
|
154
|
+
type_map: Mapping[
|
|
155
|
+
parse_tree.Node, intermediate_type_inference.TypeAnnotationUnion
|
|
156
|
+
],
|
|
157
|
+
is_pointer_map: Mapping[parse_tree.Node, bool],
|
|
158
|
+
environment: intermediate_type_inference.Environment,
|
|
159
|
+
types_package: Optional[Identifier] = None,
|
|
160
|
+
) -> None:
|
|
161
|
+
"""
|
|
162
|
+
Initialize with the given values.
|
|
163
|
+
|
|
164
|
+
If ``types_package`` is specified, it is prepended to all our types.
|
|
165
|
+
"""
|
|
166
|
+
self.type_map = type_map
|
|
167
|
+
self._is_pointer_map = is_pointer_map
|
|
168
|
+
self._environment = intermediate_type_inference.MutableEnvironment(
|
|
169
|
+
parent=environment
|
|
170
|
+
)
|
|
171
|
+
self._types_package = types_package
|
|
172
|
+
|
|
173
|
+
# Keep track whenever we define a variable name, so that we can know how to
|
|
174
|
+
# generate the reference in the Go code.
|
|
175
|
+
self._variable_name_set = set() # type: Set[Identifier]
|
|
176
|
+
|
|
177
|
+
@ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
|
|
178
|
+
def _transform_and_dereference_if_necessary(
|
|
179
|
+
self, node: parse_tree.Node
|
|
180
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
181
|
+
"""
|
|
182
|
+
Dereference the given node if it is annotated as an optional.
|
|
183
|
+
|
|
184
|
+
If the value denoted by ``node`` is not an optional, or does not need
|
|
185
|
+
dereferencing, it is returned transpiled as-is.
|
|
186
|
+
"""
|
|
187
|
+
if not isinstance(node, (parse_tree.Name, parse_tree.Member, parse_tree.Index)):
|
|
188
|
+
return self.transform(node)
|
|
189
|
+
|
|
190
|
+
code, error = self.transform(node)
|
|
191
|
+
if error is not None:
|
|
192
|
+
return None, error
|
|
193
|
+
|
|
194
|
+
needs_dereferencing = self._is_pointer_map.get(node, None)
|
|
195
|
+
if needs_dereferencing is None:
|
|
196
|
+
error = Error(
|
|
197
|
+
node.original_node,
|
|
198
|
+
f"A node in our AST has not been mapped for "
|
|
199
|
+
f"is-pointer: {parse_tree.dump(node)}; this is an assertion violation!",
|
|
200
|
+
)
|
|
201
|
+
return None, error
|
|
202
|
+
|
|
203
|
+
if not needs_dereferencing:
|
|
204
|
+
return code, None
|
|
205
|
+
|
|
206
|
+
return Stripped(f"*{code}"), None
|
|
207
|
+
|
|
208
|
+
@abc.abstractmethod
|
|
209
|
+
def _transform_enumeration_literal(
|
|
210
|
+
self, enumeration_name: Identifier, literal_name: Identifier
|
|
211
|
+
) -> Stripped:
|
|
212
|
+
"""
|
|
213
|
+
Generate the code to represent an enumeration literal.
|
|
214
|
+
|
|
215
|
+
In Go, enumeration literals are mere constants. Hence, we can not
|
|
216
|
+
"de-reference" the enumeration literals from an enumeration, but
|
|
217
|
+
generate the constant name here.
|
|
218
|
+
"""
|
|
219
|
+
raise NotImplementedError()
|
|
220
|
+
|
|
221
|
+
@ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
|
|
222
|
+
def transform_member(
|
|
223
|
+
self, node: parse_tree.Member
|
|
224
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
225
|
+
instance, error = self.transform(node.instance)
|
|
226
|
+
if error is not None:
|
|
227
|
+
return None, error
|
|
228
|
+
|
|
229
|
+
# NOTE (mristin, 2023-04-12):
|
|
230
|
+
# Ignore optional instance as they need to be checked before in the code
|
|
231
|
+
instance_type = intermediate_type_inference.beneath_optional(
|
|
232
|
+
self.type_map[node.instance]
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
# NOTE (mristin, 2023-05-16):
|
|
236
|
+
# We explicitly do *not* dereference member access. Make sure you use
|
|
237
|
+
# :py:meth:`_transform_and_dereference_if_necessary` where appropriate. Notably,
|
|
238
|
+
# the operators ``is None`` and ``is not None`` have to compare against
|
|
239
|
+
# references instead of values. That is why we can not simply de-reference
|
|
240
|
+
# all the member access.
|
|
241
|
+
|
|
242
|
+
member_type = self.type_map[node]
|
|
243
|
+
|
|
244
|
+
member_accessor: str
|
|
245
|
+
|
|
246
|
+
if isinstance(
|
|
247
|
+
instance_type, intermediate_type_inference.OurTypeAnnotation
|
|
248
|
+
) and isinstance(instance_type.our_type, intermediate.Enumeration):
|
|
249
|
+
# NOTE (mristin, 2023-01-13):
|
|
250
|
+
# This member denotes an enumeration literal of an enumeration.
|
|
251
|
+
# In Go, enumeration literals are mere constants. Hence, we can not
|
|
252
|
+
# "de-reference" the enumeration literals from an enumeration, but
|
|
253
|
+
# generate the constant name here.
|
|
254
|
+
return (
|
|
255
|
+
self._transform_enumeration_literal(
|
|
256
|
+
enumeration_name=instance_type.our_type.name, literal_name=node.name
|
|
257
|
+
),
|
|
258
|
+
None,
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
elif isinstance(member_type, intermediate_type_inference.MethodTypeAnnotation):
|
|
262
|
+
member_accessor = golang_naming.method_name(node.name)
|
|
263
|
+
|
|
264
|
+
elif isinstance(
|
|
265
|
+
instance_type, intermediate_type_inference.OurTypeAnnotation
|
|
266
|
+
) and isinstance(instance_type.our_type, intermediate.Class):
|
|
267
|
+
if node.name in instance_type.our_type.properties_by_name:
|
|
268
|
+
getter_name = golang_naming.getter_name(node.name)
|
|
269
|
+
member_accessor = f"{getter_name}()"
|
|
270
|
+
else:
|
|
271
|
+
return None, Error(
|
|
272
|
+
node.original_node,
|
|
273
|
+
f"The property {node.name!r} has not been defined "
|
|
274
|
+
f"in the class {instance_type.our_type.name!r}",
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
elif isinstance(
|
|
278
|
+
instance_type, intermediate_type_inference.EnumerationAsTypeTypeAnnotation
|
|
279
|
+
):
|
|
280
|
+
if node.name in instance_type.enumeration.literals_by_name:
|
|
281
|
+
# NOTE (mristin, 2023-01-13):
|
|
282
|
+
# The member denotes an enumeration literal of an enumeration.
|
|
283
|
+
# In Go, enumeration literals are mere constants. Hence, we can not
|
|
284
|
+
# "de-reference" the enumeration literals from an enumeration, but
|
|
285
|
+
# generate the constant name here.
|
|
286
|
+
return (
|
|
287
|
+
self._transform_enumeration_literal(
|
|
288
|
+
enumeration_name=instance_type.enumeration.name,
|
|
289
|
+
literal_name=node.name,
|
|
290
|
+
),
|
|
291
|
+
None,
|
|
292
|
+
)
|
|
293
|
+
else:
|
|
294
|
+
return None, Error(
|
|
295
|
+
node.original_node,
|
|
296
|
+
f"The literal {node.name!r} has not been defined "
|
|
297
|
+
f"in the enumeration {instance_type.enumeration.name!r}",
|
|
298
|
+
)
|
|
299
|
+
else:
|
|
300
|
+
return None, Error(
|
|
301
|
+
node.original_node,
|
|
302
|
+
f"We do not know how to generate the member access. The inferred type "
|
|
303
|
+
f"of the instance was {instance_type}, while the member type "
|
|
304
|
+
f"was {member_type}. However, we do not know how to resolve "
|
|
305
|
+
f"the member {node.name!r} in {instance_type}.",
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
return Stripped(f"{instance}.{member_accessor}"), None
|
|
309
|
+
|
|
310
|
+
@ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
|
|
311
|
+
def transform_index(
|
|
312
|
+
self, node: parse_tree.Index
|
|
313
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
314
|
+
collection, error = self.transform(node.collection)
|
|
315
|
+
if error is not None:
|
|
316
|
+
return None, error
|
|
317
|
+
assert collection is not None
|
|
318
|
+
|
|
319
|
+
index, error = self.transform(node.index)
|
|
320
|
+
if error is not None:
|
|
321
|
+
return None, error
|
|
322
|
+
assert index is not None
|
|
323
|
+
|
|
324
|
+
index_as_int = None # type: Optional[int]
|
|
325
|
+
try:
|
|
326
|
+
index_as_int = int(index)
|
|
327
|
+
except ValueError:
|
|
328
|
+
pass
|
|
329
|
+
|
|
330
|
+
if index_as_int is not None and index_as_int < 0:
|
|
331
|
+
if "\n" in collection:
|
|
332
|
+
# pylint: disable=invalid-unary-operand-type
|
|
333
|
+
index = Stripped(
|
|
334
|
+
f"""\
|
|
335
|
+
len(
|
|
336
|
+
{I}{indent_but_first_line(collection, I)}
|
|
337
|
+
) - {-index_as_int}"""
|
|
338
|
+
)
|
|
339
|
+
else:
|
|
340
|
+
index = Stripped(
|
|
341
|
+
f"len({collection}) - {-index_as_int}" # pylint: disable=invalid-unary-operand-type
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
no_parentheses_types = (
|
|
345
|
+
parse_tree.Member,
|
|
346
|
+
parse_tree.FunctionCall,
|
|
347
|
+
parse_tree.MethodCall,
|
|
348
|
+
parse_tree.Name,
|
|
349
|
+
parse_tree.Constant,
|
|
350
|
+
parse_tree.Index,
|
|
351
|
+
parse_tree.IsIn,
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
if not isinstance(node.collection, no_parentheses_types):
|
|
355
|
+
collection = Stripped(f"({collection})")
|
|
356
|
+
|
|
357
|
+
# NOTE (mristin, 2023-05-16):
|
|
358
|
+
# We explicitly do *not* dereference index access. Make sure you use
|
|
359
|
+
# :py:meth:`_transform_and_dereference_if_necessary` where appropriate. Notably,
|
|
360
|
+
# the operators ``is None`` and ``is not None`` have to compare against
|
|
361
|
+
# references instead of values. That is why we can not simply de-reference
|
|
362
|
+
# all the index access.
|
|
363
|
+
|
|
364
|
+
return Stripped(f"{collection}[{index}]"), None
|
|
365
|
+
|
|
366
|
+
@ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
|
|
367
|
+
def transform_comparison(
|
|
368
|
+
self, node: parse_tree.Comparison
|
|
369
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
370
|
+
comparator = Transpiler._GOLANG_COMPARISON_MAP[node.op]
|
|
371
|
+
|
|
372
|
+
errors = []
|
|
373
|
+
|
|
374
|
+
left, error = self._transform_and_dereference_if_necessary(node.left)
|
|
375
|
+
if error is not None:
|
|
376
|
+
errors.append(error)
|
|
377
|
+
|
|
378
|
+
right, error = self._transform_and_dereference_if_necessary(node.right)
|
|
379
|
+
if error is not None:
|
|
380
|
+
errors.append(error)
|
|
381
|
+
|
|
382
|
+
if len(errors) > 0:
|
|
383
|
+
return None, Error(
|
|
384
|
+
node.original_node, "Failed to transpile the comparison", errors
|
|
385
|
+
)
|
|
386
|
+
|
|
387
|
+
no_parentheses_types = (
|
|
388
|
+
parse_tree.Member,
|
|
389
|
+
parse_tree.FunctionCall,
|
|
390
|
+
parse_tree.MethodCall,
|
|
391
|
+
parse_tree.Name,
|
|
392
|
+
parse_tree.Constant,
|
|
393
|
+
parse_tree.IsIn,
|
|
394
|
+
parse_tree.Index,
|
|
395
|
+
parse_tree.All,
|
|
396
|
+
parse_tree.Any,
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
if not isinstance(node.left, no_parentheses_types):
|
|
400
|
+
left = Stripped(f"({left})")
|
|
401
|
+
|
|
402
|
+
if not isinstance(node.right, no_parentheses_types):
|
|
403
|
+
right = Stripped(f"({right})")
|
|
404
|
+
|
|
405
|
+
return Stripped(f"{left} {comparator} {right}"), None
|
|
406
|
+
|
|
407
|
+
@ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
|
|
408
|
+
def transform_is_in(
|
|
409
|
+
self, node: parse_tree.IsIn
|
|
410
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
411
|
+
errors = []
|
|
412
|
+
|
|
413
|
+
member, error = self._transform_and_dereference_if_necessary(node.member)
|
|
414
|
+
if error is not None:
|
|
415
|
+
errors.append(error)
|
|
416
|
+
|
|
417
|
+
container, error = self._transform_and_dereference_if_necessary(node.container)
|
|
418
|
+
if error is not None:
|
|
419
|
+
errors.append(error)
|
|
420
|
+
|
|
421
|
+
if len(errors) > 0:
|
|
422
|
+
return None, Error(
|
|
423
|
+
node.original_node,
|
|
424
|
+
"Failed to transpile the membership relation",
|
|
425
|
+
errors,
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
assert container is not None
|
|
429
|
+
assert member is not None
|
|
430
|
+
|
|
431
|
+
container_type = self.type_map[node.container]
|
|
432
|
+
|
|
433
|
+
if isinstance(container_type, intermediate_type_inference.SetTypeAnnotation):
|
|
434
|
+
return (
|
|
435
|
+
Stripped(
|
|
436
|
+
f"""\
|
|
437
|
+
aascommon.MapContains(
|
|
438
|
+
{I}{indent_but_first_line(container, I)},
|
|
439
|
+
{I}{indent_but_first_line(member, I)},
|
|
440
|
+
)"""
|
|
441
|
+
),
|
|
442
|
+
None,
|
|
443
|
+
)
|
|
444
|
+
|
|
445
|
+
else:
|
|
446
|
+
return None, Error(
|
|
447
|
+
node.original_node,
|
|
448
|
+
f"We do not know how to generate the is-in operation for "
|
|
449
|
+
f"the container {node.container}. The inferred type of "
|
|
450
|
+
f"the container was {container_type}. "
|
|
451
|
+
f"Please contact the developers if you need this feature.",
|
|
452
|
+
)
|
|
453
|
+
|
|
454
|
+
@ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
|
|
455
|
+
def transform_implication(
|
|
456
|
+
self, node: parse_tree.Implication
|
|
457
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
458
|
+
errors = []
|
|
459
|
+
|
|
460
|
+
antecedent, error = self._transform_and_dereference_if_necessary(
|
|
461
|
+
node.antecedent
|
|
462
|
+
)
|
|
463
|
+
if error is not None:
|
|
464
|
+
errors.append(error)
|
|
465
|
+
|
|
466
|
+
consequent, error = self._transform_and_dereference_if_necessary(
|
|
467
|
+
node.consequent
|
|
468
|
+
)
|
|
469
|
+
if error is not None:
|
|
470
|
+
errors.append(error)
|
|
471
|
+
|
|
472
|
+
if len(errors) > 0:
|
|
473
|
+
return None, Error(
|
|
474
|
+
node.original_node, "Failed to transpile the implication", errors
|
|
475
|
+
)
|
|
476
|
+
|
|
477
|
+
assert antecedent is not None
|
|
478
|
+
assert consequent is not None
|
|
479
|
+
|
|
480
|
+
no_parentheses_types_in_this_context = (
|
|
481
|
+
parse_tree.Member,
|
|
482
|
+
parse_tree.FunctionCall,
|
|
483
|
+
parse_tree.MethodCall,
|
|
484
|
+
parse_tree.Name,
|
|
485
|
+
parse_tree.IsIn,
|
|
486
|
+
parse_tree.Index,
|
|
487
|
+
parse_tree.All,
|
|
488
|
+
parse_tree.Any,
|
|
489
|
+
)
|
|
490
|
+
|
|
491
|
+
if isinstance(node.antecedent, no_parentheses_types_in_this_context):
|
|
492
|
+
not_antecedent = f"!{antecedent}"
|
|
493
|
+
else:
|
|
494
|
+
not_antecedent = f"!({antecedent})"
|
|
495
|
+
|
|
496
|
+
if not isinstance(node.consequent, no_parentheses_types_in_this_context):
|
|
497
|
+
consequent = Stripped(f"({consequent})")
|
|
498
|
+
|
|
499
|
+
return Stripped(f"{not_antecedent} ||\n{consequent}"), None
|
|
500
|
+
|
|
501
|
+
@ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
|
|
502
|
+
def transform_method_call(
|
|
503
|
+
self, node: parse_tree.MethodCall
|
|
504
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
505
|
+
errors = [] # type: List[Error]
|
|
506
|
+
|
|
507
|
+
instance, error = self._transform_and_dereference_if_necessary(
|
|
508
|
+
node.member.instance
|
|
509
|
+
)
|
|
510
|
+
if error is not None:
|
|
511
|
+
errors.append(error)
|
|
512
|
+
|
|
513
|
+
args = [] # type: List[Stripped]
|
|
514
|
+
for arg_node in node.args:
|
|
515
|
+
arg, error = self.transform(arg_node)
|
|
516
|
+
if error is not None:
|
|
517
|
+
errors.append(error)
|
|
518
|
+
continue
|
|
519
|
+
|
|
520
|
+
assert arg is not None
|
|
521
|
+
|
|
522
|
+
args.append(arg)
|
|
523
|
+
|
|
524
|
+
if len(errors) > 0:
|
|
525
|
+
return None, Error(
|
|
526
|
+
node.original_node, "Failed to transpile the method call", errors
|
|
527
|
+
)
|
|
528
|
+
|
|
529
|
+
assert instance is not None
|
|
530
|
+
|
|
531
|
+
if not isinstance(node.member.instance, (parse_tree.Name, parse_tree.Member)):
|
|
532
|
+
instance = Stripped(f"({instance})")
|
|
533
|
+
|
|
534
|
+
method_name = golang_naming.method_name(node.member.name)
|
|
535
|
+
|
|
536
|
+
args_joined = ", ".join(args)
|
|
537
|
+
|
|
538
|
+
# Apply heuristic for breaking the lines
|
|
539
|
+
if len(args_joined) > 50:
|
|
540
|
+
args_joined = "\n".join(f"{arg}," for arg in args)
|
|
541
|
+
|
|
542
|
+
return (
|
|
543
|
+
Stripped(
|
|
544
|
+
f"""\
|
|
545
|
+
{instance}.{method_name}(
|
|
546
|
+
{I}{indent_but_first_line(args_joined, I)}
|
|
547
|
+
)"""
|
|
548
|
+
),
|
|
549
|
+
None,
|
|
550
|
+
)
|
|
551
|
+
else:
|
|
552
|
+
return Stripped(f"{instance}.{method_name}({args_joined})"), None
|
|
553
|
+
|
|
554
|
+
@ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
|
|
555
|
+
def transform_function_call(
|
|
556
|
+
self, node: parse_tree.FunctionCall
|
|
557
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
558
|
+
errors = [] # type: List[Error]
|
|
559
|
+
|
|
560
|
+
args = [] # type: List[Stripped]
|
|
561
|
+
for arg_node in node.args:
|
|
562
|
+
arg, error = self._transform_and_dereference_if_necessary(arg_node)
|
|
563
|
+
if error is not None:
|
|
564
|
+
errors.append(error)
|
|
565
|
+
continue
|
|
566
|
+
|
|
567
|
+
assert arg is not None
|
|
568
|
+
|
|
569
|
+
args.append(arg)
|
|
570
|
+
|
|
571
|
+
if len(errors) > 0:
|
|
572
|
+
return None, Error(
|
|
573
|
+
node.original_node, "Failed to transpile the function call", errors
|
|
574
|
+
)
|
|
575
|
+
|
|
576
|
+
# NOTE (mristin, 2023-03-28):
|
|
577
|
+
# The validity of the arguments is checked in
|
|
578
|
+
# :py:func:`aas_core_codegen.intermediate._translate.translate`, so we do not
|
|
579
|
+
# have to test for argument arity here.
|
|
580
|
+
|
|
581
|
+
func_type = self.type_map[node.name]
|
|
582
|
+
|
|
583
|
+
if not isinstance(
|
|
584
|
+
func_type, intermediate_type_inference.FunctionTypeAnnotationUnionAsTuple
|
|
585
|
+
):
|
|
586
|
+
return None, Error(
|
|
587
|
+
node.name.original_node,
|
|
588
|
+
f"Expected the name to refer to a function, "
|
|
589
|
+
f"but its inferred type was {func_type}",
|
|
590
|
+
)
|
|
591
|
+
|
|
592
|
+
if isinstance(
|
|
593
|
+
func_type, intermediate_type_inference.VerificationTypeAnnotation
|
|
594
|
+
):
|
|
595
|
+
function_name, error = self.transform_name(node.name)
|
|
596
|
+
if error is not None:
|
|
597
|
+
return None, error
|
|
598
|
+
|
|
599
|
+
assert function_name is not None
|
|
600
|
+
|
|
601
|
+
args_joined = ", ".join(args)
|
|
602
|
+
|
|
603
|
+
# Apply heuristic for breaking the lines
|
|
604
|
+
if len(function_name) + len(args_joined) > 50:
|
|
605
|
+
args_joined = "\n".join(f"{arg}," for arg in args)
|
|
606
|
+
return (
|
|
607
|
+
Stripped(
|
|
608
|
+
f"""\
|
|
609
|
+
{function_name}(
|
|
610
|
+
{I}{indent_but_first_line(args_joined, I)}
|
|
611
|
+
)"""
|
|
612
|
+
),
|
|
613
|
+
None,
|
|
614
|
+
)
|
|
615
|
+
else:
|
|
616
|
+
return Stripped(f"{function_name}({args_joined})"), None
|
|
617
|
+
|
|
618
|
+
elif isinstance(
|
|
619
|
+
func_type, intermediate_type_inference.BuiltinFunctionTypeAnnotation
|
|
620
|
+
):
|
|
621
|
+
if func_type.func.name == "len":
|
|
622
|
+
assert len(args) == 1, (
|
|
623
|
+
f"Expected exactly one argument, but got: {args}; "
|
|
624
|
+
f"this should have been caught before."
|
|
625
|
+
)
|
|
626
|
+
|
|
627
|
+
if "\n" in args[0]:
|
|
628
|
+
return (
|
|
629
|
+
Stripped(
|
|
630
|
+
f"""\
|
|
631
|
+
len(
|
|
632
|
+
{I}{indent_but_first_line(args[0], I)},
|
|
633
|
+
)"""
|
|
634
|
+
),
|
|
635
|
+
None,
|
|
636
|
+
)
|
|
637
|
+
|
|
638
|
+
return Stripped(f"len({args[0]})"), None
|
|
639
|
+
|
|
640
|
+
else:
|
|
641
|
+
return None, Error(
|
|
642
|
+
node.original_node,
|
|
643
|
+
f"The handling of the built-in function {node.name!r} has not "
|
|
644
|
+
f"been implemented",
|
|
645
|
+
)
|
|
646
|
+
else:
|
|
647
|
+
assert_never(func_type)
|
|
648
|
+
|
|
649
|
+
raise AssertionError("Should not have gotten here")
|
|
650
|
+
|
|
651
|
+
def transform_constant(
|
|
652
|
+
self, node: parse_tree.Constant
|
|
653
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
654
|
+
if isinstance(node.value, bool):
|
|
655
|
+
return Stripped("true" if node.value else "false"), None
|
|
656
|
+
elif isinstance(node.value, (int, float)):
|
|
657
|
+
return Stripped(str(node.value)), None
|
|
658
|
+
elif isinstance(node.value, str):
|
|
659
|
+
return Stripped(golang_common.string_literal(node.value)), None
|
|
660
|
+
else:
|
|
661
|
+
assert_never(node.value)
|
|
662
|
+
|
|
663
|
+
raise AssertionError("Should not have gotten here")
|
|
664
|
+
|
|
665
|
+
def transform_is_none(
|
|
666
|
+
self, node: parse_tree.IsNone
|
|
667
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
668
|
+
# NOTE (mristin, 2023-05-16):
|
|
669
|
+
# We explicitly do not call :py:meth:`_transform_and_dereference_if_necessary`
|
|
670
|
+
# here as we have to work on the pointer, not the value.
|
|
671
|
+
|
|
672
|
+
value, error = self.transform(node.value)
|
|
673
|
+
if error is not None:
|
|
674
|
+
return None, error
|
|
675
|
+
|
|
676
|
+
no_parentheses_types = (
|
|
677
|
+
parse_tree.Name,
|
|
678
|
+
parse_tree.Member,
|
|
679
|
+
parse_tree.MethodCall,
|
|
680
|
+
parse_tree.FunctionCall,
|
|
681
|
+
parse_tree.IsIn,
|
|
682
|
+
parse_tree.Index,
|
|
683
|
+
parse_tree.All,
|
|
684
|
+
parse_tree.Any,
|
|
685
|
+
)
|
|
686
|
+
if isinstance(node.value, no_parentheses_types):
|
|
687
|
+
return Stripped(f"{value} == nil"), None
|
|
688
|
+
else:
|
|
689
|
+
return Stripped(f"({value}) == nil"), None
|
|
690
|
+
|
|
691
|
+
def transform_is_not_none(
|
|
692
|
+
self, node: parse_tree.IsNotNone
|
|
693
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
694
|
+
value, error = self.transform(node.value)
|
|
695
|
+
if error is not None:
|
|
696
|
+
return None, error
|
|
697
|
+
|
|
698
|
+
no_parentheses_types_in_this_context = (
|
|
699
|
+
parse_tree.Name,
|
|
700
|
+
parse_tree.Member,
|
|
701
|
+
parse_tree.MethodCall,
|
|
702
|
+
parse_tree.FunctionCall,
|
|
703
|
+
parse_tree.IsIn,
|
|
704
|
+
parse_tree.Index,
|
|
705
|
+
parse_tree.All,
|
|
706
|
+
parse_tree.Any,
|
|
707
|
+
)
|
|
708
|
+
if isinstance(node.value, no_parentheses_types_in_this_context):
|
|
709
|
+
return Stripped(f"{value} != nil"), None
|
|
710
|
+
else:
|
|
711
|
+
return Stripped(f"({value}) != nil"), None
|
|
712
|
+
|
|
713
|
+
@abc.abstractmethod
|
|
714
|
+
def transform_name(
|
|
715
|
+
self, node: parse_tree.Name
|
|
716
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
717
|
+
raise NotImplementedError()
|
|
718
|
+
|
|
719
|
+
def transform_not(
|
|
720
|
+
self, node: parse_tree.Not
|
|
721
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
722
|
+
operand, error = self._transform_and_dereference_if_necessary(node.operand)
|
|
723
|
+
if error is not None:
|
|
724
|
+
return None, error
|
|
725
|
+
|
|
726
|
+
no_parentheses_types_in_this_context = (
|
|
727
|
+
parse_tree.Name,
|
|
728
|
+
parse_tree.Member,
|
|
729
|
+
parse_tree.MethodCall,
|
|
730
|
+
parse_tree.FunctionCall,
|
|
731
|
+
parse_tree.IsIn,
|
|
732
|
+
parse_tree.Index,
|
|
733
|
+
parse_tree.All,
|
|
734
|
+
parse_tree.Any,
|
|
735
|
+
)
|
|
736
|
+
if not isinstance(node.operand, no_parentheses_types_in_this_context):
|
|
737
|
+
return Stripped(f"!({operand})"), None
|
|
738
|
+
else:
|
|
739
|
+
return Stripped(f"!{operand}"), None
|
|
740
|
+
|
|
741
|
+
def transform_and(
|
|
742
|
+
self, node: parse_tree.And
|
|
743
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
744
|
+
errors = [] # type: List[Error]
|
|
745
|
+
values = [] # type: List[Stripped]
|
|
746
|
+
|
|
747
|
+
for value_node in node.values:
|
|
748
|
+
value, error = self._transform_and_dereference_if_necessary(value_node)
|
|
749
|
+
if error is not None:
|
|
750
|
+
errors.append(error)
|
|
751
|
+
continue
|
|
752
|
+
|
|
753
|
+
assert value is not None
|
|
754
|
+
|
|
755
|
+
no_parentheses_types_in_this_context = (
|
|
756
|
+
parse_tree.Member,
|
|
757
|
+
parse_tree.MethodCall,
|
|
758
|
+
parse_tree.FunctionCall,
|
|
759
|
+
parse_tree.Comparison,
|
|
760
|
+
parse_tree.Name,
|
|
761
|
+
parse_tree.IsIn,
|
|
762
|
+
parse_tree.Index,
|
|
763
|
+
parse_tree.All,
|
|
764
|
+
parse_tree.Any,
|
|
765
|
+
)
|
|
766
|
+
|
|
767
|
+
if not isinstance(value_node, no_parentheses_types_in_this_context):
|
|
768
|
+
value = Stripped(f"({value})")
|
|
769
|
+
|
|
770
|
+
values.append(value)
|
|
771
|
+
|
|
772
|
+
if len(errors) > 0:
|
|
773
|
+
return None, Error(
|
|
774
|
+
node.original_node, "Failed to transpile the conjunction", errors
|
|
775
|
+
)
|
|
776
|
+
|
|
777
|
+
values_joined = " &&\n".join(values)
|
|
778
|
+
return Stripped(values_joined), None
|
|
779
|
+
|
|
780
|
+
def transform_or(
|
|
781
|
+
self, node: parse_tree.Or
|
|
782
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
783
|
+
errors = [] # type: List[Error]
|
|
784
|
+
values = [] # type: List[Stripped]
|
|
785
|
+
|
|
786
|
+
for value_node in node.values:
|
|
787
|
+
value, error = self._transform_and_dereference_if_necessary(value_node)
|
|
788
|
+
if error is not None:
|
|
789
|
+
errors.append(error)
|
|
790
|
+
continue
|
|
791
|
+
|
|
792
|
+
assert value is not None
|
|
793
|
+
|
|
794
|
+
no_parentheses_types_in_this_context = (
|
|
795
|
+
parse_tree.Member,
|
|
796
|
+
parse_tree.MethodCall,
|
|
797
|
+
parse_tree.FunctionCall,
|
|
798
|
+
parse_tree.Comparison,
|
|
799
|
+
parse_tree.Name,
|
|
800
|
+
parse_tree.IsIn,
|
|
801
|
+
parse_tree.Index,
|
|
802
|
+
parse_tree.All,
|
|
803
|
+
parse_tree.Any,
|
|
804
|
+
)
|
|
805
|
+
|
|
806
|
+
if not isinstance(value_node, no_parentheses_types_in_this_context):
|
|
807
|
+
value = Stripped(f"({value})")
|
|
808
|
+
|
|
809
|
+
values.append(value)
|
|
810
|
+
|
|
811
|
+
if len(errors) > 0:
|
|
812
|
+
return None, Error(
|
|
813
|
+
node.original_node, "Failed to transpile the conjunction", errors
|
|
814
|
+
)
|
|
815
|
+
|
|
816
|
+
values_joined = " ||\n".join(values)
|
|
817
|
+
return Stripped(values_joined), None
|
|
818
|
+
|
|
819
|
+
def _transform_add_or_sub(
|
|
820
|
+
self, node: Union[parse_tree.Add, parse_tree.Sub]
|
|
821
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
822
|
+
errors = [] # type: List[Error]
|
|
823
|
+
|
|
824
|
+
left, error = self._transform_and_dereference_if_necessary(node.left)
|
|
825
|
+
if error is not None:
|
|
826
|
+
errors.append(error)
|
|
827
|
+
|
|
828
|
+
right, error = self._transform_and_dereference_if_necessary(node.right)
|
|
829
|
+
if error is not None:
|
|
830
|
+
errors.append(error)
|
|
831
|
+
|
|
832
|
+
if len(errors) > 0:
|
|
833
|
+
operation_name: str
|
|
834
|
+
if isinstance(node, parse_tree.Add):
|
|
835
|
+
operation_name = "the addition"
|
|
836
|
+
elif isinstance(node, parse_tree.Sub):
|
|
837
|
+
operation_name = "the subtraction"
|
|
838
|
+
else:
|
|
839
|
+
assert_never(node)
|
|
840
|
+
|
|
841
|
+
return None, Error(
|
|
842
|
+
node.original_node, f"Failed to transpile {operation_name}", errors
|
|
843
|
+
)
|
|
844
|
+
|
|
845
|
+
no_parentheses_types_in_this_context = (
|
|
846
|
+
parse_tree.Member,
|
|
847
|
+
parse_tree.MethodCall,
|
|
848
|
+
parse_tree.FunctionCall,
|
|
849
|
+
parse_tree.Constant,
|
|
850
|
+
parse_tree.Name,
|
|
851
|
+
parse_tree.IsIn,
|
|
852
|
+
parse_tree.Index,
|
|
853
|
+
parse_tree.All,
|
|
854
|
+
parse_tree.Any,
|
|
855
|
+
)
|
|
856
|
+
|
|
857
|
+
if not isinstance(node.left, no_parentheses_types_in_this_context):
|
|
858
|
+
left = Stripped(f"({left})")
|
|
859
|
+
|
|
860
|
+
if not isinstance(node.right, no_parentheses_types_in_this_context):
|
|
861
|
+
right = Stripped(f"({right})")
|
|
862
|
+
|
|
863
|
+
if isinstance(node, parse_tree.Add):
|
|
864
|
+
return Stripped(f"{left} + {right}"), None
|
|
865
|
+
elif isinstance(node, parse_tree.Sub):
|
|
866
|
+
return Stripped(f"{left} - {right}"), None
|
|
867
|
+
else:
|
|
868
|
+
assert_never(node)
|
|
869
|
+
|
|
870
|
+
def transform_add(
|
|
871
|
+
self, node: parse_tree.Add
|
|
872
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
873
|
+
return self._transform_add_or_sub(node)
|
|
874
|
+
|
|
875
|
+
def transform_sub(
|
|
876
|
+
self, node: parse_tree.Sub
|
|
877
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
878
|
+
return self._transform_add_or_sub(node)
|
|
879
|
+
|
|
880
|
+
def transform_joined_str(
|
|
881
|
+
self, node: parse_tree.JoinedStr
|
|
882
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
883
|
+
if all(isinstance(value, str) for value in node.values):
|
|
884
|
+
text = "".join(node.values) # type: ignore
|
|
885
|
+
return golang_common.string_literal(text), None
|
|
886
|
+
|
|
887
|
+
# NOTE (mristin, 2023-03-28):
|
|
888
|
+
# We need the interpolation if we got so far.
|
|
889
|
+
|
|
890
|
+
text_parts = [] # type: List[str]
|
|
891
|
+
args = [] # type: List[str]
|
|
892
|
+
|
|
893
|
+
for value in node.values:
|
|
894
|
+
if isinstance(value, str):
|
|
895
|
+
string_literal = golang_common.string_literal(value.replace("%", "%%"))
|
|
896
|
+
|
|
897
|
+
# We need to remove double-quotes since we are joining everything
|
|
898
|
+
# ourselves later.
|
|
899
|
+
|
|
900
|
+
assert string_literal.startswith('"') and string_literal.endswith('"')
|
|
901
|
+
|
|
902
|
+
string_literal_wo_quotes = string_literal[1:-1]
|
|
903
|
+
text_parts.append(string_literal_wo_quotes)
|
|
904
|
+
|
|
905
|
+
elif isinstance(value, parse_tree.FormattedValue):
|
|
906
|
+
code, error = self._transform_and_dereference_if_necessary(value.value)
|
|
907
|
+
if error is not None:
|
|
908
|
+
return None, error
|
|
909
|
+
|
|
910
|
+
assert code is not None
|
|
911
|
+
|
|
912
|
+
text_parts.append("%v")
|
|
913
|
+
args.append(code)
|
|
914
|
+
else:
|
|
915
|
+
assert_never(value)
|
|
916
|
+
|
|
917
|
+
string_literal = golang_common.string_literal("".join(text_parts))
|
|
918
|
+
|
|
919
|
+
args_joined = "\n".join(f"{arg}," for arg in args)
|
|
920
|
+
|
|
921
|
+
return (
|
|
922
|
+
Stripped(
|
|
923
|
+
f"""\
|
|
924
|
+
fmt.Sprintf(
|
|
925
|
+
{I}{indent_but_first_line(string_literal, I)},
|
|
926
|
+
{I}{indent_but_first_line(args_joined, I)},
|
|
927
|
+
)"""
|
|
928
|
+
),
|
|
929
|
+
None,
|
|
930
|
+
)
|
|
931
|
+
|
|
932
|
+
def _transform_any_or_all(
|
|
933
|
+
self, node: Union[parse_tree.Any, parse_tree.All]
|
|
934
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
935
|
+
errors = [] # type: List[Error]
|
|
936
|
+
|
|
937
|
+
iteration = None # type: Optional[Stripped]
|
|
938
|
+
start = None # type: Optional[Stripped]
|
|
939
|
+
end = None # type: Optional[Stripped]
|
|
940
|
+
|
|
941
|
+
if isinstance(node.generator, parse_tree.ForEach):
|
|
942
|
+
iteration, error = self.transform(node.generator.iteration)
|
|
943
|
+
if error is not None:
|
|
944
|
+
errors.append(error)
|
|
945
|
+
|
|
946
|
+
elif isinstance(node.generator, parse_tree.ForRange):
|
|
947
|
+
start, error = self._transform_and_dereference_if_necessary(
|
|
948
|
+
node.generator.start
|
|
949
|
+
)
|
|
950
|
+
if error is not None:
|
|
951
|
+
errors.append(error)
|
|
952
|
+
|
|
953
|
+
end, error = self._transform_and_dereference_if_necessary(
|
|
954
|
+
node.generator.end
|
|
955
|
+
)
|
|
956
|
+
if error is not None:
|
|
957
|
+
errors.append(error)
|
|
958
|
+
|
|
959
|
+
else:
|
|
960
|
+
assert_never(node.generator)
|
|
961
|
+
|
|
962
|
+
variable_name = node.generator.variable.identifier
|
|
963
|
+
variable_type_annotation = self.type_map[node.generator.variable]
|
|
964
|
+
|
|
965
|
+
variable_name_go = golang_naming.variable_name(variable_name)
|
|
966
|
+
variable_type_go, error_msg = generate_type(
|
|
967
|
+
type_annotation=variable_type_annotation, types_package=self._types_package
|
|
968
|
+
)
|
|
969
|
+
if error_msg is not None:
|
|
970
|
+
errors.append(Error(node.generator.variable.original_node, error_msg))
|
|
971
|
+
|
|
972
|
+
try:
|
|
973
|
+
self._environment.set(
|
|
974
|
+
identifier=variable_name, type_annotation=variable_type_annotation
|
|
975
|
+
)
|
|
976
|
+
self._variable_name_set.add(variable_name)
|
|
977
|
+
|
|
978
|
+
condition, error = self._transform_and_dereference_if_necessary(
|
|
979
|
+
node.condition
|
|
980
|
+
)
|
|
981
|
+
if error is not None:
|
|
982
|
+
errors.append(error)
|
|
983
|
+
|
|
984
|
+
variable, error = self._transform_and_dereference_if_necessary(
|
|
985
|
+
node.generator.variable
|
|
986
|
+
)
|
|
987
|
+
if error is not None:
|
|
988
|
+
errors.append(error)
|
|
989
|
+
|
|
990
|
+
finally:
|
|
991
|
+
self._variable_name_set.remove(variable_name)
|
|
992
|
+
self._environment.remove(variable_name)
|
|
993
|
+
|
|
994
|
+
if len(errors) > 0:
|
|
995
|
+
return None, Error(
|
|
996
|
+
node.original_node,
|
|
997
|
+
"Failed to transpile the generator expression",
|
|
998
|
+
errors,
|
|
999
|
+
)
|
|
1000
|
+
|
|
1001
|
+
assert (iteration is not None) ^ (start is not None and end is not None)
|
|
1002
|
+
|
|
1003
|
+
assert variable is not None
|
|
1004
|
+
assert condition is not None
|
|
1005
|
+
|
|
1006
|
+
if isinstance(node.generator, parse_tree.ForEach):
|
|
1007
|
+
assert iteration is not None
|
|
1008
|
+
|
|
1009
|
+
qualifier_function: str
|
|
1010
|
+
if isinstance(node, parse_tree.Any):
|
|
1011
|
+
qualifier_function = "Some"
|
|
1012
|
+
elif isinstance(node, parse_tree.All):
|
|
1013
|
+
qualifier_function = "All"
|
|
1014
|
+
else:
|
|
1015
|
+
assert_never(node)
|
|
1016
|
+
|
|
1017
|
+
assert qualifier_function is not None
|
|
1018
|
+
|
|
1019
|
+
no_parentheses_types_in_this_context = (
|
|
1020
|
+
parse_tree.Member,
|
|
1021
|
+
parse_tree.MethodCall,
|
|
1022
|
+
parse_tree.FunctionCall,
|
|
1023
|
+
parse_tree.Name,
|
|
1024
|
+
parse_tree.IsIn,
|
|
1025
|
+
parse_tree.Index,
|
|
1026
|
+
parse_tree.All,
|
|
1027
|
+
parse_tree.Any,
|
|
1028
|
+
)
|
|
1029
|
+
|
|
1030
|
+
if not isinstance(
|
|
1031
|
+
node.generator.iteration, no_parentheses_types_in_this_context
|
|
1032
|
+
):
|
|
1033
|
+
source = Stripped(f"({iteration})")
|
|
1034
|
+
else:
|
|
1035
|
+
source = iteration
|
|
1036
|
+
|
|
1037
|
+
return (
|
|
1038
|
+
Stripped(
|
|
1039
|
+
f"""\
|
|
1040
|
+
aascommon.{qualifier_function}(
|
|
1041
|
+
{I}func({variable_name_go} {variable_type_go}) bool {{
|
|
1042
|
+
{II}return {indent_but_first_line(condition, III)}
|
|
1043
|
+
{I}}},
|
|
1044
|
+
{I}{indent_but_first_line(source, I)},
|
|
1045
|
+
)"""
|
|
1046
|
+
),
|
|
1047
|
+
None,
|
|
1048
|
+
)
|
|
1049
|
+
|
|
1050
|
+
elif isinstance(node.generator, parse_tree.ForRange):
|
|
1051
|
+
if isinstance(node, parse_tree.Any):
|
|
1052
|
+
qualifier_function = "SomeRange"
|
|
1053
|
+
elif isinstance(node, parse_tree.All):
|
|
1054
|
+
qualifier_function = "AllRange"
|
|
1055
|
+
else:
|
|
1056
|
+
assert_never(node)
|
|
1057
|
+
|
|
1058
|
+
assert start is not None
|
|
1059
|
+
assert end is not None
|
|
1060
|
+
|
|
1061
|
+
return (
|
|
1062
|
+
Stripped(
|
|
1063
|
+
f"""\
|
|
1064
|
+
aascommon.{qualifier_function}(
|
|
1065
|
+
{I}func({variable_name_go} {variable_type_go}) bool {{
|
|
1066
|
+
{II}return {indent_but_first_line(condition, III)}
|
|
1067
|
+
{I}}},
|
|
1068
|
+
{I}{indent_but_first_line(start, I)},
|
|
1069
|
+
{I}{indent_but_first_line(end, I)},
|
|
1070
|
+
)"""
|
|
1071
|
+
),
|
|
1072
|
+
None,
|
|
1073
|
+
)
|
|
1074
|
+
|
|
1075
|
+
else:
|
|
1076
|
+
assert_never(node.generator)
|
|
1077
|
+
|
|
1078
|
+
def transform_any(
|
|
1079
|
+
self, node: parse_tree.Any
|
|
1080
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
1081
|
+
return self._transform_any_or_all(node)
|
|
1082
|
+
|
|
1083
|
+
def transform_all(
|
|
1084
|
+
self, node: parse_tree.All
|
|
1085
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
1086
|
+
return self._transform_any_or_all(node)
|
|
1087
|
+
|
|
1088
|
+
def transform_assignment(
|
|
1089
|
+
self, node: parse_tree.Assignment
|
|
1090
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
1091
|
+
errors = [] # type: List[Error]
|
|
1092
|
+
|
|
1093
|
+
value, error = self._transform_and_dereference_if_necessary(node.value)
|
|
1094
|
+
if error is not None:
|
|
1095
|
+
errors.append(error)
|
|
1096
|
+
|
|
1097
|
+
is_definition = False
|
|
1098
|
+
|
|
1099
|
+
target = None # type: Optional[Stripped]
|
|
1100
|
+
if isinstance(node.target, parse_tree.Name):
|
|
1101
|
+
type_anno = self._environment.find(identifier=node.target.identifier)
|
|
1102
|
+
if type_anno is None:
|
|
1103
|
+
# NOTE (mristin, 2023-06-23):
|
|
1104
|
+
# This is a variable definition as we did not specify the identifier
|
|
1105
|
+
# in the environment.
|
|
1106
|
+
|
|
1107
|
+
is_definition = True
|
|
1108
|
+
|
|
1109
|
+
type_anno = self.type_map[node.value]
|
|
1110
|
+
self._variable_name_set.add(node.target.identifier)
|
|
1111
|
+
self._environment.set(
|
|
1112
|
+
identifier=node.target.identifier, type_annotation=type_anno
|
|
1113
|
+
)
|
|
1114
|
+
|
|
1115
|
+
target, error = self.transform_name(node=node.target)
|
|
1116
|
+
if error is not None:
|
|
1117
|
+
errors.append(error)
|
|
1118
|
+
else:
|
|
1119
|
+
target, error = self.transform(node=node.target)
|
|
1120
|
+
if error is not None:
|
|
1121
|
+
errors.append(error)
|
|
1122
|
+
|
|
1123
|
+
if len(errors) > 0:
|
|
1124
|
+
return None, Error(
|
|
1125
|
+
node.original_node, "Failed to transpile the assignment", errors
|
|
1126
|
+
)
|
|
1127
|
+
|
|
1128
|
+
assert target is not None
|
|
1129
|
+
assert value is not None
|
|
1130
|
+
|
|
1131
|
+
target_is_pointer = self._is_pointer_map[node.target]
|
|
1132
|
+
if target_is_pointer:
|
|
1133
|
+
target = Stripped(f"*{target}")
|
|
1134
|
+
|
|
1135
|
+
assignment = "=" if not is_definition else ":="
|
|
1136
|
+
|
|
1137
|
+
# NOTE (mristin, 2022-07-12):
|
|
1138
|
+
# This is a rudimentary heuristic for basic line breaks, but works well in
|
|
1139
|
+
# practice.
|
|
1140
|
+
if "\n" in value or len(value) > 50:
|
|
1141
|
+
return (
|
|
1142
|
+
Stripped(
|
|
1143
|
+
f"""\
|
|
1144
|
+
{target} {assignment}
|
|
1145
|
+
{I}{indent_but_first_line(value, I)})"""
|
|
1146
|
+
),
|
|
1147
|
+
None,
|
|
1148
|
+
)
|
|
1149
|
+
|
|
1150
|
+
return Stripped(f"{target} {assignment} {value}"), None
|
|
1151
|
+
|
|
1152
|
+
def transform_return(
|
|
1153
|
+
self, node: parse_tree.Return
|
|
1154
|
+
) -> Tuple[Optional[Stripped], Optional[Error]]:
|
|
1155
|
+
if node.value is None:
|
|
1156
|
+
return Stripped("return"), None
|
|
1157
|
+
|
|
1158
|
+
# NOTE (mristin, 2023-05-24):
|
|
1159
|
+
# This is a potential source of error. We infer the types based on nullability
|
|
1160
|
+
# checks, so the inferred type might be a non-nullable, but Golang pointers
|
|
1161
|
+
# remain pointers even after we check for them.
|
|
1162
|
+
#
|
|
1163
|
+
# The following transformation can not be resolved unless we know the explicit
|
|
1164
|
+
# return type that we are expected — if it is an optional, we should return
|
|
1165
|
+
# the value as-is, and if it is a non-optional we have to de-reference it.
|
|
1166
|
+
# For now, we leave it as-is, and will revisit this part of the code once
|
|
1167
|
+
# the meta-model requires it.
|
|
1168
|
+
|
|
1169
|
+
value, error = self.transform(node.value)
|
|
1170
|
+
if error is not None:
|
|
1171
|
+
return None, error
|
|
1172
|
+
|
|
1173
|
+
assert value is not None
|
|
1174
|
+
|
|
1175
|
+
# NOTE (mristin, 2023-03-28):
|
|
1176
|
+
# This is a rudimentary heuristic for basic line breaks, but works well in
|
|
1177
|
+
# practice.
|
|
1178
|
+
if "\n" in value or len(value) > 50:
|
|
1179
|
+
return (
|
|
1180
|
+
Stripped(
|
|
1181
|
+
f"""\
|
|
1182
|
+
return {indent_but_first_line(value, I)}"""
|
|
1183
|
+
),
|
|
1184
|
+
None,
|
|
1185
|
+
)
|
|
1186
|
+
|
|
1187
|
+
return Stripped(f"return {value}"), None
|
|
1188
|
+
|
|
1189
|
+
|
|
1190
|
+
# noinspection PyProtectedMember,PyProtectedMember
|
|
1191
|
+
assert all(op in Transpiler._GOLANG_COMPARISON_MAP for op in parse_tree.Comparator)
|