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,958 @@
1
+ """Transpile meta-model Python code to Python code."""
2
+ import abc
3
+ import io
4
+ from typing import (
5
+ Tuple,
6
+ Optional,
7
+ List,
8
+ Mapping,
9
+ Union,
10
+ Set,
11
+ )
12
+
13
+ from icontract import ensure
14
+
15
+ from aas_core_codegen import intermediate
16
+ from aas_core_codegen.common import (
17
+ Error,
18
+ Stripped,
19
+ assert_never,
20
+ indent_but_first_line,
21
+ Identifier,
22
+ )
23
+ from aas_core_codegen.python.common import (
24
+ INDENT as I,
25
+ )
26
+ from aas_core_codegen.intermediate import type_inference as intermediate_type_inference
27
+ from aas_core_codegen.parse import tree as parse_tree
28
+ from aas_core_codegen.python import (
29
+ common as python_common,
30
+ naming as python_naming,
31
+ )
32
+
33
+
34
+ class Transpiler(
35
+ parse_tree.RestrictedTransformer[Tuple[Optional[Stripped], Optional[Error]]]
36
+ ):
37
+ """Transpile a node of our AST to Python code, or return an error."""
38
+
39
+ _PYTHON_COMPARISON_MAP = {
40
+ parse_tree.Comparator.LT: "<",
41
+ parse_tree.Comparator.LE: "<=",
42
+ parse_tree.Comparator.GT: ">",
43
+ parse_tree.Comparator.GE: ">=",
44
+ parse_tree.Comparator.EQ: "==",
45
+ parse_tree.Comparator.NE: "!=",
46
+ }
47
+
48
+ def __init__(
49
+ self,
50
+ type_map: Mapping[
51
+ parse_tree.Node, intermediate_type_inference.TypeAnnotationUnion
52
+ ],
53
+ environment: intermediate_type_inference.Environment,
54
+ ) -> None:
55
+ """Initialize with the given values."""
56
+ self.type_map = type_map
57
+ self._environment = intermediate_type_inference.MutableEnvironment(
58
+ parent=environment
59
+ )
60
+
61
+ # NOTE (mristin, 2022-09-30):
62
+ # Keep track whenever we define a variable name, so that we can know how to
63
+ # resolve it as a name in the Python code.
64
+ #
65
+ # While this class does not directly use it, the descendants of this class do!
66
+ self._variable_name_set = set() # type: Set[Identifier]
67
+
68
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
69
+ def transform_member(
70
+ self, node: parse_tree.Member
71
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
72
+ instance, error = self.transform(node.instance)
73
+ if error is not None:
74
+ return None, error
75
+
76
+ # Ignore optionals as they need to be checked before in the code
77
+ instance_type = intermediate_type_inference.beneath_optional(
78
+ self.type_map[node.instance]
79
+ )
80
+ member_type = intermediate_type_inference.beneath_optional(self.type_map[node])
81
+
82
+ member_name: str
83
+
84
+ if isinstance(
85
+ instance_type, intermediate_type_inference.OurTypeAnnotation
86
+ ) and isinstance(instance_type.our_type, intermediate.Enumeration):
87
+ # The member denotes a literal of an enumeration.
88
+ member_name = python_naming.enum_literal_name(node.name)
89
+
90
+ elif isinstance(member_type, intermediate_type_inference.MethodTypeAnnotation):
91
+ member_name = python_naming.method_name(node.name)
92
+
93
+ elif isinstance(
94
+ instance_type, intermediate_type_inference.OurTypeAnnotation
95
+ ) and isinstance(instance_type.our_type, intermediate.Class):
96
+ if node.name in instance_type.our_type.properties_by_name:
97
+ member_name = python_naming.property_name(node.name)
98
+ else:
99
+ return None, Error(
100
+ node.original_node,
101
+ f"The property {node.name!r} has not been defined "
102
+ f"in the class {instance_type.our_type.name!r}",
103
+ )
104
+
105
+ elif isinstance(
106
+ instance_type, intermediate_type_inference.EnumerationAsTypeTypeAnnotation
107
+ ):
108
+ if node.name in instance_type.enumeration.literals_by_name:
109
+ member_name = python_naming.enum_literal_name(node.name)
110
+ else:
111
+ return None, Error(
112
+ node.original_node,
113
+ f"The literal {node.name!r} has not been defined "
114
+ f"in the enumeration {instance_type.enumeration.name!r}",
115
+ )
116
+ else:
117
+ return None, Error(
118
+ node.original_node,
119
+ f"We do not know how to generate the member access. The inferred type "
120
+ f"of the instance was {instance_type}, while the member type "
121
+ f"was {member_type}. However, we do not know how to resolve "
122
+ f"the member {node.name!r} in {instance_type}.",
123
+ )
124
+
125
+ return Stripped(f"{instance}.{member_name}"), None
126
+
127
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
128
+ def transform_index(
129
+ self, node: parse_tree.Index
130
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
131
+ collection, error = self.transform(node.collection)
132
+ if error is not None:
133
+ return None, error
134
+
135
+ index, error = self.transform(node.index)
136
+ if error is not None:
137
+ return None, error
138
+ assert index is not None
139
+
140
+ no_parentheses_types = (
141
+ parse_tree.Member,
142
+ parse_tree.FunctionCall,
143
+ parse_tree.MethodCall,
144
+ parse_tree.Name,
145
+ parse_tree.Constant,
146
+ parse_tree.Index,
147
+ )
148
+
149
+ if not isinstance(node.collection, no_parentheses_types):
150
+ collection = Stripped(f"({collection})")
151
+
152
+ return Stripped(f"{collection}[{index}]"), None
153
+
154
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
155
+ def transform_comparison(
156
+ self, node: parse_tree.Comparison
157
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
158
+ comparator = Transpiler._PYTHON_COMPARISON_MAP[node.op]
159
+
160
+ errors = []
161
+
162
+ left, error = self.transform(node.left)
163
+ if error is not None:
164
+ errors.append(error)
165
+
166
+ right, error = self.transform(node.right)
167
+ if error is not None:
168
+ errors.append(error)
169
+
170
+ if len(errors) > 0:
171
+ return None, Error(
172
+ node.original_node, "Failed to transpile the comparison", errors
173
+ )
174
+
175
+ no_parentheses_types = (
176
+ parse_tree.Member,
177
+ parse_tree.FunctionCall,
178
+ parse_tree.MethodCall,
179
+ parse_tree.Name,
180
+ parse_tree.Constant,
181
+ parse_tree.Index,
182
+ )
183
+
184
+ if isinstance(node.left, no_parentheses_types) and isinstance(
185
+ node.right, no_parentheses_types
186
+ ):
187
+ return Stripped(f"{left} {comparator} {right}"), None
188
+
189
+ return Stripped(f"({left}) {comparator} ({right})"), None
190
+
191
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
192
+ def transform_is_in(
193
+ self, node: parse_tree.IsIn
194
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
195
+ errors = []
196
+
197
+ member, error = self.transform(node.member)
198
+ if error is not None:
199
+ errors.append(error)
200
+
201
+ container, error = self.transform(node.container)
202
+ if error is not None:
203
+ errors.append(error)
204
+
205
+ if len(errors) > 0:
206
+ return None, Error(
207
+ node.original_node,
208
+ "Failed to transpile the membership relation",
209
+ errors,
210
+ )
211
+
212
+ assert member is not None
213
+ assert container is not None
214
+
215
+ no_parentheses_types = (
216
+ parse_tree.Member,
217
+ parse_tree.FunctionCall,
218
+ parse_tree.MethodCall,
219
+ parse_tree.Name,
220
+ parse_tree.Constant,
221
+ parse_tree.Index,
222
+ )
223
+
224
+ if not isinstance(node.container, no_parentheses_types):
225
+ container = Stripped(f"({container})")
226
+
227
+ if not isinstance(node.member, no_parentheses_types):
228
+ member = Stripped(f"({member})")
229
+
230
+ return Stripped(f"{member} in {container}"), None
231
+
232
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
233
+ def transform_implication(
234
+ self, node: parse_tree.Implication
235
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
236
+ errors = []
237
+
238
+ antecedent, error = self.transform(node.antecedent)
239
+ if error is not None:
240
+ errors.append(error)
241
+
242
+ consequent, error = self.transform(node.consequent)
243
+ if error is not None:
244
+ errors.append(error)
245
+
246
+ if len(errors) > 0:
247
+ return None, Error(
248
+ node.original_node, "Failed to transpile the implication", errors
249
+ )
250
+
251
+ assert antecedent is not None
252
+ assert consequent is not None
253
+
254
+ no_parentheses_types_in_this_context = (
255
+ parse_tree.Member,
256
+ parse_tree.FunctionCall,
257
+ parse_tree.MethodCall,
258
+ parse_tree.Name,
259
+ parse_tree.Index,
260
+ )
261
+
262
+ if isinstance(node.antecedent, no_parentheses_types_in_this_context):
263
+ not_antecedent = f"not {antecedent}"
264
+ else:
265
+ # NOTE (mristin, 2022-09-30):
266
+ # This is a very rudimentary heuristic for breaking the lines, and can be
267
+ # greatly improved by rendering into Python code. However, at this point, we
268
+ # lack time for more sophisticated reformatting approaches.
269
+ if "\n" in antecedent:
270
+ not_antecedent = f"""\
271
+ not (
272
+ {I}{indent_but_first_line(antecedent, I)}
273
+ )"""
274
+ else:
275
+ not_antecedent = f"not ({antecedent})"
276
+
277
+ if not isinstance(node.consequent, no_parentheses_types_in_this_context):
278
+ # NOTE (mristin, 2022-09-30):
279
+ # This is a very rudimentary heuristic for breaking the lines, and can be
280
+ # greatly improved by rendering into Python code. However, at this point, we
281
+ # lack time for more sophisticated reformatting approaches.
282
+ if "\n" in consequent:
283
+ consequent = Stripped(
284
+ f"""\
285
+ (
286
+ {I}{indent_but_first_line(consequent, I)}
287
+ )"""
288
+ )
289
+ else:
290
+ consequent = Stripped(f"({consequent})")
291
+
292
+ return Stripped(f"{not_antecedent}\nor {consequent}"), None
293
+
294
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
295
+ def transform_method_call(
296
+ self, node: parse_tree.MethodCall
297
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
298
+ errors = [] # type: List[Error]
299
+
300
+ instance, error = self.transform(node.member.instance)
301
+ if error is not None:
302
+ errors.append(error)
303
+
304
+ args = [] # type: List[Stripped]
305
+ for arg_node in node.args:
306
+ arg, error = self.transform(arg_node)
307
+ if error is not None:
308
+ errors.append(error)
309
+ continue
310
+
311
+ assert arg is not None
312
+
313
+ args.append(arg)
314
+
315
+ if len(errors) > 0:
316
+ return None, Error(
317
+ node.original_node, "Failed to transpile the method call", errors
318
+ )
319
+
320
+ assert instance is not None
321
+
322
+ no_parentheses_types_in_this_context = (
323
+ parse_tree.Member,
324
+ parse_tree.FunctionCall,
325
+ parse_tree.MethodCall,
326
+ parse_tree.Name,
327
+ parse_tree.Index,
328
+ )
329
+
330
+ if not isinstance(node.member.instance, no_parentheses_types_in_this_context):
331
+ instance = Stripped(f"({instance})")
332
+
333
+ method_name = python_naming.method_name(node.member.name)
334
+
335
+ joined_args = ", ".join(args)
336
+
337
+ # Apply heuristic for breaking the lines
338
+ if len(joined_args) > 50:
339
+ writer = io.StringIO()
340
+ writer.write(f"{instance}.{method_name}(\n")
341
+
342
+ for i, arg in enumerate(args):
343
+ writer.write(f"{I}{indent_but_first_line(arg, I)}")
344
+
345
+ if i == len(args) - 1:
346
+ writer.write(")")
347
+ else:
348
+ writer.write(",\n")
349
+
350
+ return Stripped(writer.getvalue()), None
351
+ else:
352
+ return Stripped(f"{instance}.{method_name}({joined_args})"), None
353
+
354
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
355
+ def transform_function_call(
356
+ self, node: parse_tree.FunctionCall
357
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
358
+ errors = [] # type: List[Error]
359
+
360
+ args = [] # type: List[Stripped]
361
+ for arg_node in node.args:
362
+ arg, error = self.transform(arg_node)
363
+ if error is not None:
364
+ errors.append(error)
365
+ continue
366
+
367
+ assert arg is not None
368
+
369
+ args.append(arg)
370
+
371
+ if len(errors) > 0:
372
+ return None, Error(
373
+ node.original_node, "Failed to transpile the function call", errors
374
+ )
375
+
376
+ # NOTE (mristin, 2022-09-30):
377
+ # The validity of the arguments is checked in
378
+ # :py:func:`aas_core_codegen.intermediate._translate.translate`, so we do not
379
+ # have to test for argument arity here.
380
+
381
+ func_type = self.type_map[node.name]
382
+
383
+ if not isinstance(
384
+ func_type, intermediate_type_inference.FunctionTypeAnnotationUnionAsTuple
385
+ ):
386
+ return None, Error(
387
+ node.name.original_node,
388
+ f"Expected the name to refer to a function, "
389
+ f"but its inferred type was {func_type}",
390
+ )
391
+
392
+ if isinstance(
393
+ func_type, intermediate_type_inference.VerificationTypeAnnotation
394
+ ):
395
+ function_name, error = self.transform_name(node.name)
396
+ if error is not None:
397
+ return None, error
398
+
399
+ assert function_name is not None
400
+
401
+ joined_args = ", ".join(args)
402
+
403
+ # Apply heuristic for breaking the lines
404
+ if len(function_name) + len(joined_args) > 50:
405
+ writer = io.StringIO()
406
+ writer.write(f"{function_name}(\n")
407
+
408
+ for i, arg in enumerate(args):
409
+ writer.write(f"{I}{indent_but_first_line(arg, I)}")
410
+
411
+ if i == len(args) - 1:
412
+ writer.write("\n)")
413
+ else:
414
+ writer.write(",\n")
415
+
416
+ return Stripped(writer.getvalue()), None
417
+ else:
418
+ return Stripped(f"{function_name}({joined_args})"), None
419
+
420
+ elif isinstance(
421
+ func_type, intermediate_type_inference.BuiltinFunctionTypeAnnotation
422
+ ):
423
+ if func_type.func.name == "len":
424
+ assert len(args) == 1, (
425
+ f"Expected exactly one argument, but got: {args}; "
426
+ f"this should have been caught before."
427
+ )
428
+
429
+ return Stripped(f"len({args[0]})"), None
430
+
431
+ else:
432
+ return None, Error(
433
+ node.original_node,
434
+ f"The handling of the built-in function {node.name!r} has not "
435
+ f"been implemented",
436
+ )
437
+ else:
438
+ assert_never(func_type)
439
+
440
+ raise AssertionError("Should not have gotten here")
441
+
442
+ def transform_constant(
443
+ self, node: parse_tree.Constant
444
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
445
+ if isinstance(node.value, bool):
446
+ return Stripped("True" if node.value else "False"), None
447
+ elif isinstance(node.value, (int, float)):
448
+ return Stripped(str(node.value)), None
449
+ elif isinstance(node.value, str):
450
+ return Stripped(python_common.string_literal(node.value)), None
451
+ elif isinstance(node.value, bytes):
452
+ literal, multiline = python_common.bytes_literal(node.value)
453
+
454
+ if not multiline:
455
+ return Stripped(literal), None
456
+ else:
457
+ return (
458
+ Stripped(
459
+ f"""\
460
+ (
461
+ {I}{indent_but_first_line(literal, I)}
462
+ )"""
463
+ ),
464
+ None,
465
+ )
466
+ else:
467
+ assert_never(node.value)
468
+
469
+ raise AssertionError("Should not have gotten here")
470
+
471
+ def transform_is_none(
472
+ self, node: parse_tree.IsNone
473
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
474
+ value, error = self.transform(node.value)
475
+ if error is not None:
476
+ return None, error
477
+
478
+ no_parentheses_types = (
479
+ parse_tree.Name,
480
+ parse_tree.Member,
481
+ parse_tree.MethodCall,
482
+ parse_tree.FunctionCall,
483
+ parse_tree.Index,
484
+ )
485
+ if isinstance(node.value, no_parentheses_types):
486
+ return Stripped(f"{value} is None"), None
487
+ else:
488
+ return Stripped(f"({value}) is None"), None
489
+
490
+ def transform_is_not_none(
491
+ self, node: parse_tree.IsNotNone
492
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
493
+ value, error = self.transform(node.value)
494
+ if error is not None:
495
+ return None, error
496
+
497
+ no_parentheses_types_in_this_context = (
498
+ parse_tree.Name,
499
+ parse_tree.Member,
500
+ parse_tree.MethodCall,
501
+ parse_tree.FunctionCall,
502
+ parse_tree.Index,
503
+ )
504
+ if isinstance(node.value, no_parentheses_types_in_this_context):
505
+ return Stripped(f"{value} is not None"), None
506
+ else:
507
+ return Stripped(f"({value}) is not None"), None
508
+
509
+ @abc.abstractmethod
510
+ def transform_name(
511
+ self, node: parse_tree.Name
512
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
513
+ raise NotImplementedError()
514
+
515
+ def transform_not(
516
+ self, node: parse_tree.Not
517
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
518
+ operand, error = self.transform(node.operand)
519
+ if error is not None:
520
+ return None, error
521
+
522
+ no_parentheses_types_in_this_context = (
523
+ parse_tree.Name,
524
+ parse_tree.Member,
525
+ parse_tree.MethodCall,
526
+ parse_tree.FunctionCall,
527
+ parse_tree.Index,
528
+ )
529
+ if not isinstance(node.operand, no_parentheses_types_in_this_context):
530
+ return Stripped(f"not ({operand})"), None
531
+ else:
532
+ return Stripped(f"not {operand}"), None
533
+
534
+ def _transform_and_or_or(
535
+ self, node: Union[parse_tree.And, parse_tree.Or]
536
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
537
+ errors = [] # type: List[Error]
538
+ values = [] # type: List[Stripped]
539
+
540
+ for value_node in node.values:
541
+ value, error = self.transform(value_node)
542
+ if error is not None:
543
+ errors.append(error)
544
+ continue
545
+
546
+ assert value is not None
547
+
548
+ no_parentheses_types_in_this_context = (
549
+ parse_tree.Member,
550
+ parse_tree.MethodCall,
551
+ parse_tree.FunctionCall,
552
+ parse_tree.Name,
553
+ parse_tree.Index,
554
+ parse_tree.Comparison,
555
+ )
556
+
557
+ if not isinstance(value_node, no_parentheses_types_in_this_context):
558
+ # NOTE (mristin, 2022-09-30):
559
+ # This is a very rudimentary heuristic for breaking the lines, and can
560
+ # be greatly improved by rendering into Python code. However, at this
561
+ # point, we lack time for more sophisticated reformatting approaches.
562
+ if "\n" in value:
563
+ value = Stripped(
564
+ f"""\
565
+ (
566
+ {I}{indent_but_first_line(value, I)}
567
+ )"""
568
+ )
569
+ else:
570
+ value = Stripped(f"({value})")
571
+
572
+ values.append(value)
573
+
574
+ if len(errors) > 0:
575
+ if isinstance(node, parse_tree.And):
576
+ return None, Error(
577
+ node.original_node, "Failed to transpile the conjunction", errors
578
+ )
579
+ elif isinstance(node, parse_tree.Or):
580
+ return None, Error(
581
+ node.original_node, "Failed to transpile the disjunction", errors
582
+ )
583
+ else:
584
+ assert_never(node)
585
+
586
+ assert len(values) >= 1
587
+ if len(values) == 1:
588
+ return Stripped(values[0]), None
589
+
590
+ writer = io.StringIO()
591
+ writer.write("(\n")
592
+ for i, value in enumerate(values):
593
+ if i == 0:
594
+ writer.write(f"{I}{value}\n")
595
+ else:
596
+ if isinstance(node, parse_tree.And):
597
+ writer.write(f"{I}and {indent_but_first_line(value, I)}\n")
598
+ elif isinstance(node, parse_tree.Or):
599
+ writer.write(f"{I}or {indent_but_first_line(value, I)}\n")
600
+ else:
601
+ assert_never(node)
602
+
603
+ writer.write(")")
604
+
605
+ return Stripped(writer.getvalue()), None
606
+
607
+ def transform_and(
608
+ self, node: parse_tree.And
609
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
610
+ return self._transform_and_or_or(node)
611
+
612
+ def transform_or(
613
+ self, node: parse_tree.Or
614
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
615
+ return self._transform_and_or_or(node)
616
+
617
+ def _transform_add_or_sub(
618
+ self, node: Union[parse_tree.Add, parse_tree.Sub]
619
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
620
+ errors = [] # type: List[Error]
621
+
622
+ left, error = self.transform(node.left)
623
+ if error is not None:
624
+ errors.append(error)
625
+
626
+ right, error = self.transform(node.right)
627
+ if error is not None:
628
+ errors.append(error)
629
+
630
+ if len(errors) > 0:
631
+ operation_name: str
632
+ if isinstance(node, parse_tree.Add):
633
+ operation_name = "the addition"
634
+ elif isinstance(node, parse_tree.Sub):
635
+ operation_name = "the subtraction"
636
+ else:
637
+ assert_never(node)
638
+
639
+ return None, Error(
640
+ node.original_node, f"Failed to transpile {operation_name}", errors
641
+ )
642
+
643
+ no_parentheses_types_in_this_context = (
644
+ parse_tree.Member,
645
+ parse_tree.MethodCall,
646
+ parse_tree.FunctionCall,
647
+ parse_tree.Constant,
648
+ parse_tree.Name,
649
+ parse_tree.Index,
650
+ )
651
+
652
+ if not isinstance(node.left, no_parentheses_types_in_this_context):
653
+ left = Stripped(f"({left})")
654
+
655
+ if not isinstance(node.right, no_parentheses_types_in_this_context):
656
+ right = Stripped(f"({right})")
657
+
658
+ if isinstance(node, parse_tree.Add):
659
+ return Stripped(f"{left} + {right}"), None
660
+ elif isinstance(node, parse_tree.Sub):
661
+ return Stripped(f"{left} - {right}"), None
662
+ else:
663
+ assert_never(node)
664
+
665
+ def transform_add(
666
+ self, node: parse_tree.Add
667
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
668
+ return self._transform_add_or_sub(node)
669
+
670
+ def transform_sub(
671
+ self, node: parse_tree.Sub
672
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
673
+ return self._transform_add_or_sub(node)
674
+
675
+ def transform_joined_str(
676
+ self, node: parse_tree.JoinedStr
677
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
678
+ # If we do not need interpolation, simply return the string literals
679
+ # joined together by newlines.
680
+ needs_interpolation = any(
681
+ isinstance(value, parse_tree.FormattedValue) for value in node.values
682
+ )
683
+ if not needs_interpolation:
684
+ return (
685
+ Stripped(
686
+ python_common.string_literal(
687
+ "".join(value for value in node.values) # type: ignore
688
+ )
689
+ ),
690
+ None,
691
+ )
692
+
693
+ parts = [] # type: List[str]
694
+
695
+ # NOTE (mristin, 2022-09-30):
696
+ # See which quotes occur more often in the non-interpolated parts, so that we
697
+ # pick the escaping scheme which will result in as little escapes as possible.
698
+ double_quotes_count = 0
699
+ single_quotes_count = 0
700
+
701
+ for value in node.values:
702
+ if isinstance(value, str):
703
+ double_quotes_count += value.count('"')
704
+ single_quotes_count += value.count("'")
705
+
706
+ elif isinstance(value, parse_tree.FormattedValue):
707
+ pass
708
+ else:
709
+ assert_never(value)
710
+
711
+ # Pick the escaping scheme
712
+ if single_quotes_count <= double_quotes_count:
713
+ enclosing = "'"
714
+ quoting = python_common.StringQuoting.SINGLE_QUOTES
715
+ else:
716
+ enclosing = '"'
717
+ quoting = python_common.StringQuoting.DOUBLE_QUOTES
718
+
719
+ for value in node.values:
720
+ if isinstance(value, str):
721
+ parts.append(
722
+ python_common.string_literal(
723
+ value,
724
+ quoting=quoting,
725
+ without_enclosing=True,
726
+ duplicate_curly_brackets=True,
727
+ )
728
+ )
729
+
730
+ elif isinstance(value, parse_tree.FormattedValue):
731
+ code, error = self.transform(value.value)
732
+ if error is not None:
733
+ return None, error
734
+
735
+ assert code is not None
736
+
737
+ assert (
738
+ "\n" not in code
739
+ ), f"New-lines are not expected in formatted values, but got: {code}"
740
+
741
+ parts.append(f"{{{code}}}")
742
+ else:
743
+ assert_never(value)
744
+
745
+ writer = io.StringIO()
746
+ writer.write("f")
747
+ writer.write(enclosing)
748
+ for part in parts:
749
+ writer.write(part)
750
+ writer.write(enclosing)
751
+
752
+ return Stripped(writer.getvalue()), None
753
+
754
+ def _transform_any_or_all(
755
+ self, node: Union[parse_tree.Any, parse_tree.All]
756
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
757
+ errors = [] # type: List[Error]
758
+
759
+ iteration = None # type: Optional[Stripped]
760
+ start = None # type: Optional[Stripped]
761
+ end = None # type: Optional[Stripped]
762
+
763
+ if isinstance(node.generator, parse_tree.ForEach):
764
+ iteration, error = self.transform(node.generator.iteration)
765
+ if error is not None:
766
+ errors.append(error)
767
+ elif isinstance(node.generator, parse_tree.ForRange):
768
+ start, error = self.transform(node.generator.start)
769
+ if error is not None:
770
+ errors.append(error)
771
+
772
+ end, error = self.transform(node.generator.end)
773
+ if error is not None:
774
+ errors.append(error)
775
+
776
+ else:
777
+ assert_never(node.generator)
778
+
779
+ if len(errors) > 0:
780
+ return None, Error(
781
+ node.original_node,
782
+ "Failed to transpile the generator expression",
783
+ errors,
784
+ )
785
+
786
+ assert (iteration is not None) ^ (start is not None and end is not None)
787
+
788
+ variable_name = node.generator.variable.identifier
789
+ variable_type = self.type_map[node.generator.variable]
790
+
791
+ try:
792
+ self._environment.set(
793
+ identifier=variable_name, type_annotation=variable_type
794
+ )
795
+ self._variable_name_set.add(variable_name)
796
+
797
+ condition, error = self.transform(node.condition)
798
+ if error is not None:
799
+ errors.append(error)
800
+
801
+ variable, error = self.transform(node.generator.variable)
802
+ if error is not None:
803
+ errors.append(error)
804
+
805
+ finally:
806
+ self._variable_name_set.remove(variable_name)
807
+ self._environment.remove(variable_name)
808
+
809
+ if len(errors) > 0:
810
+ return None, Error(
811
+ node.original_node,
812
+ "Failed to transpile the generator expression",
813
+ errors,
814
+ )
815
+
816
+ assert variable is not None
817
+ assert condition is not None
818
+
819
+ qualifier_function: str
820
+ if isinstance(node, parse_tree.Any):
821
+ qualifier_function = "any"
822
+ elif isinstance(node, parse_tree.All):
823
+ qualifier_function = "all"
824
+ else:
825
+ assert_never(node)
826
+
827
+ source: Stripped
828
+ if isinstance(node.generator, parse_tree.ForEach):
829
+ no_parentheses_types_in_this_context = (
830
+ parse_tree.Member,
831
+ parse_tree.MethodCall,
832
+ parse_tree.FunctionCall,
833
+ parse_tree.Name,
834
+ parse_tree.Index,
835
+ )
836
+
837
+ if not isinstance(
838
+ node.generator.iteration, no_parentheses_types_in_this_context
839
+ ):
840
+ source = Stripped(f"({iteration})")
841
+ else:
842
+ assert iteration is not None
843
+ source = iteration
844
+ elif isinstance(node.generator, parse_tree.ForRange):
845
+ assert start is not None
846
+ assert end is not None
847
+
848
+ source = Stripped(
849
+ f"""\
850
+ range(
851
+ {I}{indent_but_first_line(start, I)},
852
+ {I}{indent_but_first_line(end, I)}
853
+ )"""
854
+ )
855
+
856
+ else:
857
+ assert_never(node.generator)
858
+
859
+ return (
860
+ Stripped(
861
+ f"""\
862
+ {qualifier_function}(
863
+ {I}{indent_but_first_line(condition, I)}
864
+ {I}for {variable} in {indent_but_first_line(source, I)}
865
+ )"""
866
+ ),
867
+ None,
868
+ )
869
+
870
+ def transform_any(
871
+ self, node: parse_tree.Any
872
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
873
+ return self._transform_any_or_all(node)
874
+
875
+ def transform_all(
876
+ self, node: parse_tree.All
877
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
878
+ return self._transform_any_or_all(node)
879
+
880
+ def transform_assignment(
881
+ self, node: parse_tree.Assignment
882
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
883
+ errors = [] # type: List[Error]
884
+
885
+ value, error = self.transform(node.value)
886
+ if error is not None:
887
+ errors.append(error)
888
+
889
+ if isinstance(node.target, parse_tree.Name):
890
+ type_anno = self._environment.find(identifier=node.target.identifier)
891
+ if type_anno is None:
892
+ # NOTE (mristin, 2022-09-30):
893
+ # This is a variable definition as we did not specify the identifier
894
+ # in the environment.
895
+
896
+ type_anno = self.type_map[node.value]
897
+ self._variable_name_set.add(node.target.identifier)
898
+ self._environment.set(
899
+ identifier=node.target.identifier, type_annotation=type_anno
900
+ )
901
+
902
+ target, error = self.transform(node=node.target)
903
+ if error is not None:
904
+ errors.append(error)
905
+
906
+ if len(errors) > 0:
907
+ return None, Error(
908
+ node.original_node, "Failed to transpile the assignment", errors
909
+ )
910
+
911
+ assert target is not None
912
+ assert value is not None
913
+
914
+ # NOTE (mristin, 2022-09-30):
915
+ # This is a rudimentary heuristic for basic line breaks, but works well in
916
+ # practice.
917
+ if "\n" in value or len(value) > 50:
918
+ return (
919
+ Stripped(
920
+ f"""\
921
+ {target} = (
922
+ {I}{indent_but_first_line(value, I)})"""
923
+ ),
924
+ None,
925
+ )
926
+
927
+ return Stripped(f"{target} = {value}"), None
928
+
929
+ def transform_return(
930
+ self, node: parse_tree.Return
931
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
932
+ if node.value is None:
933
+ return Stripped("return"), None
934
+
935
+ value, error = self.transform(node.value)
936
+ if error is not None:
937
+ return None, error
938
+
939
+ assert value is not None
940
+
941
+ # NOTE (mristin, 2022-09-30):
942
+ # This is a rudimentary heuristic for basic line breaks, but works well in
943
+ # practice.
944
+ if "\n" in value or len(value) > 50:
945
+ return (
946
+ Stripped(
947
+ f"""\
948
+ return (
949
+ {I}{indent_but_first_line(value, I)})"""
950
+ ),
951
+ None,
952
+ )
953
+
954
+ return Stripped(f"return {value}"), None
955
+
956
+
957
+ # noinspection PyProtectedMember,PyProtectedMember
958
+ assert all(op in Transpiler._PYTHON_COMPARISON_MAP for op in parse_tree.Comparator)