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.
Files changed (604) hide show
  1. aas_core_codegen/__init__.py +6 -0
  2. aas_core_codegen/__main__.py +8 -0
  3. aas_core_codegen/common.py +500 -0
  4. aas_core_codegen/cpp/__init__.py +1 -0
  5. aas_core_codegen/cpp/aas_common/__init__.py +6 -0
  6. aas_core_codegen/cpp/aas_common/_generate.py +713 -0
  7. aas_core_codegen/cpp/common.py +681 -0
  8. aas_core_codegen/cpp/constants/__init__.py +6 -0
  9. aas_core_codegen/cpp/constants/_generate.py +568 -0
  10. aas_core_codegen/cpp/description.py +654 -0
  11. aas_core_codegen/cpp/enhancing/__init__.py +4 -0
  12. aas_core_codegen/cpp/enhancing/_generate.py +993 -0
  13. aas_core_codegen/cpp/iteration/__init__.py +6 -0
  14. aas_core_codegen/cpp/iteration/_generate.py +2332 -0
  15. aas_core_codegen/cpp/jsonization/__init__.py +6 -0
  16. aas_core_codegen/cpp/jsonization/_generate.py +2619 -0
  17. aas_core_codegen/cpp/main.py +694 -0
  18. aas_core_codegen/cpp/naming.py +170 -0
  19. aas_core_codegen/cpp/optionaling.py +557 -0
  20. aas_core_codegen/cpp/pattern/__init__.py +6 -0
  21. aas_core_codegen/cpp/pattern/_generate.py +508 -0
  22. aas_core_codegen/cpp/revm/__init__.py +6 -0
  23. aas_core_codegen/cpp/revm/_generate.py +1149 -0
  24. aas_core_codegen/cpp/stringification/__init__.py +5 -0
  25. aas_core_codegen/cpp/stringification/_generate.py +955 -0
  26. aas_core_codegen/cpp/structure/__init__.py +7 -0
  27. aas_core_codegen/cpp/structure/_generate.py +1503 -0
  28. aas_core_codegen/cpp/transpilation.py +1383 -0
  29. aas_core_codegen/cpp/unrolling.py +159 -0
  30. aas_core_codegen/cpp/verification/__init__.py +6 -0
  31. aas_core_codegen/cpp/verification/_generate.py +3073 -0
  32. aas_core_codegen/cpp/visitation/__init__.py +6 -0
  33. aas_core_codegen/cpp/visitation/_generate.py +521 -0
  34. aas_core_codegen/cpp/wstringification/__init__.py +5 -0
  35. aas_core_codegen/cpp/wstringification/_generate.py +586 -0
  36. aas_core_codegen/cpp/xmlization/__init__.py +6 -0
  37. aas_core_codegen/cpp/xmlization/_generate.py +5373 -0
  38. aas_core_codegen/cpp/yielding.py +201 -0
  39. aas_core_codegen/csharp/__init__.py +1 -0
  40. aas_core_codegen/csharp/common.py +224 -0
  41. aas_core_codegen/csharp/constants/__init__.py +5 -0
  42. aas_core_codegen/csharp/constants/_generate.py +409 -0
  43. aas_core_codegen/csharp/copying/__init__.py +4 -0
  44. aas_core_codegen/csharp/copying/_generate.py +498 -0
  45. aas_core_codegen/csharp/description.py +1103 -0
  46. aas_core_codegen/csharp/enhancing/__init__.py +4 -0
  47. aas_core_codegen/csharp/enhancing/_generate.py +667 -0
  48. aas_core_codegen/csharp/jsonization/__init__.py +4 -0
  49. aas_core_codegen/csharp/jsonization/_generate.py +1630 -0
  50. aas_core_codegen/csharp/main.py +421 -0
  51. aas_core_codegen/csharp/naming.py +157 -0
  52. aas_core_codegen/csharp/reporting/__init__.py +4 -0
  53. aas_core_codegen/csharp/reporting/_generate.py +266 -0
  54. aas_core_codegen/csharp/stringification/__init__.py +4 -0
  55. aas_core_codegen/csharp/stringification/_generate.py +243 -0
  56. aas_core_codegen/csharp/structure/__init__.py +6 -0
  57. aas_core_codegen/csharp/structure/_generate.py +1341 -0
  58. aas_core_codegen/csharp/transpilation.py +990 -0
  59. aas_core_codegen/csharp/unrolling.py +211 -0
  60. aas_core_codegen/csharp/verification/__init__.py +6 -0
  61. aas_core_codegen/csharp/verification/_generate.py +1457 -0
  62. aas_core_codegen/csharp/visitation/__init__.py +5 -0
  63. aas_core_codegen/csharp/visitation/_generate.py +579 -0
  64. aas_core_codegen/csharp/xmlization/__init__.py +4 -0
  65. aas_core_codegen/csharp/xmlization/_generate.py +1980 -0
  66. aas_core_codegen/golang/__init__.py +1 -0
  67. aas_core_codegen/golang/aas_common/__init__.py +4 -0
  68. aas_core_codegen/golang/aas_common/_generate.py +152 -0
  69. aas_core_codegen/golang/common.py +303 -0
  70. aas_core_codegen/golang/constants/__init__.py +5 -0
  71. aas_core_codegen/golang/constants/_generate.py +339 -0
  72. aas_core_codegen/golang/description.py +501 -0
  73. aas_core_codegen/golang/enhancing/__init__.py +4 -0
  74. aas_core_codegen/golang/enhancing/_generate.py +527 -0
  75. aas_core_codegen/golang/jsonization/__init__.py +4 -0
  76. aas_core_codegen/golang/jsonization/_generate.py +1740 -0
  77. aas_core_codegen/golang/main.py +368 -0
  78. aas_core_codegen/golang/naming.py +412 -0
  79. aas_core_codegen/golang/pointering.py +631 -0
  80. aas_core_codegen/golang/reporting/__init__.py +4 -0
  81. aas_core_codegen/golang/reporting/_generate.py +218 -0
  82. aas_core_codegen/golang/stringification/__init__.py +4 -0
  83. aas_core_codegen/golang/stringification/_generate.py +394 -0
  84. aas_core_codegen/golang/structure/__init__.py +6 -0
  85. aas_core_codegen/golang/structure/_generate.py +1493 -0
  86. aas_core_codegen/golang/transpilation.py +1191 -0
  87. aas_core_codegen/golang/unrolling.py +159 -0
  88. aas_core_codegen/golang/verification/__init__.py +6 -0
  89. aas_core_codegen/golang/verification/_generate.py +1513 -0
  90. aas_core_codegen/golang/xmlization/__init__.py +4 -0
  91. aas_core_codegen/golang/xmlization/_generate.py +2507 -0
  92. aas_core_codegen/infer_for_schema/__init__.py +21 -0
  93. aas_core_codegen/infer_for_schema/_inline.py +693 -0
  94. aas_core_codegen/infer_for_schema/_len.py +527 -0
  95. aas_core_codegen/infer_for_schema/_pattern.py +311 -0
  96. aas_core_codegen/infer_for_schema/_set.py +394 -0
  97. aas_core_codegen/infer_for_schema/_stringify.py +201 -0
  98. aas_core_codegen/infer_for_schema/_types.py +135 -0
  99. aas_core_codegen/infer_for_schema/match.py +122 -0
  100. aas_core_codegen/intermediate/__init__.py +78 -0
  101. aas_core_codegen/intermediate/_hierarchy.py +397 -0
  102. aas_core_codegen/intermediate/_stringify.py +989 -0
  103. aas_core_codegen/intermediate/_translate.py +5128 -0
  104. aas_core_codegen/intermediate/_types.py +2901 -0
  105. aas_core_codegen/intermediate/construction.py +750 -0
  106. aas_core_codegen/intermediate/doc.py +344 -0
  107. aas_core_codegen/intermediate/pattern_verification.py +428 -0
  108. aas_core_codegen/intermediate/revm.py +985 -0
  109. aas_core_codegen/intermediate/type_inference.py +2266 -0
  110. aas_core_codegen/java/__init__.py +1 -0
  111. aas_core_codegen/java/common.py +197 -0
  112. aas_core_codegen/java/constants/__init__.py +5 -0
  113. aas_core_codegen/java/constants/_generate.py +334 -0
  114. aas_core_codegen/java/copying/__init__.py +4 -0
  115. aas_core_codegen/java/copying/_generate.py +502 -0
  116. aas_core_codegen/java/description.py +774 -0
  117. aas_core_codegen/java/enhancing/__init__.py +4 -0
  118. aas_core_codegen/java/enhancing/_generate.py +820 -0
  119. aas_core_codegen/java/generation/__init__.py +5 -0
  120. aas_core_codegen/java/generation/_generate.py +285 -0
  121. aas_core_codegen/java/jsonization/__init__.py +4 -0
  122. aas_core_codegen/java/jsonization/_generate.py +1472 -0
  123. aas_core_codegen/java/main.py +438 -0
  124. aas_core_codegen/java/naming.py +187 -0
  125. aas_core_codegen/java/optional.py +514 -0
  126. aas_core_codegen/java/reporting/__init__.py +4 -0
  127. aas_core_codegen/java/reporting/_generate.py +248 -0
  128. aas_core_codegen/java/stringification/__init__.py +4 -0
  129. aas_core_codegen/java/stringification/_generate.py +212 -0
  130. aas_core_codegen/java/structure/__init__.py +6 -0
  131. aas_core_codegen/java/structure/_generate.py +1767 -0
  132. aas_core_codegen/java/transpilation.py +1111 -0
  133. aas_core_codegen/java/verification/__init__.py +6 -0
  134. aas_core_codegen/java/verification/_generate.py +1536 -0
  135. aas_core_codegen/java/visitation/__init__.py +5 -0
  136. aas_core_codegen/java/visitation/_generate.py +689 -0
  137. aas_core_codegen/java/xmlization/__init__.py +4 -0
  138. aas_core_codegen/java/xmlization/_generate.py +2274 -0
  139. aas_core_codegen/jsonld/__init__.py +1 -0
  140. aas_core_codegen/jsonld/main.py +455 -0
  141. aas_core_codegen/jsonschema/__init__.py +1 -0
  142. aas_core_codegen/jsonschema/main.py +982 -0
  143. aas_core_codegen/main.py +245 -0
  144. aas_core_codegen/naming.py +133 -0
  145. aas_core_codegen/opcua/__init__.py +1 -0
  146. aas_core_codegen/opcua/main.py +1525 -0
  147. aas_core_codegen/opcua/naming.py +126 -0
  148. aas_core_codegen/parse/__init__.py +46 -0
  149. aas_core_codegen/parse/_rules.py +796 -0
  150. aas_core_codegen/parse/_stringify.py +532 -0
  151. aas_core_codegen/parse/_translate.py +3940 -0
  152. aas_core_codegen/parse/_types.py +973 -0
  153. aas_core_codegen/parse/retree/__init__.py +46 -0
  154. aas_core_codegen/parse/retree/_fix.py +434 -0
  155. aas_core_codegen/parse/retree/_parse.py +1143 -0
  156. aas_core_codegen/parse/retree/_render.py +298 -0
  157. aas_core_codegen/parse/retree/_stringify.py +199 -0
  158. aas_core_codegen/parse/retree/_types.py +362 -0
  159. aas_core_codegen/parse/retree/_visitor.py +70 -0
  160. aas_core_codegen/parse/tree.py +1303 -0
  161. aas_core_codegen/protobuf/__init__.py +1 -0
  162. aas_core_codegen/protobuf/common.py +225 -0
  163. aas_core_codegen/protobuf/description.py +1102 -0
  164. aas_core_codegen/protobuf/main.py +115 -0
  165. aas_core_codegen/protobuf/naming.py +143 -0
  166. aas_core_codegen/protobuf/structure/__init__.py +6 -0
  167. aas_core_codegen/protobuf/structure/_generate.py +502 -0
  168. aas_core_codegen/py.typed +1 -0
  169. aas_core_codegen/python/__init__.py +1 -0
  170. aas_core_codegen/python/aas_common/__init__.py +4 -0
  171. aas_core_codegen/python/aas_common/_generate.py +63 -0
  172. aas_core_codegen/python/common.py +406 -0
  173. aas_core_codegen/python/constants/__init__.py +5 -0
  174. aas_core_codegen/python/constants/_generate.py +377 -0
  175. aas_core_codegen/python/description.py +508 -0
  176. aas_core_codegen/python/jsonization/__init__.py +4 -0
  177. aas_core_codegen/python/jsonization/_generate.py +1391 -0
  178. aas_core_codegen/python/main.py +323 -0
  179. aas_core_codegen/python/naming.py +255 -0
  180. aas_core_codegen/python/stringification/__init__.py +4 -0
  181. aas_core_codegen/python/stringification/_generate.py +129 -0
  182. aas_core_codegen/python/structure/__init__.py +6 -0
  183. aas_core_codegen/python/structure/_generate.py +1801 -0
  184. aas_core_codegen/python/transpilation.py +958 -0
  185. aas_core_codegen/python/unrolling.py +156 -0
  186. aas_core_codegen/python/verification/__init__.py +6 -0
  187. aas_core_codegen/python/verification/_generate.py +1471 -0
  188. aas_core_codegen/python/xmlization/__init__.py +4 -0
  189. aas_core_codegen/python/xmlization/_generate.py +3003 -0
  190. aas_core_codegen/python_protobuf/__init__.py +1 -0
  191. aas_core_codegen/python_protobuf/main.py +1424 -0
  192. aas_core_codegen/python_protobuf/naming.py +85 -0
  193. aas_core_codegen/rdf_shacl/__init__.py +1 -0
  194. aas_core_codegen/rdf_shacl/_description.py +351 -0
  195. aas_core_codegen/rdf_shacl/common.py +206 -0
  196. aas_core_codegen/rdf_shacl/main.py +114 -0
  197. aas_core_codegen/rdf_shacl/naming.py +145 -0
  198. aas_core_codegen/rdf_shacl/rdf.py +435 -0
  199. aas_core_codegen/rdf_shacl/shacl.py +453 -0
  200. aas_core_codegen/run.py +124 -0
  201. aas_core_codegen/smoke/__init__.py +1 -0
  202. aas_core_codegen/smoke/main.py +219 -0
  203. aas_core_codegen/specific_implementations.py +72 -0
  204. aas_core_codegen/stringify.py +333 -0
  205. aas_core_codegen/typescript/__init__.py +1 -0
  206. aas_core_codegen/typescript/aas_common/__init__.py +4 -0
  207. aas_core_codegen/typescript/aas_common/_generate.py +472 -0
  208. aas_core_codegen/typescript/common.py +340 -0
  209. aas_core_codegen/typescript/constants/__init__.py +5 -0
  210. aas_core_codegen/typescript/constants/_generate.py +347 -0
  211. aas_core_codegen/typescript/description.py +530 -0
  212. aas_core_codegen/typescript/jsonization/__init__.py +4 -0
  213. aas_core_codegen/typescript/jsonization/_generate.py +1510 -0
  214. aas_core_codegen/typescript/main.py +258 -0
  215. aas_core_codegen/typescript/naming.py +189 -0
  216. aas_core_codegen/typescript/stringification/__init__.py +4 -0
  217. aas_core_codegen/typescript/stringification/_generate.py +367 -0
  218. aas_core_codegen/typescript/structure/__init__.py +6 -0
  219. aas_core_codegen/typescript/structure/_generate.py +2500 -0
  220. aas_core_codegen/typescript/transpilation.py +1051 -0
  221. aas_core_codegen/typescript/unrolling.py +159 -0
  222. aas_core_codegen/typescript/verification/__init__.py +6 -0
  223. aas_core_codegen/typescript/verification/_generate.py +1578 -0
  224. aas_core_codegen/xsd/__init__.py +1 -0
  225. aas_core_codegen/xsd/main.py +1187 -0
  226. aas_core_codegen/xsd/naming.py +83 -0
  227. aas_core_codegen/yielding/__init__.py +1 -0
  228. aas_core_codegen/yielding/flow.py +139 -0
  229. aas_core_codegen/yielding/linear.py +754 -0
  230. aas_core_codegen-0.0.16.dist-info/METADATA +211 -0
  231. aas_core_codegen-0.0.16.dist-info/RECORD +604 -0
  232. aas_core_codegen-0.0.16.dist-info/WHEEL +5 -0
  233. aas_core_codegen-0.0.16.dist-info/entry_points.txt +3 -0
  234. aas_core_codegen-0.0.16.dist-info/licenses/AUTHORS +9 -0
  235. aas_core_codegen-0.0.16.dist-info/licenses/LICENSE +23 -0
  236. aas_core_codegen-0.0.16.dist-info/top_level.txt +2 -0
  237. dev/continuous_integration/__init__.py +1 -0
  238. dev/continuous_integration/check_help_in_readme.py +208 -0
  239. dev/continuous_integration/check_init_and_pyproject_consistent.py +154 -0
  240. dev/continuous_integration/precommit.py +400 -0
  241. dev/dev_scripts/__init__.py +1 -0
  242. dev/dev_scripts/compare_rendered_regexes_against_source_py.py +42 -0
  243. dev/dev_scripts/copy_to_aas_core3_cpp.py +100 -0
  244. dev/dev_scripts/copy_to_aas_core3_java.py +90 -0
  245. dev/dev_scripts/download_latest_aas_core_meta_v3.py +114 -0
  246. dev/dev_scripts/draw_bipartite_graph_based_on_lines.py +37 -0
  247. dev/dev_scripts/run_tests_with_rerecord.py +69 -0
  248. dev/dev_scripts/update_to_aas_core_meta.py +174 -0
  249. dev/integration_tests/input/jsonschema/boilerplate/main.py +55 -0
  250. dev/integration_tests/input/meta_model.py +38 -0
  251. dev/integration_tests/input/python/boilerplate/main.py +153 -0
  252. dev/integration_tests/main.py +258 -0
  253. dev/test_data/csharp/test_structure/concrete_class_with_descendants/meta_model.py +15 -0
  254. dev/test_data/csharp/test_structure/constructor_without_arguments/all_properties_optional/meta_model.py +9 -0
  255. dev/test_data/csharp/test_structure/constructor_without_arguments/no_properties/meta_model.py +6 -0
  256. dev/test_data/csharp/test_verification/builtin_functions/len/on_list/meta_model.py +20 -0
  257. dev/test_data/csharp/test_verification/builtin_functions/len/on_str/meta_model.py +16 -0
  258. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/as_prefix/meta_model.py +8 -0
  259. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/as_suffix/meta_model.py +8 -0
  260. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/in_group_with_quantifier/meta_model.py +8 -0
  261. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/in_the_middle/meta_model.py +8 -0
  262. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/in_union/meta_model.py +8 -0
  263. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/single_utf32_literal/meta_model.py +8 -0
  264. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/with_quantifier_within_group/meta_model.py +8 -0
  265. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/with_quantifier_without_group/meta_model.py +8 -0
  266. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/at_the_beginning/meta_model.py +8 -0
  267. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/at_the_end/meta_model.py +8 -0
  268. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/in_the_middle/meta_model.py +8 -0
  269. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/multiple/meta_model.py +8 -0
  270. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/single/meta_model.py +8 -0
  271. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/single_with_quantifier/meta_model.py +8 -0
  272. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/mixed_with_non_utf32/meta_model.py +8 -0
  273. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/more_than_two_high_surrogates/meta_model.py +8 -0
  274. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/multiple_utf32_ranges/meta_model.py +8 -0
  275. 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
  276. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/same_high_surrogate/meta_model.py +8 -0
  277. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/same_high_surrogate_with_quantifier/meta_model.py +8 -0
  278. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/two_high_surrogates/meta_model.py +8 -0
  279. dev/test_data/intermediate/expected/class/empty/meta_model.py +6 -0
  280. dev/test_data/intermediate/expected/class/implementation_specific_method/meta_model.py +8 -0
  281. dev/test_data/intermediate/expected/class/inheritance/meta_model.py +41 -0
  282. dev/test_data/intermediate/expected/class/methods_with_contracts/meta_model.py +15 -0
  283. dev/test_data/intermediate/expected/class/only_method_no_property/meta_model.py +7 -0
  284. dev/test_data/intermediate/expected/class/only_property_no_method/meta_model.py +9 -0
  285. dev/test_data/intermediate/expected/constant/constant_set/of_enum/meta_model.py +12 -0
  286. dev/test_data/intermediate/expected/constant/constant_set/of_str/meta_model.py +4 -0
  287. dev/test_data/intermediate/expected/constant/constant_set/with_description/meta_model.py +6 -0
  288. dev/test_data/intermediate/expected/constant/constant_set/with_superset_of/meta_model.py +14 -0
  289. dev/test_data/intermediate/expected/constant/constant_str/only_value/meta_model.py +7 -0
  290. dev/test_data/intermediate/expected/constant/constant_str/with_description/meta_model.py +5 -0
  291. dev/test_data/intermediate/expected/documentation/docstring_with_special_characters_in_literal/meta_model.py +20 -0
  292. dev/test_data/intermediate/expected/documentation/docstring_with_special_characters_outside_literal/meta_model.py +20 -0
  293. dev/test_data/intermediate/expected/empty/meta_model.py +2 -0
  294. dev/test_data/intermediate/expected/enumeration/meta_model.py +9 -0
  295. dev/test_data/intermediate/expected/interface/basic/meta_model.py +14 -0
  296. dev/test_data/intermediate/expected/interface/empty/meta_model.py +7 -0
  297. dev/test_data/intermediate/expected/interface/inheritance/meta_model.py +27 -0
  298. dev/test_data/intermediate/expected/interface/method_signature/meta_model.py +10 -0
  299. dev/test_data/intermediate/expected/interface/only_constructor/meta_model.py +11 -0
  300. dev/test_data/intermediate/expected/method/non_mutating/implementation_specific/meta_model.py +12 -0
  301. dev/test_data/intermediate/expected/method/non_mutating/understood/meta_model.py +11 -0
  302. dev/test_data/intermediate/expected/type_annotation/atomic/meta_model.py +9 -0
  303. dev/test_data/intermediate/expected/type_annotation/subscripted/class/meta_model.py +13 -0
  304. dev/test_data/intermediate/expected/type_annotation/subscripted/primitive/meta_model.py +9 -0
  305. dev/test_data/intermediate/unexpected/constant_set/of_enum/enumeration_literals_in_subset_outside_of_superset/meta_model.py +20 -0
  306. dev/test_data/intermediate/unexpected/constant_set/of_enum/invalid_literal/meta_model.py +11 -0
  307. dev/test_data/intermediate/unexpected/constant_set/of_enum/mismatch_between_enumeration_and_literal/meta_model.py +30 -0
  308. dev/test_data/intermediate/unexpected/constant_set/of_enum/mismatch_in_enumerations_between_subset_and_superset/meta_model.py +21 -0
  309. dev/test_data/intermediate/unexpected/constant_set/of_str/literals_in_subset_outside_of_superset/meta_model.py +18 -0
  310. dev/test_data/intermediate/unexpected/constant_set/of_str/mismatch_between_type_annotation_and_literals/meta_model.py +10 -0
  311. dev/test_data/intermediate/unexpected/constant_set/of_str/superset_and_subset_mismatch_in_type/meta_model.py +12 -0
  312. dev/test_data/intermediate/unexpected/constraints/dangling_constraintref/meta_model.py +18 -0
  313. dev/test_data/intermediate/unexpected/constraints/duplicate_constraints/meta_model.py +20 -0
  314. dev/test_data/intermediate/unexpected/documentation/unexpected_documentation_elements/meta_model.py +34 -0
  315. dev/test_data/intermediate/unexpected/invariant/class_invariant_uses_re/meta_model.py +10 -0
  316. dev/test_data/intermediate/unexpected/invariant/invariant_of_constrained_primitive_uses_re/meta_model.py +7 -0
  317. dev/test_data/intermediate/unexpected/invariant/unexpected_argument_count_to_len/meta_model.py +20 -0
  318. dev/test_data/intermediate/unexpected/invariant/unhandled_built_in_function/meta_model.py +16 -0
  319. dev/test_data/intermediate/unexpected/method_definitions/non_constant_default/meta_model.py +7 -0
  320. dev/test_data/intermediate/unexpected/optional_constructor_arguments_wo_default/default_non_none/meta_model.py +16 -0
  321. dev/test_data/intermediate/unexpected/optional_constructor_arguments_wo_default/no_default/meta_model.py +16 -0
  322. dev/test_data/intermediate/unexpected/properties_and_constructor_arguments_do_not_match/after_inheritance/meta_model.py +58 -0
  323. dev/test_data/intermediate/unexpected/properties_and_constructor_arguments_do_not_match/type_missmatch/meta_model.py +9 -0
  324. dev/test_data/intermediate/unexpected/properties_and_constructor_arguments_do_not_match/within_class/meta_model.py +22 -0
  325. dev/test_data/jsonschema/test_main/regression_when_len_constraints_on_inherited_property/meta_model.py +28 -0
  326. dev/test_data/opcua/test_main/abstract_and_concrete_classes/meta_model.py +37 -0
  327. dev/test_data/opcua/test_main/classes_with_invariants/meta_model.py +21 -0
  328. dev/test_data/opcua/test_main/concrete_class_with_descendant/meta_model.py +27 -0
  329. dev/test_data/opcua/test_main/concrete_class_with_enum/meta_model.py +21 -0
  330. dev/test_data/opcua/test_main/concrete_class_with_list_of_instances/meta_model.py +21 -0
  331. dev/test_data/opcua/test_main/concrete_class_with_primitive_attributes/meta_model.py +41 -0
  332. dev/test_data/opcua/test_main/concrete_class_with_string/meta_model.py +13 -0
  333. dev/test_data/opcua/test_main/constrained_primitive/meta_model.py +20 -0
  334. dev/test_data/opcua/test_main/multiple_inheritance/meta_model.py +25 -0
  335. dev/test_data/parse/expected/constant/constant_set/of_enum/meta_model.py +12 -0
  336. dev/test_data/parse/expected/constant/constant_set/of_str/meta_model.py +4 -0
  337. dev/test_data/parse/expected/constant/constant_set/with_description/meta_model.py +6 -0
  338. dev/test_data/parse/expected/constant/constant_set/with_superset_of/meta_model.py +14 -0
  339. dev/test_data/parse/expected/constant/constant_str/only_value/meta_model.py +7 -0
  340. dev/test_data/parse/expected/constant/constant_str/with_description/meta_model.py +5 -0
  341. dev/test_data/parse/expected/enum/ok/meta_model.py +15 -0
  342. dev/test_data/parse/expected/implementation_specific_class/properties_and_methods_in_implementation_specific_class/meta_model.py +17 -0
  343. dev/test_data/parse/expected/inheritance/basic/meta_model.py +11 -0
  344. dev/test_data/parse/expected/inheritance/diamond/meta_model.py +26 -0
  345. dev/test_data/parse/expected/inheritance/inheritance_from_concrete_class/meta_model.py +10 -0
  346. dev/test_data/parse/expected/invariants/in_relation/meta_model.py +16 -0
  347. dev/test_data/parse/expected/method/arguments/meta_model.py +7 -0
  348. dev/test_data/parse/expected/method/basic/meta_model.py +7 -0
  349. dev/test_data/parse/expected/method/contracts/condition_as_keyword_argument/meta_model.py +8 -0
  350. dev/test_data/parse/expected/method/contracts/condition_as_positional_argument/meta_model.py +8 -0
  351. dev/test_data/parse/expected/method/contracts/description_as_keyword_argument/meta_model.py +8 -0
  352. dev/test_data/parse/expected/method/contracts/description_as_positional_argument/meta_model.py +8 -0
  353. dev/test_data/parse/expected/method/contracts/multiple_contracts_in_order/meta_model.py +17 -0
  354. dev/test_data/parse/expected/method/contracts/postcondition/basic/meta_model.py +10 -0
  355. dev/test_data/parse/expected/method/contracts/postcondition/snapshot/with_keyword_arguments/meta_model.py +9 -0
  356. dev/test_data/parse/expected/method/contracts/postcondition/snapshot/with_positional_arguments/meta_model.py +9 -0
  357. dev/test_data/parse/expected/method/default/meta_model.py +9 -0
  358. dev/test_data/parse/expected/method/description/meta_model.py +8 -0
  359. dev/test_data/parse/expected/method/is_implementation_specific/meta_model.py +8 -0
  360. dev/test_data/parse/expected/method/non_mutating/meta_model.py +11 -0
  361. dev/test_data/parse/expected/method/returns_none/meta_model.py +7 -0
  362. dev/test_data/parse/expected/method/returns_something/meta_model.py +7 -0
  363. dev/test_data/parse/expected/single_class/description/meta_model.py +12 -0
  364. dev/test_data/parse/expected/single_class/empty/meta_model.py +6 -0
  365. dev/test_data/parse/expected/single_class/property/description/meta_model.py +14 -0
  366. dev/test_data/parse/expected/single_class/property/mandatory/meta_model.py +6 -0
  367. dev/test_data/parse/expected/single_class/property/optional/meta_model.py +6 -0
  368. dev/test_data/parse/expected/single_class/property/recursion_to_entity/meta_model.py +6 -0
  369. dev/test_data/parse/unexpected/class_decorators/non_name_decorator/meta_model.py +7 -0
  370. dev/test_data/parse/unexpected/class_decorators/unknown_decorator/meta_model.py +7 -0
  371. dev/test_data/parse/unexpected/class_definitions/is_abstract_and_implementation_specific/meta_model.py +8 -0
  372. dev/test_data/parse/unexpected/class_definitions/unexpected_docstring_before_a_method/meta_model.py +11 -0
  373. dev/test_data/parse/unexpected/class_definitions/unexpected_docstring_for_a_pass/meta_model.py +9 -0
  374. dev/test_data/parse/unexpected/class_definitions/unexpected_double_description_for_a_property/meta_model.py +10 -0
  375. dev/test_data/parse/unexpected/class_inheritances/inheriting_from_implementation_specific_parent/meta_model.py +20 -0
  376. dev/test_data/parse/unexpected/class_inheritances/non_name_super_class/meta_model.py +6 -0
  377. dev/test_data/parse/unexpected/enum/expression_as_assignment_value/meta_model.py +6 -0
  378. dev/test_data/parse/unexpected/enum/non_assignment/meta_model.py +8 -0
  379. dev/test_data/parse/unexpected/enum/non_string_literal/meta_model.py +6 -0
  380. dev/test_data/parse/unexpected/enum/unexpected_inheritance/meta_model.py +6 -0
  381. dev/test_data/parse/unexpected/method_contracts/contract/non_lambda_condition/meta_model.py +8 -0
  382. dev/test_data/parse/unexpected/method_contracts/contract/non_string_literal_description/meta_model.py +8 -0
  383. dev/test_data/parse/unexpected/method_contracts/contract/without_any_arguments/meta_model.py +8 -0
  384. dev/test_data/parse/unexpected/method_contracts/contract/without_condition/meta_model.py +8 -0
  385. dev/test_data/parse/unexpected/method_contracts/postcondition/OLD_in_postcondition_without_snapshot/meta_model.py +8 -0
  386. dev/test_data/parse/unexpected/method_contracts/postcondition/argument_missing_in_function/meta_model.py +8 -0
  387. dev/test_data/parse/unexpected/method_contracts/precondition/argument_missing_in_function/meta_model.py +8 -0
  388. dev/test_data/parse/unexpected/method_contracts/snapshot/argument_missing_in_function/meta_model.py +8 -0
  389. dev/test_data/parse/unexpected/method_contracts/snapshot/capture_not_a_lambda/meta_model.py +8 -0
  390. dev/test_data/parse/unexpected/method_contracts/snapshot/invalid_name/meta_model.py +8 -0
  391. dev/test_data/parse/unexpected/method_contracts/snapshot/name_not_a_string_literal/meta_model.py +8 -0
  392. dev/test_data/parse/unexpected/method_contracts/snapshot/without_a_capture/meta_model.py +8 -0
  393. dev/test_data/parse/unexpected/method_contracts/snapshot/without_a_name/meta_model.py +8 -0
  394. dev/test_data/parse/unexpected/method_decorators/non_mutating/non_mutating_constructor/meta_model.py +8 -0
  395. dev/test_data/parse/unexpected/method_decorators/non_mutating/non_mutating_verification_function/meta_model.py +8 -0
  396. dev/test_data/parse/unexpected/method_decorators/non_name_decorator/meta_model.py +8 -0
  397. dev/test_data/parse/unexpected/method_decorators/unknown_call_decorator/meta_model.py +8 -0
  398. dev/test_data/parse/unexpected/method_decorators/unknown_name_decorator/meta_model.py +8 -0
  399. dev/test_data/parse/unexpected/method_definitions/argument_with_final/meta_model.py +7 -0
  400. dev/test_data/parse/unexpected/method_definitions/argument_without_a_type_annotation/meta_model.py +7 -0
  401. dev/test_data/parse/unexpected/method_definitions/default_for_self/meta_model.py +7 -0
  402. dev/test_data/parse/unexpected/method_definitions/dunder/meta_model.py +7 -0
  403. dev/test_data/parse/unexpected/method_definitions/init_with_return_type/meta_model.py +7 -0
  404. dev/test_data/parse/unexpected/method_definitions/with_keyword_only_arguments/meta_model.py +7 -0
  405. dev/test_data/parse/unexpected/method_definitions/with_positional_arguments/meta_model.py +7 -0
  406. dev/test_data/parse/unexpected/method_definitions/with_type_annotation_for_self/meta_model.py +7 -0
  407. dev/test_data/parse/unexpected/method_definitions/with_variable_arguments/meta_model.py +7 -0
  408. dev/test_data/parse/unexpected/method_definitions/with_variable_keyword_arguments/meta_model.py +7 -0
  409. dev/test_data/parse/unexpected/method_definitions/without_arguments/meta_model.py +7 -0
  410. dev/test_data/parse/unexpected/method_definitions/without_self/meta_model.py +7 -0
  411. dev/test_data/parse/unexpected/method_definitions/without_type_annotation_for_result/meta_model.py +7 -0
  412. dev/test_data/parse/unexpected/property_definitions/final_without_subscript/meta_model.py +6 -0
  413. dev/test_data/parse/unexpected/property_definitions/nested_final/meta_model.py +6 -0
  414. dev/test_data/parse/unexpected/property_definitions/non_simple/meta_model.py +6 -0
  415. dev/test_data/parse/unexpected/property_definitions/unexpected_assignment/meta_model.py +6 -0
  416. dev/test_data/parse/unexpected/property_definitions/unexpected_non_name_property/meta_model.py +6 -0
  417. dev/test_data/parse/unexpected/property_definitions/without_type_annotation/meta_model.py +6 -0
  418. dev/test_data/parse/unexpected/symbol_table/constant_set_with_a_non_set_subset/meta_model.py +6 -0
  419. dev/test_data/parse/unexpected/symbol_table/dangling_inheritance/meta_model.py +6 -0
  420. dev/test_data/parse/unexpected/symbol_table/dangling_reference_in_type_annotation_of_a_property/meta_model.py +6 -0
  421. dev/test_data/parse/unexpected/symbol_table/dangling_reference_in_type_annotation_of_an_argument/meta_model.py +7 -0
  422. dev/test_data/parse/unexpected/symbol_table/dangling_reference_in_type_annotation_of_constant_set/meta_model.py +6 -0
  423. dev/test_data/parse/unexpected/symbol_table/dangling_subset_in_constant_set/meta_model.py +4 -0
  424. dev/test_data/parse/unexpected/symbol_table/inheritance_from_non_class/meta_model.py +10 -0
  425. dev/test_data/parse_retree/expected/character_set/common_escaping/source.py +1 -0
  426. dev/test_data/parse_retree/expected/character_set/complementing/double_caret/source.py +1 -0
  427. dev/test_data/parse_retree/expected/character_set/complementing/multiple_ranges/source.py +1 -0
  428. dev/test_data/parse_retree/expected/character_set/complementing/suffix_dash/source.py +1 -0
  429. dev/test_data/parse_retree/expected/character_set/escape_first_caret/source.py +1 -0
  430. dev/test_data/parse_retree/expected/character_set/literals_which_need_no_escaping_in_characters_set_but_need_escaping_outside/source.py +1 -0
  431. dev/test_data/parse_retree/expected/character_set/multiple_ranges/source.py +1 -0
  432. dev/test_data/parse_retree/expected/character_set/single_literal/source.py +1 -0
  433. dev/test_data/parse_retree/expected/character_set/single_range/source.py +1 -0
  434. dev/test_data/parse_retree/expected/character_set/unescaped_dash/only_dash/source.py +1 -0
  435. dev/test_data/parse_retree/expected/character_set/unescaped_dash/prefix_dash/source.py +1 -0
  436. dev/test_data/parse_retree/expected/character_set/unescaped_dash/suffix_dash/source.py +1 -0
  437. dev/test_data/parse_retree/expected/dot/source.py +1 -0
  438. dev/test_data/parse_retree/expected/empty/group/source.py +1 -0
  439. dev/test_data/parse_retree/expected/empty/group_in_a_group/source.py +1 -0
  440. dev/test_data/parse_retree/expected/empty/group_of_union_of_empty_concatenations/source.py +1 -0
  441. dev/test_data/parse_retree/expected/empty/regex/source.py +1 -0
  442. dev/test_data/parse_retree/expected/empty/union_of_empty_concatenations/source.py +1 -0
  443. dev/test_data/parse_retree/expected/escaped_literals/source.py +1 -0
  444. dev/test_data/parse_retree/expected/formatted_value/at_the_beginning/source.py +1 -0
  445. dev/test_data/parse_retree/expected/formatted_value/at_the_end/source.py +1 -0
  446. dev/test_data/parse_retree/expected/formatted_value/in_the_middle/source.py +1 -0
  447. dev/test_data/parse_retree/expected/formatted_value/single_formatted_value/source.py +1 -0
  448. dev/test_data/parse_retree/expected/literal/source.py +1 -0
  449. dev/test_data/parse_retree/expected/quantifier/greedy/at_least_3/source.py +1 -0
  450. dev/test_data/parse_retree/expected/quantifier/greedy/at_least_one/source.py +1 -0
  451. dev/test_data/parse_retree/expected/quantifier/greedy/at_most_3/source.py +1 -0
  452. dev/test_data/parse_retree/expected/quantifier/greedy/exactly_3/source.py +1 -0
  453. dev/test_data/parse_retree/expected/quantifier/greedy/maybe/source.py +1 -0
  454. dev/test_data/parse_retree/expected/quantifier/greedy/zero_or_more/source.py +1 -0
  455. dev/test_data/parse_retree/expected/quantifier/non_greedy/at_least_3/source.py +1 -0
  456. dev/test_data/parse_retree/expected/quantifier/non_greedy/at_least_one/source.py +1 -0
  457. dev/test_data/parse_retree/expected/quantifier/non_greedy/at_most_3/source.py +1 -0
  458. dev/test_data/parse_retree/expected/quantifier/non_greedy/exactly_3/source.py +1 -0
  459. dev/test_data/parse_retree/expected/quantifier/non_greedy/maybe/source.py +1 -0
  460. dev/test_data/parse_retree/expected/quantifier/non_greedy/zero_or_more/source.py +1 -0
  461. dev/test_data/parse_retree/expected/quantifier/on_a_character_set/source.py +1 -0
  462. dev/test_data/parse_retree/expected/quantifier/on_a_formatted_value/source.py +1 -0
  463. dev/test_data/parse_retree/expected/quantifier/on_a_group/source.py +1 -0
  464. dev/test_data/parse_retree/expected/quantifier/on_a_literal/source.py +1 -0
  465. dev/test_data/parse_retree/expected/start_and_stop_symbols/double_end_symbol/source.py +1 -0
  466. dev/test_data/parse_retree/expected/start_and_stop_symbols/double_start_symbol/source.py +1 -0
  467. dev/test_data/parse_retree/expected/start_and_stop_symbols/end_symbol_in_the_middle/source.py +1 -0
  468. dev/test_data/parse_retree/expected/start_and_stop_symbols/only_start_symbol/source.py +1 -0
  469. dev/test_data/parse_retree/expected/start_and_stop_symbols/only_stop_symbol/source.py +1 -0
  470. dev/test_data/parse_retree/expected/start_and_stop_symbols/start_symbol_at_the_beginning/source.py +1 -0
  471. dev/test_data/parse_retree/expected/start_and_stop_symbols/start_symbol_in_the_middle/source.py +1 -0
  472. dev/test_data/parse_retree/expected/start_and_stop_symbols/stop_symbol_at_the_end/source.py +1 -0
  473. dev/test_data/parse_retree/expected/union/of_character_sets/source.py +1 -0
  474. dev/test_data/parse_retree/expected/union/of_groups/source.py +1 -0
  475. dev/test_data/parse_retree/expected/union/of_string_literals/source.py +1 -0
  476. dev/test_data/parse_retree/expected/union/within_group/source.py +1 -0
  477. dev/test_data/parse_retree/expected/whitespace/source.py +1 -0
  478. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/Uxxxxxxxx_out_of_range/source.py +1 -0
  479. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/only_backslash/source.py +1 -0
  480. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/short_Uxxxxxxxx/source.py +1 -0
  481. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/short_uxxxx/source.py +1 -0
  482. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/short_x/source.py +1 -0
  483. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unexpected_escaping/source.py +1 -0
  484. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/digit/source.py +1 -0
  485. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/not_digit/source.py +1 -0
  486. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/not_whitespace/source.py +1 -0
  487. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/not_word/source.py +1 -0
  488. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/whitespace/source.py +1 -0
  489. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/word/source.py +1 -0
  490. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/Uxxxxxxxx_out_of_range/source.py +1 -0
  491. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/only_backslash/source.py +1 -0
  492. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/short_Uxxxxxxxx/source.py +1 -0
  493. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/short_uxxxx/source.py +1 -0
  494. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/short_x/source.py +1 -0
  495. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unexpected_escaping/source.py +1 -0
  496. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/digit/source.py +1 -0
  497. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/not_digit/source.py +1 -0
  498. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/not_whitespace/source.py +1 -0
  499. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/not_word/source.py +1 -0
  500. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/whitespace/source.py +1 -0
  501. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/word/source.py +1 -0
  502. dev/test_data/parse_retree/unexpected/invalid_character_range/source.py +1 -0
  503. dev/test_data/parse_retree/unexpected/invalid_quantifier/at_least_x/source.py +1 -0
  504. dev/test_data/parse_retree/unexpected/invalid_quantifier/between_3_and_x/source.py +1 -0
  505. dev/test_data/parse_retree/unexpected/invalid_quantifier/exactly_x/source.py +1 -0
  506. dev/test_data/parse_retree/unexpected/unhandled_group_directives/source.py +1 -0
  507. dev/test_data/parse_retree/unexpected/unterminated/character_set/source.py +1 -0
  508. dev/test_data/parse_retree/unexpected/unterminated/group/source.py +1 -0
  509. dev/test_data/parse_retree/unexpected/unterminated/group_of_union_of_empty_concatenations/source.py +1 -0
  510. dev/test_data/parse_retree/unexpected/unterminated/quantifier/source.py +1 -0
  511. dev/test_data/parse_retree/unexpected/unterminated/quantifier_with_comma/source.py +1 -0
  512. dev/test_data/parse_retree/unexpected/unterminated/quantifier_with_number_and_comma/source.py +1 -0
  513. dev/test_data/proto/test_main/expected/abstract_and_concrete_classes/meta_model.py +37 -0
  514. dev/test_data/proto/test_main/expected/concrete_class_with_descendants/meta_model.py +30 -0
  515. dev/test_data/proto/test_main/expected/concrete_class_with_enum/meta_model.py +21 -0
  516. dev/test_data/proto/test_main/expected/concrete_class_with_list_of_instances/meta_model.py +21 -0
  517. dev/test_data/proto/test_main/expected/concrete_class_with_primitive_attributes/meta_model.py +41 -0
  518. dev/test_data/python_protobuf/test_main/abstract_and_concrete_classes/expected_output/pbization.py +532 -0
  519. dev/test_data/python_protobuf/test_main/abstract_and_concrete_classes/meta_model.py +37 -0
  520. dev/test_data/python_protobuf/test_main/concrete_class_with_descendant/expected_output/pbization.py +527 -0
  521. dev/test_data/python_protobuf/test_main/concrete_class_with_descendant/meta_model.py +27 -0
  522. dev/test_data/python_protobuf/test_main/concrete_class_with_enum/expected_output/pbization.py +290 -0
  523. dev/test_data/python_protobuf/test_main/concrete_class_with_enum/meta_model.py +21 -0
  524. dev/test_data/python_protobuf/test_main/concrete_class_with_list_of_instances/expected_output/pbization.py +328 -0
  525. dev/test_data/python_protobuf/test_main/concrete_class_with_list_of_instances/meta_model.py +23 -0
  526. dev/test_data/python_protobuf/test_main/concrete_class_with_primitive_attributes/expected_output/pbization.py +274 -0
  527. dev/test_data/python_protobuf/test_main/concrete_class_with_primitive_attributes/meta_model.py +41 -0
  528. dev/test_data/rdf_shacl/test_main/expected/regression_when_lang_string_class_is_missing/meta_model.py +29 -0
  529. dev/test_data/rdf_shacl/test_main/expected/regression_when_len_constraints_on_inherited_property/meta_model.py +27 -0
  530. dev/test_data/rdf_shacl/test_main/unexpected/regression_len_constraint_on_class_property/meta_model.py +61 -0
  531. dev/test_data/real_meta_models/aas_core_meta.v3.py +5721 -0
  532. dev/test_data/smoke/test_main/unexpected/infer_for_schema_error/meta_model.py +12 -0
  533. dev/test_data/smoke/test_main/unexpected/intermediate_error/meta_model.py +18 -0
  534. dev/test_data/smoke/test_main/unexpected/parse_error/meta_model.py +5 -0
  535. dev/test_data/smoke/test_main/unexpected/pattern_verification_unparsable_regex/direct_match/meta_model.py +8 -0
  536. dev/test_data/smoke/test_main/unexpected/type_error/meta_model.py +18 -0
  537. dev/tests/__init__.py +1 -0
  538. dev/tests/common.py +197 -0
  539. dev/tests/cpp/__init__.py +0 -0
  540. dev/tests/cpp/test_common.py +32 -0
  541. dev/tests/cpp/test_main.py +144 -0
  542. dev/tests/cpp/test_pattern.py +188 -0
  543. dev/tests/cpp/test_verification.py +189 -0
  544. dev/tests/cpp/test_yielding.py +225 -0
  545. dev/tests/csharp/__init__.py +0 -0
  546. dev/tests/csharp/live_test_main.py +109 -0
  547. dev/tests/csharp/test_common.py +28 -0
  548. dev/tests/csharp/test_description.py +684 -0
  549. dev/tests/csharp/test_main.py +129 -0
  550. dev/tests/csharp/test_structure.py +93 -0
  551. dev/tests/csharp/test_verification.py +82 -0
  552. dev/tests/description.py +29 -0
  553. dev/tests/golang/__init__.py +0 -0
  554. dev/tests/golang/test_common.py +78 -0
  555. dev/tests/golang/test_main.py +128 -0
  556. dev/tests/infer_for_schema/__init__.py +0 -0
  557. dev/tests/infer_for_schema/common.py +47 -0
  558. dev/tests/infer_for_schema/test_len_on_properties.py +955 -0
  559. dev/tests/infer_for_schema/test_len_on_self.py +580 -0
  560. dev/tests/infer_for_schema/test_patterns_on_properties.py +686 -0
  561. dev/tests/infer_for_schema/test_patterns_on_self.py +258 -0
  562. dev/tests/infer_for_schema/test_property_in_set_of_enumeration_literals.py +600 -0
  563. dev/tests/infer_for_schema/test_property_in_set_of_primitives.py +549 -0
  564. dev/tests/intermediate/__init__.py +0 -0
  565. dev/tests/intermediate/test_constructor.py +719 -0
  566. dev/tests/intermediate/test_hierarchy.py +221 -0
  567. dev/tests/intermediate/test_revm.py +134 -0
  568. dev/tests/intermediate/test_translate.py +337 -0
  569. dev/tests/intermediate/test_type_inference.py +333 -0
  570. dev/tests/intermediate/test_types.py +169 -0
  571. dev/tests/java/__init__.py +0 -0
  572. dev/tests/java/test_common.py +20 -0
  573. dev/tests/java/test_description.py +128 -0
  574. dev/tests/java/test_main.py +234 -0
  575. dev/tests/jsonld_context/test_main.py +79 -0
  576. dev/tests/opcua/__init__.py +3 -0
  577. dev/tests/opcua/test_main.py +110 -0
  578. dev/tests/our_jsonschema/__init__.py +3 -0
  579. dev/tests/our_jsonschema/test_main.py +232 -0
  580. dev/tests/parse/__init__.py +0 -0
  581. dev/tests/parse/test_parse.py +503 -0
  582. dev/tests/parse/test_retree.py +272 -0
  583. dev/tests/proto/__init__.py +0 -0
  584. dev/tests/proto/test_main.py +112 -0
  585. dev/tests/python/__init__.py +0 -0
  586. dev/tests/python/test_common.py +124 -0
  587. dev/tests/python/test_main.py +126 -0
  588. dev/tests/python/test_xml_playground.py +254 -0
  589. dev/tests/python_protobuf/__init__.py +0 -0
  590. dev/tests/python_protobuf/test_main.py +111 -0
  591. dev/tests/rdf_shacl/__init__.py +0 -0
  592. dev/tests/rdf_shacl/test_common.py +32 -0
  593. dev/tests/rdf_shacl/test_description.py +223 -0
  594. dev/tests/rdf_shacl/test_main.py +194 -0
  595. dev/tests/smoke/__init__.py +0 -0
  596. dev/tests/smoke/test_main.py +83 -0
  597. dev/tests/test_common.py +94 -0
  598. dev/tests/typescript/__init__.py +0 -0
  599. dev/tests/typescript/test_common.py +108 -0
  600. dev/tests/typescript/test_main.py +125 -0
  601. dev/tests/xsd/__init__.py +0 -0
  602. dev/tests/xsd/test_main.py +227 -0
  603. dev/tests/yielding/__init__.py +0 -0
  604. 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)