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