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