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,1303 @@
1
+ """Provide our own abstract syntax tree for contract transpilation."""
2
+ import abc
3
+ import ast
4
+ import enum
5
+ from typing import Sequence, Union, Generic, TypeVar, List, Optional, Iterator
6
+
7
+ from icontract import DBC
8
+
9
+ from aas_core_codegen import stringify
10
+ from aas_core_codegen.common import Identifier, assert_never
11
+
12
+ T = TypeVar("T")
13
+
14
+
15
+ class Node(abc.ABC):
16
+ """Represent an abstract node of our syntax tree."""
17
+
18
+ def __init__(self, original_node: ast.AST) -> None:
19
+ """Initialize with the given values."""
20
+ self.original_node = original_node
21
+
22
+ @abc.abstractmethod
23
+ def transform(self, transformer: "Transformer[T]") -> T:
24
+ """Accept the transformer."""
25
+ raise NotImplementedError()
26
+
27
+ @abc.abstractmethod
28
+ def visit(self, visitor: "Visitor") -> None:
29
+ """Accept the transformer."""
30
+ raise NotImplementedError()
31
+
32
+ def __str__(self) -> str:
33
+ """Provide a human-readable representation of the instance."""
34
+ return dump(self)
35
+
36
+
37
+ class Statement(Node):
38
+ """Represent a statement in a program."""
39
+
40
+ @abc.abstractmethod
41
+ def transform(self, transformer: "Transformer[T]") -> T:
42
+ """Accept the transformer."""
43
+ raise NotImplementedError()
44
+
45
+ @abc.abstractmethod
46
+ def visit(self, visitor: "Visitor") -> None:
47
+ """Accept the transformer."""
48
+ raise NotImplementedError()
49
+
50
+
51
+ class Expression(Node):
52
+ """Represent an expression in our abstract syntax tree."""
53
+
54
+ @abc.abstractmethod
55
+ def transform(self, transformer: "Transformer[T]") -> T:
56
+ """Accept the transformer."""
57
+ raise NotImplementedError()
58
+
59
+ @abc.abstractmethod
60
+ def visit(self, visitor: "Visitor") -> None:
61
+ """Accept the transformer."""
62
+ raise NotImplementedError()
63
+
64
+
65
+ class Member(Expression):
66
+ """
67
+ Represent a member of an instance.
68
+
69
+ A member is either a property or a method.
70
+ """
71
+
72
+ def __init__(
73
+ self, instance: "Expression", name: Identifier, original_node: ast.AST
74
+ ) -> None:
75
+ """Initialize with the given values."""
76
+ Expression.__init__(self, original_node=original_node)
77
+ self.instance = instance
78
+ self.name = name
79
+
80
+ def transform(self, transformer: "Transformer[T]") -> T:
81
+ """Accept the transformer."""
82
+ return transformer.transform_member(self)
83
+
84
+ def visit(self, visitor: "Visitor") -> None:
85
+ """Accept the visitor."""
86
+ visitor.visit_member(self)
87
+
88
+
89
+ class Index(Expression):
90
+ """Represent an index access on a collection."""
91
+
92
+ def __init__(
93
+ self, collection: "Expression", index: "Expression", original_node: ast.AST
94
+ ) -> None:
95
+ """Initialize with the given values."""
96
+ Expression.__init__(self, original_node=original_node)
97
+ self.collection = collection
98
+ self.index = index
99
+
100
+ def transform(self, transformer: "Transformer[T]") -> T:
101
+ """Accept the transformer."""
102
+ return transformer.transform_index(self)
103
+
104
+ def visit(self, visitor: "Visitor") -> None:
105
+ """Accept the visitor."""
106
+ visitor.visit_index(self)
107
+
108
+
109
+ class Comparator(enum.Enum):
110
+ """List comparison operands."""
111
+
112
+ LT = "LT"
113
+ LE = "LE"
114
+ GT = "GT"
115
+ GE = "GE"
116
+ EQ = "EQ"
117
+ NE = "NE"
118
+
119
+
120
+ class Comparison(Expression):
121
+ """Represent a comparison operation."""
122
+
123
+ def __init__(
124
+ self,
125
+ left: "Expression",
126
+ op: Comparator,
127
+ right: "Expression",
128
+ original_node: ast.AST,
129
+ ) -> None:
130
+ Expression.__init__(self, original_node=original_node)
131
+ self.left = left
132
+ self.op = op
133
+ self.right = right
134
+
135
+ def transform(self, transformer: "Transformer[T]") -> T:
136
+ """Accept the transformer."""
137
+ return transformer.transform_comparison(self)
138
+
139
+ def visit(self, visitor: "Visitor") -> None:
140
+ """Accept the visitor."""
141
+ visitor.visit_comparison(self)
142
+
143
+
144
+ class IsIn(Expression):
145
+ """Represent the membership ``x in A``."""
146
+
147
+ def __init__(
148
+ self, member: "Expression", container: "Expression", original_node: ast.AST
149
+ ) -> None:
150
+ """Initialize with the given values."""
151
+ Expression.__init__(self, original_node=original_node)
152
+ self.member = member
153
+ self.container = container
154
+
155
+ def transform(self, transformer: "Transformer[T]") -> T:
156
+ """Accept the transformer."""
157
+ return transformer.transform_is_in(self)
158
+
159
+ def visit(self, visitor: "Visitor") -> None:
160
+ """Accept the visitor."""
161
+ visitor.visit_is_in(self)
162
+
163
+
164
+ class Implication(Expression):
165
+ """Represent an implication of the form ``A => B``."""
166
+
167
+ def __init__(
168
+ self, antecedent: "Expression", consequent: "Expression", original_node: ast.AST
169
+ ) -> None:
170
+ """Initialize with the given values."""
171
+ Expression.__init__(self, original_node=original_node)
172
+ self.antecedent = antecedent
173
+ self.consequent = consequent
174
+
175
+ def transform(self, transformer: "Transformer[T]") -> T:
176
+ """Accept the transformer."""
177
+ return transformer.transform_implication(self)
178
+
179
+ def visit(self, visitor: "Visitor") -> None:
180
+ """Accept the visitor."""
181
+ visitor.visit_implication(self)
182
+
183
+
184
+ class MethodCall(Expression):
185
+ """Represent a method call."""
186
+
187
+ def __init__(
188
+ self, member: Member, args: Sequence["Expression"], original_node: ast.AST
189
+ ) -> None:
190
+ """Initialize with the given values."""
191
+ Expression.__init__(self, original_node=original_node)
192
+ self.member = member
193
+ self.args = args
194
+
195
+ def transform(self, transformer: "Transformer[T]") -> T:
196
+ """Accept the transformer."""
197
+ return transformer.transform_method_call(self)
198
+
199
+ def visit(self, visitor: "Visitor") -> None:
200
+ """Accept the visitor."""
201
+ visitor.visit_method_call(self)
202
+
203
+
204
+ class Name(Expression):
205
+ """Represent access to a variable with the given name."""
206
+
207
+ def __init__(self, identifier: Identifier, original_node: ast.AST) -> None:
208
+ """Initialize with the given values."""
209
+ Expression.__init__(self, original_node=original_node)
210
+ self.identifier = identifier
211
+
212
+ def transform(self, transformer: "Transformer[T]") -> T:
213
+ """Accept the transformer."""
214
+ return transformer.transform_name(self)
215
+
216
+ def visit(self, visitor: "Visitor") -> None:
217
+ """Accept the visitor."""
218
+ visitor.visit_name(self)
219
+
220
+
221
+ class FunctionCall(Expression):
222
+ """Represent a function call."""
223
+
224
+ def __init__(
225
+ self, name: Name, args: Sequence["Expression"], original_node: ast.AST
226
+ ) -> None:
227
+ """Initialize with the given values."""
228
+ Expression.__init__(self, original_node=original_node)
229
+ self.name = name
230
+ self.args = args
231
+
232
+ def transform(self, transformer: "Transformer[T]") -> T:
233
+ """Accept the transformer."""
234
+ return transformer.transform_function_call(self)
235
+
236
+ def visit(self, visitor: "Visitor") -> None:
237
+ """Accept the visitor."""
238
+ visitor.visit_function_call(self)
239
+
240
+
241
+ class Constant(Expression):
242
+ """Represent a constant value."""
243
+
244
+ def __init__(
245
+ self, value: Union[bool, int, float, str], original_node: ast.AST
246
+ ) -> None:
247
+ """Initialize with the given values."""
248
+ Expression.__init__(self, original_node=original_node)
249
+ self.value = value
250
+
251
+ def transform(self, transformer: "Transformer[T]") -> T:
252
+ """Accept the transformer."""
253
+ return transformer.transform_constant(self)
254
+
255
+ def visit(self, visitor: "Visitor") -> None:
256
+ """Accept the visitor."""
257
+ visitor.visit_constant(self)
258
+
259
+
260
+ class IsNone(Expression):
261
+ """Represent a check whether something ``is None``."""
262
+
263
+ def __init__(self, value: Expression, original_node: ast.AST) -> None:
264
+ """Initialize with the given values."""
265
+ Expression.__init__(self, original_node=original_node)
266
+ self.value = value
267
+
268
+ def transform(self, transformer: "Transformer[T]") -> T:
269
+ """Accept the transformer."""
270
+ return transformer.transform_is_none(self)
271
+
272
+ def visit(self, visitor: "Visitor") -> None:
273
+ """Accept the visitor."""
274
+ visitor.visit_is_none(self)
275
+
276
+
277
+ class IsNotNone(Expression):
278
+ """Represent a check whether something ``is not None``."""
279
+
280
+ def __init__(self, value: Expression, original_node: ast.AST) -> None:
281
+ """Initialize with the given values."""
282
+ Expression.__init__(self, original_node=original_node)
283
+ self.value = value
284
+
285
+ def transform(self, transformer: "Transformer[T]") -> T:
286
+ """Accept the transformer."""
287
+ return transformer.transform_is_not_none(self)
288
+
289
+ def visit(self, visitor: "Visitor") -> None:
290
+ """Accept the visitor."""
291
+ visitor.visit_is_not_none(self)
292
+
293
+
294
+ class Not(Expression):
295
+ """Represent a negation."""
296
+
297
+ def __init__(self, operand: Expression, original_node: ast.AST) -> None:
298
+ """Initialize with the given values."""
299
+ Expression.__init__(self, original_node=original_node)
300
+ self.operand = operand
301
+
302
+ def transform(self, transformer: "Transformer[T]") -> T:
303
+ """Accept the transformer."""
304
+ return transformer.transform_not(self)
305
+
306
+ def visit(self, visitor: "Visitor") -> None:
307
+ """Accept the visitor."""
308
+ visitor.visit_not(self)
309
+
310
+
311
+ class And(Expression):
312
+ """Represent a conjunction."""
313
+
314
+ def __init__(self, values: Sequence[Expression], original_node: ast.AST) -> None:
315
+ Expression.__init__(self, original_node=original_node)
316
+ self.values = values
317
+
318
+ def transform(self, transformer: "Transformer[T]") -> T:
319
+ """Accept the transformer."""
320
+ return transformer.transform_and(self)
321
+
322
+ def visit(self, visitor: "Visitor") -> None:
323
+ """Accept the visitor."""
324
+ visitor.visit_and(self)
325
+
326
+
327
+ class Or(Expression):
328
+ """Represent a disjunction."""
329
+
330
+ def __init__(self, values: Sequence[Expression], original_node: ast.AST) -> None:
331
+ Expression.__init__(self, original_node=original_node)
332
+ self.values = values
333
+
334
+ def transform(self, transformer: "Transformer[T]") -> T:
335
+ """Accept the transformer."""
336
+ return transformer.transform_or(self)
337
+
338
+ def visit(self, visitor: "Visitor") -> None:
339
+ """Accept the visitor."""
340
+ visitor.visit_or(self)
341
+
342
+
343
+ class Add(Expression):
344
+ """Represent an addition."""
345
+
346
+ def __init__(
347
+ self, left: Expression, right: Expression, original_node: ast.AST
348
+ ) -> None:
349
+ Expression.__init__(self, original_node=original_node)
350
+ self.left = left
351
+ self.right = right
352
+
353
+ def transform(self, transformer: "Transformer[T]") -> T:
354
+ """Accept the transformer."""
355
+ return transformer.transform_add(self)
356
+
357
+ def visit(self, visitor: "Visitor") -> None:
358
+ """Accept the visitor."""
359
+ visitor.visit_add(self)
360
+
361
+
362
+ class Sub(Expression):
363
+ """Represent a subtraction."""
364
+
365
+ def __init__(
366
+ self, left: Expression, right: Expression, original_node: ast.AST
367
+ ) -> None:
368
+ Expression.__init__(self, original_node=original_node)
369
+ self.left = left
370
+ self.right = right
371
+
372
+ def transform(self, transformer: "Transformer[T]") -> T:
373
+ """Accept the transformer."""
374
+ return transformer.transform_sub(self)
375
+
376
+ def visit(self, visitor: "Visitor") -> None:
377
+ """Accept the visitor."""
378
+ visitor.visit_sub(self)
379
+
380
+
381
+ class FormattedValue(Node):
382
+ """Represent a formatted value in a :py:class`JoinedStr`."""
383
+
384
+ def __init__(self, value: Expression, original_node: ast.AST) -> None:
385
+ """Initialize with the given values."""
386
+ Node.__init__(self, original_node=original_node)
387
+
388
+ self.value = value
389
+
390
+ def transform(self, transformer: "Transformer[T]") -> T:
391
+ """Accept the transformer."""
392
+ return transformer.transform_formatted_value(self)
393
+
394
+ def visit(self, visitor: "Visitor") -> None:
395
+ """Accept the visitor."""
396
+ visitor.visit_formatted_value(self)
397
+
398
+
399
+ class JoinedStr(Expression):
400
+ """Represent a string interpolation."""
401
+
402
+ def __init__(
403
+ self, values: Sequence[Union[str, FormattedValue]], original_node: ast.AST
404
+ ) -> None:
405
+ """Initialize with the given values."""
406
+ Expression.__init__(self, original_node=original_node)
407
+
408
+ self.values = values
409
+
410
+ def transform(self, transformer: "Transformer[T]") -> T:
411
+ """Accept the transformer."""
412
+ return transformer.transform_joined_str(self)
413
+
414
+ def visit(self, visitor: "Visitor") -> None:
415
+ """Accept the visitor."""
416
+ visitor.visit_joined_str(self)
417
+
418
+
419
+ class ForEach(Node):
420
+ """Structure the information about the iteration over a collection."""
421
+
422
+ def __init__(
423
+ self, variable: Name, iteration: Expression, original_node: ast.AST
424
+ ) -> None:
425
+ """Initialize with the given values."""
426
+ Node.__init__(self, original_node=original_node)
427
+ self.variable = variable
428
+ self.iteration = iteration
429
+
430
+ def transform(self, transformer: "Transformer[T]") -> T:
431
+ """Accept the transformer."""
432
+ return transformer.transform_for_each(self)
433
+
434
+ def visit(self, visitor: "Visitor") -> None:
435
+ """Accept the visitor."""
436
+ visitor.visit_for_each(self)
437
+
438
+
439
+ class ForRange(Node):
440
+ """Structure the information about the iteration over a range of integers."""
441
+
442
+ def __init__(
443
+ self, variable: Name, start: Expression, end: Expression, original_node: ast.AST
444
+ ) -> None:
445
+ """Initialize with the given values."""
446
+ Node.__init__(self, original_node=original_node)
447
+ self.variable = variable
448
+ self.start = start
449
+ self.end = end
450
+
451
+ def transform(self, transformer: "Transformer[T]") -> T:
452
+ """Accept the transformer."""
453
+ return transformer.transform_for_range(self)
454
+
455
+ def visit(self, visitor: "Visitor") -> None:
456
+ """Accept the visitor."""
457
+ visitor.visit_for_range(self)
458
+
459
+
460
+ ForUnion = Union[ForEach, ForRange]
461
+
462
+
463
+ class Any(Expression):
464
+ """Represent an ``any(...)`` expression."""
465
+
466
+ def __init__(
467
+ self, generator: ForUnion, condition: Expression, original_node: ast.AST
468
+ ) -> None:
469
+ """Initialize with the given values."""
470
+ Expression.__init__(self, original_node=original_node)
471
+ self.generator = generator
472
+ self.condition = condition
473
+
474
+ def transform(self, transformer: "Transformer[T]") -> T:
475
+ """Accept the transformer."""
476
+ return transformer.transform_any(self)
477
+
478
+ def visit(self, visitor: "Visitor") -> None:
479
+ """Accept the visitor."""
480
+ visitor.visit_any(self)
481
+
482
+
483
+ class All(Expression):
484
+ """Represent an ``all(...)`` expression."""
485
+
486
+ def __init__(
487
+ self, generator: ForUnion, condition: Expression, original_node: ast.AST
488
+ ) -> None:
489
+ """Initialize with the given values."""
490
+ Expression.__init__(self, original_node=original_node)
491
+ self.generator = generator
492
+ self.condition = condition
493
+
494
+ def transform(self, transformer: "Transformer[T]") -> T:
495
+ """Accept the transformer."""
496
+ return transformer.transform_all(self)
497
+
498
+ def visit(self, visitor: "Visitor") -> None:
499
+ """Accept the visitor."""
500
+ visitor.visit_all(self)
501
+
502
+
503
+ class Assignment(Statement):
504
+ """Represent an assignment of a single value to a single target."""
505
+
506
+ def __init__(
507
+ self, target: Expression, value: Expression, original_node: ast.AST
508
+ ) -> None:
509
+ """Initialize with the given values."""
510
+ Statement.__init__(self, original_node=original_node)
511
+ self.target = target
512
+ self.value = value
513
+
514
+ def transform(self, transformer: "Transformer[T]") -> T:
515
+ """Accept the transformer."""
516
+ return transformer.transform_assignment(self)
517
+
518
+ def visit(self, visitor: "Visitor") -> None:
519
+ """Accept the visitor."""
520
+ visitor.visit_assignment(self)
521
+
522
+
523
+ class Return(Statement):
524
+ """Represent a return statement with a single return value."""
525
+
526
+ def __init__(self, value: Optional[Expression], original_node: ast.AST) -> None:
527
+ """Initialize with the given values."""
528
+ Statement.__init__(self, original_node=original_node)
529
+ self.value = value
530
+
531
+ def transform(self, transformer: "Transformer[T]") -> T:
532
+ """Accept the transformer."""
533
+ return transformer.transform_return(self)
534
+
535
+ def visit(self, visitor: "Visitor") -> None:
536
+ """Accept the visitor."""
537
+ visitor.visit_return(self)
538
+
539
+
540
+ class Visitor(DBC):
541
+ """
542
+ Visit all the nodes in the AST.
543
+
544
+ The default action for the generic visitor is to descend recursively into all the
545
+ children nodes.
546
+ """
547
+
548
+ def visit(self, node: Node) -> None:
549
+ """Dispatch to the appropriate visitation method."""
550
+ node.visit(self)
551
+
552
+ def visit_member(self, node: Member) -> None:
553
+ """Visit a member."""
554
+ self.visit(node.instance)
555
+
556
+ def visit_index(self, node: Index) -> None:
557
+ """Visit an index access."""
558
+ self.visit(node.collection)
559
+ self.visit(node.index)
560
+
561
+ def visit_comparison(self, node: Comparison) -> None:
562
+ """Visit a comparison."""
563
+ self.visit(node.left)
564
+ self.visit(node.right)
565
+
566
+ def visit_is_in(self, node: IsIn) -> None:
567
+ """Visit a membership relation."""
568
+ self.visit(node.member)
569
+ self.visit(node.container)
570
+
571
+ def visit_implication(self, node: Implication) -> None:
572
+ """Visit an implication."""
573
+ self.visit(node.antecedent)
574
+ self.visit(node.consequent)
575
+
576
+ def visit_method_call(self, node: MethodCall) -> None:
577
+ """Visit a method call."""
578
+ self.visit(node.member)
579
+ for arg in node.args:
580
+ self.visit(arg)
581
+
582
+ def visit_function_call(self, node: FunctionCall) -> None:
583
+ """Visit a function call."""
584
+ for arg in node.args:
585
+ self.visit(arg)
586
+
587
+ def visit_constant(self, node: Constant) -> None:
588
+ """Visit a constant."""
589
+ pass
590
+
591
+ def visit_is_none(self, node: IsNone) -> None:
592
+ """Visit an is-none check."""
593
+ self.visit(node.value)
594
+
595
+ def visit_is_not_none(self, node: IsNotNone) -> None:
596
+ """Visit an is-not-none check."""
597
+ self.visit(node.value)
598
+
599
+ def visit_name(self, node: Name) -> None:
600
+ """Visit a variable access."""
601
+ pass
602
+
603
+ def visit_not(self, node: Not) -> None:
604
+ """Visit a negation."""
605
+ self.visit(node.operand)
606
+
607
+ def visit_and(self, node: And) -> None:
608
+ """Visit a conjunction."""
609
+ for value in node.values:
610
+ self.visit(value)
611
+
612
+ def visit_or(self, node: Or) -> None:
613
+ """Visit a disjunction."""
614
+ for value in node.values:
615
+ self.visit(value)
616
+
617
+ def visit_add(self, node: Add) -> None:
618
+ """Visit an addition."""
619
+ self.visit(node.left)
620
+ self.visit(node.right)
621
+
622
+ def visit_sub(self, node: Sub) -> None:
623
+ """Visit a subtraction."""
624
+ self.visit(node.left)
625
+ self.visit(node.right)
626
+
627
+ def visit_formatted_value(self, node: FormattedValue) -> None:
628
+ """Visit a formatted value in a joined string."""
629
+ self.visit(node.value)
630
+
631
+ def visit_joined_str(self, node: JoinedStr) -> None:
632
+ """Visit a string interpolation."""
633
+ for value in node.values:
634
+ if isinstance(value, str):
635
+ pass
636
+ elif isinstance(value, FormattedValue):
637
+ self.visit(value)
638
+ else:
639
+ assert_never(value)
640
+
641
+ def visit_for_each(self, node: ForEach) -> None:
642
+ """Visit a for-each in a generator."""
643
+ self.visit(node.iteration)
644
+
645
+ def visit_for_range(self, node: ForRange) -> None:
646
+ """Visit a for-range in a generator."""
647
+ self.visit(node.start)
648
+ self.visit(node.end)
649
+
650
+ def visit_any(self, node: Any) -> None:
651
+ """Visit an ``any(...)`` expression."""
652
+ self.visit(node.generator)
653
+ self.visit(node.condition)
654
+
655
+ def visit_all(self, node: All) -> None:
656
+ """Visit an ``all(...)`` expression."""
657
+ self.visit(node.generator)
658
+ self.visit(node.condition)
659
+
660
+ def visit_assignment(self, node: Assignment) -> None:
661
+ """Visit an assignment statement."""
662
+ self.visit(node.target)
663
+ self.visit(node.value)
664
+
665
+ def visit_return(self, node: Return) -> None:
666
+ """Visit a return statement."""
667
+ if node.value is not None:
668
+ self.visit(node.value)
669
+
670
+
671
+ class Transformer(Generic[T], DBC):
672
+ """Transform our AST into something."""
673
+
674
+ def transform(self, node: Node) -> T:
675
+ """Dispatch to the appropriate transformation method."""
676
+ return node.transform(self)
677
+
678
+ @abc.abstractmethod
679
+ def transform_member(self, node: Member) -> T:
680
+ """Transform a member to something."""
681
+ raise NotImplementedError(f"{node=}")
682
+
683
+ @abc.abstractmethod
684
+ def transform_index(self, node: Index) -> T:
685
+ """Transform an index access to something."""
686
+ raise NotImplementedError(f"{node=}")
687
+
688
+ @abc.abstractmethod
689
+ def transform_comparison(self, node: Comparison) -> T:
690
+ """Transform a comparison to something."""
691
+ raise NotImplementedError(f"{node=}")
692
+
693
+ @abc.abstractmethod
694
+ def transform_is_in(self, node: IsIn) -> T:
695
+ """Transform a membership relation to something."""
696
+ raise NotImplementedError(f"{node=}")
697
+
698
+ @abc.abstractmethod
699
+ def transform_implication(self, node: Implication) -> T:
700
+ """Transform an implication to something."""
701
+ raise NotImplementedError(f"{node=}")
702
+
703
+ @abc.abstractmethod
704
+ def transform_method_call(self, node: MethodCall) -> T:
705
+ """Transform a method call into something."""
706
+ raise NotImplementedError(f"{node=}")
707
+
708
+ @abc.abstractmethod
709
+ def transform_function_call(self, node: FunctionCall) -> T:
710
+ """Transform a function call into something."""
711
+ raise NotImplementedError(f"{node=}")
712
+
713
+ @abc.abstractmethod
714
+ def transform_constant(self, node: Constant) -> T:
715
+ """Transform a constant into something."""
716
+ raise NotImplementedError(f"{node=}")
717
+
718
+ @abc.abstractmethod
719
+ def transform_is_none(self, node: IsNone) -> T:
720
+ """Transform an is-none check into something."""
721
+ raise NotImplementedError(f"{node=}")
722
+
723
+ @abc.abstractmethod
724
+ def transform_is_not_none(self, node: IsNotNone) -> T:
725
+ """Transform an is-not-none check into something."""
726
+ raise NotImplementedError(f"{node=}")
727
+
728
+ @abc.abstractmethod
729
+ def transform_name(self, node: Name) -> T:
730
+ """Transform variable access into something."""
731
+ raise NotImplementedError(f"{node=}")
732
+
733
+ @abc.abstractmethod
734
+ def transform_not(self, node: Not) -> T:
735
+ """Transform a negation into something."""
736
+ raise NotImplementedError(f"{node=}")
737
+
738
+ @abc.abstractmethod
739
+ def transform_and(self, node: And) -> T:
740
+ """Transform a conjunction into something."""
741
+ raise NotImplementedError(f"{node=}")
742
+
743
+ @abc.abstractmethod
744
+ def transform_or(self, node: Or) -> T:
745
+ """Transform a disjunction into something."""
746
+ raise NotImplementedError(f"{node=}")
747
+
748
+ @abc.abstractmethod
749
+ def transform_add(self, node: Add) -> T:
750
+ """Transform an addition into something."""
751
+ raise NotImplementedError(f"{node=}")
752
+
753
+ @abc.abstractmethod
754
+ def transform_sub(self, node: Sub) -> T:
755
+ """Transform a subtraction into something."""
756
+ raise NotImplementedError(f"{node=}")
757
+
758
+ @abc.abstractmethod
759
+ def transform_formatted_value(self, node: FormattedValue) -> T:
760
+ """Transform a formatted value of a joined string into something."""
761
+ raise NotImplementedError(f"{node=}")
762
+
763
+ @abc.abstractmethod
764
+ def transform_joined_str(self, node: JoinedStr) -> T:
765
+ """Transform a string interpolation into something."""
766
+ raise NotImplementedError(f"{node=}")
767
+
768
+ @abc.abstractmethod
769
+ def transform_for_each(self, node: ForEach) -> T:
770
+ """Transform the for-each in a generator into something."""
771
+ raise NotImplementedError(f"{node=}")
772
+
773
+ @abc.abstractmethod
774
+ def transform_for_range(self, node: ForRange) -> T:
775
+ """Transform the for-range in a generator into something."""
776
+ raise NotImplementedError(f"{node=}")
777
+
778
+ @abc.abstractmethod
779
+ def transform_any(self, node: Any) -> T:
780
+ """Transform an ``any(...)`` into something."""
781
+ raise NotImplementedError(f"{node=}")
782
+
783
+ @abc.abstractmethod
784
+ def transform_all(self, node: All) -> T:
785
+ """Transform an ``all(...)`` into something."""
786
+ raise NotImplementedError(f"{node=}")
787
+
788
+ @abc.abstractmethod
789
+ def transform_assignment(self, node: Assignment) -> T:
790
+ """Transform an assignment into something."""
791
+ raise NotImplementedError(f"{node=}")
792
+
793
+ @abc.abstractmethod
794
+ def transform_return(self, node: Return) -> T:
795
+ """Transform a return statement into something."""
796
+ raise NotImplementedError(f"{node=}")
797
+
798
+
799
+ class _StringifyTransformer(Transformer[stringify.Entity]):
800
+ """Transform a node into a stringifiable representation."""
801
+
802
+ def transform(self, node: Node) -> stringify.Entity:
803
+ """Dispatch to the appropriate transformation method."""
804
+ result = node.transform(self)
805
+ stringify.assert_compares_against_dict(entity=result, obj=node)
806
+ return result
807
+
808
+ def transform_member(self, node: Member) -> stringify.Entity:
809
+ return stringify.Entity(
810
+ name=node.__class__.__name__,
811
+ properties=[
812
+ stringify.Property("instance", self.transform(node.instance)),
813
+ stringify.Property("name", node.name),
814
+ stringify.PropertyEllipsis("original_node", node.original_node),
815
+ ],
816
+ )
817
+
818
+ def transform_index(self, node: Index) -> stringify.Entity:
819
+ return stringify.Entity(
820
+ name=node.__class__.__name__,
821
+ properties=[
822
+ stringify.Property("collection", self.transform(node.collection)),
823
+ stringify.Property("index", self.transform(node.index)),
824
+ stringify.PropertyEllipsis("original_node", node.original_node),
825
+ ],
826
+ )
827
+
828
+ def transform_comparison(self, node: Comparison) -> stringify.Entity:
829
+ return stringify.Entity(
830
+ name=node.__class__.__name__,
831
+ properties=[
832
+ stringify.Property("left", self.transform(node.left)),
833
+ stringify.Property("op", str(node.op.value)),
834
+ stringify.Property("right", self.transform(node.right)),
835
+ stringify.PropertyEllipsis("original_node", node.original_node),
836
+ ],
837
+ )
838
+
839
+ def transform_is_in(self, node: IsIn) -> stringify.Entity:
840
+ return stringify.Entity(
841
+ name=node.__class__.__name__,
842
+ properties=[
843
+ stringify.Property("member", self.transform(node.member)),
844
+ stringify.Property("container", self.transform(node.container)),
845
+ stringify.PropertyEllipsis("original_node", node.original_node),
846
+ ],
847
+ )
848
+
849
+ def transform_implication(self, node: Implication) -> stringify.Entity:
850
+ return stringify.Entity(
851
+ name=node.__class__.__name__,
852
+ properties=[
853
+ stringify.Property("antecedent", self.transform(node.antecedent)),
854
+ stringify.Property("consequent", self.transform(node.consequent)),
855
+ stringify.PropertyEllipsis("original_node", node.original_node),
856
+ ],
857
+ )
858
+
859
+ def transform_method_call(self, node: MethodCall) -> stringify.Entity:
860
+ return stringify.Entity(
861
+ name=node.__class__.__name__,
862
+ properties=[
863
+ stringify.Property("member", self.transform(node.member)),
864
+ stringify.Property("args", [self.transform(arg) for arg in node.args]),
865
+ stringify.PropertyEllipsis("original_node", node.original_node),
866
+ ],
867
+ )
868
+
869
+ def transform_function_call(self, node: FunctionCall) -> stringify.Entity:
870
+ return stringify.Entity(
871
+ name=node.__class__.__name__,
872
+ properties=[
873
+ stringify.Property("name", node.name.identifier),
874
+ stringify.Property("args", [self.transform(arg) for arg in node.args]),
875
+ stringify.PropertyEllipsis("original_node", node.original_node),
876
+ ],
877
+ )
878
+
879
+ def transform_constant(self, node: Constant) -> stringify.Entity:
880
+ return stringify.Entity(
881
+ name=node.__class__.__name__,
882
+ properties=[
883
+ stringify.Property("value", node.value),
884
+ stringify.PropertyEllipsis("original_node", node.original_node),
885
+ ],
886
+ )
887
+
888
+ def transform_is_none(self, node: IsNone) -> stringify.Entity:
889
+ return stringify.Entity(
890
+ name=node.__class__.__name__,
891
+ properties=[
892
+ stringify.Property("value", self.transform(node.value)),
893
+ stringify.PropertyEllipsis("original_node", node.original_node),
894
+ ],
895
+ )
896
+
897
+ def transform_is_not_none(self, node: IsNotNone) -> stringify.Entity:
898
+ return stringify.Entity(
899
+ name=node.__class__.__name__,
900
+ properties=[
901
+ stringify.Property("value", self.transform(node.value)),
902
+ stringify.PropertyEllipsis("original_node", node.original_node),
903
+ ],
904
+ )
905
+
906
+ def transform_name(self, node: Name) -> stringify.Entity:
907
+ return stringify.Entity(
908
+ name=node.__class__.__name__,
909
+ properties=[
910
+ stringify.Property("identifier", node.identifier),
911
+ stringify.PropertyEllipsis("original_node", node.original_node),
912
+ ],
913
+ )
914
+
915
+ def transform_not(self, node: Not) -> stringify.Entity:
916
+ return stringify.Entity(
917
+ name=node.__class__.__name__,
918
+ properties=[
919
+ stringify.Property("operand", self.transform(node.operand)),
920
+ stringify.PropertyEllipsis("original_node", node.original_node),
921
+ ],
922
+ )
923
+
924
+ def transform_and(self, node: And) -> stringify.Entity:
925
+ return stringify.Entity(
926
+ name=node.__class__.__name__,
927
+ properties=[
928
+ stringify.Property(
929
+ "values", [self.transform(value) for value in node.values]
930
+ ),
931
+ stringify.PropertyEllipsis("original_node", node.original_node),
932
+ ],
933
+ )
934
+
935
+ def transform_or(self, node: Or) -> stringify.Entity:
936
+ return stringify.Entity(
937
+ name=node.__class__.__name__,
938
+ properties=[
939
+ stringify.Property(
940
+ "values", [self.transform(value) for value in node.values]
941
+ ),
942
+ stringify.PropertyEllipsis("original_node", node.original_node),
943
+ ],
944
+ )
945
+
946
+ def transform_add(self, node: Add) -> stringify.Entity:
947
+ return stringify.Entity(
948
+ name=node.__class__.__name__,
949
+ properties=[
950
+ stringify.Property("left", self.transform(node.left)),
951
+ stringify.Property("right", self.transform(node.right)),
952
+ stringify.PropertyEllipsis("original_node", node.original_node),
953
+ ],
954
+ )
955
+
956
+ def transform_sub(self, node: Sub) -> stringify.Entity:
957
+ return stringify.Entity(
958
+ name=node.__class__.__name__,
959
+ properties=[
960
+ stringify.Property("left", self.transform(node.left)),
961
+ stringify.Property("right", self.transform(node.right)),
962
+ stringify.PropertyEllipsis("original_node", node.original_node),
963
+ ],
964
+ )
965
+
966
+ def transform_formatted_value(self, node: FormattedValue) -> stringify.Entity:
967
+ return stringify.Entity(
968
+ name=node.__class__.__name__,
969
+ properties=[
970
+ stringify.Property("value", self.transform(node.value)),
971
+ stringify.PropertyEllipsis("original_node", node.original_node),
972
+ ],
973
+ )
974
+
975
+ def transform_joined_str(self, node: JoinedStr) -> stringify.Entity:
976
+ values = [] # type: List[Union[stringify.Entity, str]]
977
+ for value in node.values:
978
+ if isinstance(value, str):
979
+ values.append(value)
980
+ elif isinstance(value, FormattedValue):
981
+ values.append(self.transform(value))
982
+ else:
983
+ assert_never(value)
984
+
985
+ return stringify.Entity(
986
+ name=node.__class__.__name__,
987
+ properties=[
988
+ stringify.Property(
989
+ "values",
990
+ values,
991
+ ),
992
+ stringify.PropertyEllipsis("original_node", node.original_node),
993
+ ],
994
+ )
995
+
996
+ def transform_for_each(self, node: ForEach) -> stringify.Entity:
997
+ return stringify.Entity(
998
+ name=node.__class__.__name__,
999
+ properties=[
1000
+ stringify.Property("variable", self.transform(node.variable)),
1001
+ stringify.Property("iteration", self.transform(node.iteration)),
1002
+ stringify.PropertyEllipsis("original_node", node.original_node),
1003
+ ],
1004
+ )
1005
+
1006
+ def transform_for_range(self, node: ForRange) -> stringify.Entity:
1007
+ return stringify.Entity(
1008
+ name=node.__class__.__name__,
1009
+ properties=[
1010
+ stringify.Property("variable", self.transform(node.variable)),
1011
+ stringify.Property("start", self.transform(node.start)),
1012
+ stringify.Property("end", self.transform(node.end)),
1013
+ stringify.PropertyEllipsis("original_node", node.original_node),
1014
+ ],
1015
+ )
1016
+
1017
+ def transform_any(self, node: Any) -> stringify.Entity:
1018
+ return stringify.Entity(
1019
+ name=node.__class__.__name__,
1020
+ properties=[
1021
+ stringify.Property("generator", self.transform(node.generator)),
1022
+ stringify.Property("condition", self.transform(node.condition)),
1023
+ stringify.PropertyEllipsis("original_node", node.original_node),
1024
+ ],
1025
+ )
1026
+
1027
+ def transform_all(self, node: All) -> stringify.Entity:
1028
+ return stringify.Entity(
1029
+ name=node.__class__.__name__,
1030
+ properties=[
1031
+ stringify.Property("generator", self.transform(node.generator)),
1032
+ stringify.Property("condition", self.transform(node.condition)),
1033
+ stringify.PropertyEllipsis("original_node", node.original_node),
1034
+ ],
1035
+ )
1036
+
1037
+ def transform_assignment(self, node: Assignment) -> stringify.Entity:
1038
+ return stringify.Entity(
1039
+ name=node.__class__.__name__,
1040
+ properties=[
1041
+ stringify.Property("target", self.transform(node.target)),
1042
+ stringify.Property("value", self.transform(node.value)),
1043
+ stringify.PropertyEllipsis("original_node", node.original_node),
1044
+ ],
1045
+ )
1046
+
1047
+ def transform_return(self, node: Return) -> stringify.Entity:
1048
+ return stringify.Entity(
1049
+ name=node.__class__.__name__,
1050
+ properties=[
1051
+ stringify.Property(
1052
+ "value",
1053
+ self.transform(node.value) if node.value is not None else None,
1054
+ ),
1055
+ stringify.PropertyEllipsis("original_node", node.original_node),
1056
+ ],
1057
+ )
1058
+
1059
+
1060
+ def dump(node: Node) -> str:
1061
+ """Produce a string representation of the tree."""
1062
+ transformer = _StringifyTransformer()
1063
+ return stringify.dump(transformer.transform(node=node))
1064
+
1065
+
1066
+ class RestrictedTransformer(Transformer[T]):
1067
+ """
1068
+ Transform our AST into something where only a part of the tree is handled.
1069
+
1070
+ This class is helpful for cases where you are sure that certain nodes *can not*
1071
+ appear.
1072
+ """
1073
+
1074
+ def transform_member(self, node: Member) -> T:
1075
+ """Transform a member to something."""
1076
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1077
+
1078
+ def transform_index(self, node: Index) -> T:
1079
+ """Transform an index access to something."""
1080
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1081
+
1082
+ def transform_comparison(self, node: Comparison) -> T:
1083
+ """Transform a comparison to something."""
1084
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1085
+
1086
+ def transform_is_in(self, node: IsIn) -> T:
1087
+ """Transform a membership relation to something."""
1088
+ raise NotImplementedError(f"{node=}")
1089
+
1090
+ def transform_implication(self, node: Implication) -> T:
1091
+ """Transform an implication to something."""
1092
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1093
+
1094
+ def transform_method_call(self, node: MethodCall) -> T:
1095
+ """Transform a method call into something."""
1096
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1097
+
1098
+ def transform_function_call(self, node: FunctionCall) -> T:
1099
+ """Transform a function call into something."""
1100
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1101
+
1102
+ def transform_constant(self, node: Constant) -> T:
1103
+ """Transform a constant into something."""
1104
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1105
+
1106
+ def transform_is_none(self, node: IsNone) -> T:
1107
+ """Transform an is-none check into something."""
1108
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1109
+
1110
+ def transform_is_not_none(self, node: IsNotNone) -> T:
1111
+ """Transform an is-not-none check into something."""
1112
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1113
+
1114
+ def transform_name(self, node: Name) -> T:
1115
+ """Transform variable access into something."""
1116
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1117
+
1118
+ def transform_not(self, node: Not) -> T:
1119
+ """Transform a negation into something."""
1120
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1121
+
1122
+ def transform_and(self, node: And) -> T:
1123
+ """Transform a conjunction into something."""
1124
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1125
+
1126
+ def transform_or(self, node: Or) -> T:
1127
+ """Transform a disjunction into something."""
1128
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1129
+
1130
+ def transform_add(self, node: Add) -> T:
1131
+ """Transform an addition into something."""
1132
+ raise NotImplementedError(f"{node=}")
1133
+
1134
+ def transform_sub(self, node: Sub) -> T:
1135
+ """Transform a subtraction into something."""
1136
+ raise NotImplementedError(f"{node=}")
1137
+
1138
+ def transform_formatted_value(self, node: FormattedValue) -> T:
1139
+ """Transform a formatted value in a joined string into something."""
1140
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1141
+
1142
+ def transform_joined_str(self, node: JoinedStr) -> T:
1143
+ """Transform a string interpolation into something."""
1144
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1145
+
1146
+ def transform_for_each(self, node: ForEach) -> T:
1147
+ """Transform a for-each in a generator expression into something."""
1148
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1149
+
1150
+ def transform_for_range(self, node: ForRange) -> T:
1151
+ """Transform a for-range in a generator expression into something."""
1152
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1153
+
1154
+ def transform_any(self, node: Any) -> T:
1155
+ """Transform an ``any(...)`` expression into something."""
1156
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1157
+
1158
+ def transform_all(self, node: All) -> T:
1159
+ """Transform an ``all(...)`` expression into something."""
1160
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1161
+
1162
+ def transform_assignment(self, node: Assignment) -> T:
1163
+ """Transform an assignment into something."""
1164
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1165
+
1166
+ def transform_return(self, node: Return) -> T:
1167
+ """Transform a return statement into something."""
1168
+ raise AssertionError(f"Unexpected node: {dump(node)}")
1169
+
1170
+
1171
+ class _IterationTransformer(Transformer[Iterator[Node]]):
1172
+ """Transform a node into an iterator over nodes."""
1173
+
1174
+ def transform(self, node: Node) -> Iterator[Node]:
1175
+ """Dispatch to the appropriate transformation method."""
1176
+ yield from node.transform(self)
1177
+
1178
+ def transform_member(self, node: Member) -> Iterator[Node]:
1179
+ yield node
1180
+ yield from self.transform(node.instance)
1181
+
1182
+ def transform_index(self, node: Index) -> Iterator[Node]:
1183
+ yield node
1184
+ yield from self.transform(node.collection)
1185
+ yield from self.transform(node.index)
1186
+
1187
+ def transform_comparison(self, node: Comparison) -> Iterator[Node]:
1188
+ yield node
1189
+ yield from self.transform(node.left)
1190
+ yield from self.transform(node.right)
1191
+
1192
+ def transform_is_in(self, node: IsIn) -> Iterator[Node]:
1193
+ yield node
1194
+ yield from self.transform(node.member)
1195
+ yield from self.transform(node.container)
1196
+
1197
+ def transform_implication(self, node: Implication) -> Iterator[Node]:
1198
+ yield node
1199
+ yield from self.transform(node.antecedent)
1200
+ yield from self.transform(node.consequent)
1201
+
1202
+ def transform_method_call(self, node: MethodCall) -> Iterator[Node]:
1203
+ yield node
1204
+ yield from self.transform(node.member)
1205
+ for arg in node.args:
1206
+ yield from self.transform(arg)
1207
+
1208
+ def transform_function_call(self, node: FunctionCall) -> Iterator[Node]:
1209
+ yield node
1210
+ for arg in node.args:
1211
+ yield from self.transform(arg)
1212
+
1213
+ def transform_constant(self, node: Constant) -> Iterator[Node]:
1214
+ yield node
1215
+
1216
+ def transform_is_none(self, node: IsNone) -> Iterator[Node]:
1217
+ yield node
1218
+ yield from self.transform(node.value)
1219
+
1220
+ def transform_is_not_none(self, node: IsNotNone) -> Iterator[Node]:
1221
+ yield node
1222
+ yield from self.transform(node.value)
1223
+
1224
+ def transform_name(self, node: Name) -> Iterator[Node]:
1225
+ yield node
1226
+
1227
+ def transform_not(self, node: Not) -> Iterator[Node]:
1228
+ yield node
1229
+ yield from self.transform(node.operand)
1230
+
1231
+ def transform_and(self, node: And) -> Iterator[Node]:
1232
+ yield node
1233
+ for value in node.values:
1234
+ yield from self.transform(value)
1235
+
1236
+ def transform_or(self, node: Or) -> Iterator[Node]:
1237
+ yield node
1238
+ for value in node.values:
1239
+ yield from self.transform(value)
1240
+
1241
+ def transform_add(self, node: Add) -> Iterator[Node]:
1242
+ yield node
1243
+ yield from self.transform(node.left)
1244
+ yield from self.transform(node.right)
1245
+
1246
+ def transform_sub(self, node: Sub) -> Iterator[Node]:
1247
+ yield node
1248
+ yield from self.transform(node.left)
1249
+ yield from self.transform(node.right)
1250
+
1251
+ def transform_formatted_value(self, node: FormattedValue) -> Iterator[Node]:
1252
+ yield node
1253
+ yield from self.transform(node.value)
1254
+
1255
+ def transform_joined_str(self, node: JoinedStr) -> Iterator[Node]:
1256
+ yield node
1257
+
1258
+ for value in node.values:
1259
+ if isinstance(value, str):
1260
+ pass
1261
+ elif isinstance(value, FormattedValue):
1262
+ yield from self.transform(value)
1263
+ else:
1264
+ assert_never(value)
1265
+
1266
+ def transform_for_each(self, node: ForEach) -> Iterator[Node]:
1267
+ yield node
1268
+ yield from self.transform(node.variable)
1269
+ yield from self.transform(node.iteration)
1270
+
1271
+ def transform_for_range(self, node: ForRange) -> Iterator[Node]:
1272
+ yield node
1273
+ yield from self.transform(node.variable)
1274
+ yield from self.transform(node.start)
1275
+ yield from self.transform(node.end)
1276
+
1277
+ def transform_any(self, node: Any) -> Iterator[Node]:
1278
+ yield node
1279
+ yield from self.transform(node.generator)
1280
+ yield from self.transform(node.condition)
1281
+
1282
+ def transform_all(self, node: All) -> Iterator[Node]:
1283
+ yield node
1284
+ yield from self.transform(node.generator)
1285
+ yield from self.transform(node.condition)
1286
+
1287
+ def transform_assignment(self, node: Assignment) -> Iterator[Node]:
1288
+ yield node
1289
+ yield from self.transform(node.target)
1290
+ yield from self.transform(node.value)
1291
+
1292
+ def transform_return(self, node: Return) -> Iterator[Node]:
1293
+ yield node
1294
+ if node.value is not None:
1295
+ yield from self.transform(node.value)
1296
+
1297
+
1298
+ _ITERATION_TRANSFORMER = _IterationTransformer()
1299
+
1300
+
1301
+ def over_nodes(node: Node) -> Iterator[Node]:
1302
+ """Iterate recursively over the ``node``, including the ``node`` itself."""
1303
+ yield from _ITERATION_TRANSFORMER.transform(node)