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,993 @@
1
+ """Generate Golang code for enhancing model classes."""
2
+
3
+ import io
4
+ from typing import Tuple, Optional, List, Sequence
5
+
6
+ from icontract import ensure, require
7
+
8
+ from aas_core_codegen import intermediate
9
+ from aas_core_codegen.common import (
10
+ Error,
11
+ Stripped,
12
+ Identifier,
13
+ assert_never,
14
+ indent_but_first_line,
15
+ )
16
+ from aas_core_codegen.cpp import (
17
+ common as cpp_common,
18
+ naming as cpp_naming,
19
+ )
20
+ from aas_core_codegen.cpp.common import (
21
+ INDENT as I,
22
+ INDENT2 as II,
23
+ INDENT3 as III,
24
+ INDENT4 as IIII,
25
+ INDENT5 as IIIII,
26
+ )
27
+
28
+
29
+ def _generate_wrap_forward_declarations(
30
+ symbol_table: intermediate.SymbolTable,
31
+ ) -> List[Stripped]:
32
+ """Generate the forward declarations of the overloaded ``Wrap`` functions."""
33
+ result = [] # type: List[Stripped]
34
+ for cls in symbol_table.classes:
35
+ interface_name = cpp_naming.interface_name(cls.name)
36
+
37
+ function_name = cpp_naming.function_name(Identifier("wrap"))
38
+
39
+ result.append(
40
+ Stripped(
41
+ f"""\
42
+ template <typename E>
43
+ std::shared_ptr<
44
+ {I}types::{interface_name}
45
+ > {function_name}(
46
+ {I}const std::shared_ptr<
47
+ {II}types::{interface_name}
48
+ {I}>& that,
49
+ {I}const std::function<
50
+ {II}std::shared_ptr<E>(
51
+ {III}const std::shared_ptr<types::IClass>&
52
+ {II})
53
+ {I}>& factory
54
+ );"""
55
+ )
56
+ )
57
+
58
+ return result
59
+
60
+
61
+ def _generate_enhanced_interface_definition() -> Stripped:
62
+ """Generate the definition of the generic ``Enhanced`` interface."""
63
+ enhanced_interface = cpp_naming.interface_name(Identifier("Enhanced"))
64
+
65
+ members = [] # type: List[Stripped]
66
+
67
+ enhancement_getter = cpp_naming.getter_name(Identifier("enhancement"))
68
+ members.append(
69
+ Stripped(
70
+ f"""\
71
+ virtual const std::shared_ptr<E>& {enhancement_getter}() const = 0;"""
72
+ )
73
+ )
74
+
75
+ enhancement_mutable_getter = cpp_naming.mutable_getter_name(
76
+ Identifier("enhancement")
77
+ )
78
+ members.append(
79
+ Stripped(
80
+ f"""\
81
+ virtual std::shared_ptr<E>& {enhancement_mutable_getter}() = 0;"""
82
+ )
83
+ )
84
+
85
+ enhancement_setter = cpp_naming.setter_name(Identifier("enhancement"))
86
+ members.append(
87
+ Stripped(
88
+ f"""\
89
+ virtual void {enhancement_setter}(
90
+ {I}std::shared_ptr<E> value
91
+ ) = 0;"""
92
+ )
93
+ )
94
+
95
+ members.append(
96
+ Stripped(
97
+ f"""\
98
+ virtual ~{enhanced_interface}() = default;"""
99
+ )
100
+ )
101
+
102
+ members_joined = "\n\n".join(members)
103
+
104
+ return Stripped(
105
+ f"""\
106
+ template<typename E>
107
+ class {enhanced_interface} {{
108
+ public:
109
+ {I}{indent_but_first_line(members_joined, I)}
110
+ }};"""
111
+ )
112
+
113
+
114
+ def _generate_method_delegation(method: intermediate.Method) -> Stripped:
115
+ """Generate the delegated method to ``instance_``."""
116
+ returns = (
117
+ cpp_common.generate_type(method.returns, types_namespace=Identifier("types"))
118
+ if method.returns is not None
119
+ else None
120
+ )
121
+
122
+ return_type = "void" if returns is None else returns
123
+ return_prefix = "" if returns is None else "return "
124
+
125
+ arg_types_names = [
126
+ (
127
+ cpp_common.generate_type_with_const_ref_if_applicable(
128
+ arg.type_annotation, types_namespace=Identifier("types")
129
+ ),
130
+ cpp_naming.argument_name(arg.name),
131
+ )
132
+ for arg in method.arguments
133
+ ]
134
+
135
+ method_name = cpp_naming.method_name(method.name)
136
+
137
+ const_suffix = " const" if method.non_mutating else ""
138
+
139
+ if len(method.arguments) == 0:
140
+ return Stripped(
141
+ f"""\
142
+ {return_type} {method_name}(){const_suffix} override {{
143
+ {I}{return_prefix}instance_->{method_name}();
144
+ }}"""
145
+ )
146
+
147
+ arguments_definition = ",\n".join(
148
+ f"{arg_type} {arg_name}" for arg_type, arg_name in arg_types_names
149
+ )
150
+
151
+ arguments_delegation = ",\n".join(f"{arg_name}" for _, arg_name in arg_types_names)
152
+
153
+ return Stripped(
154
+ f"""\
155
+ {return_type} {method_name}(
156
+ {I}{indent_but_first_line(arguments_definition, I)}
157
+ ){const_suffix} override {{
158
+ {I}{return_prefix}instance_->{method_name}(
159
+ {II}{indent_but_first_line(arguments_delegation, II)}
160
+ {I});
161
+ }}"""
162
+ )
163
+
164
+
165
+ def _generate_enhanced_class(
166
+ cls: intermediate.ConcreteClass,
167
+ ) -> Stripped:
168
+ """Generate the implementation of an enhanced class which wraps an instance."""
169
+ public_members = [] # type: List[Stripped]
170
+
171
+ model_type_enum = cpp_naming.enum_name(Identifier("Model_type"))
172
+ model_type_getter = cpp_naming.getter_name(Identifier("model_type"))
173
+
174
+ model_type_literal = cpp_naming.enum_literal_name(Identifier(cls.name))
175
+
176
+ public_members.append(
177
+ Stripped(
178
+ f"""\
179
+ types::{model_type_enum} {model_type_getter}() const override {{
180
+ {I}return types::{model_type_enum}::{model_type_literal};
181
+ }}"""
182
+ )
183
+ )
184
+
185
+ for prop in cls.properties:
186
+ getter_name = cpp_naming.getter_name(prop.name)
187
+
188
+ getter_type = cpp_common.generate_type_with_const_ref_if_applicable(
189
+ type_annotation=prop.type_annotation, types_namespace=Identifier("types")
190
+ )
191
+
192
+ public_members.append(
193
+ Stripped(
194
+ f"""\
195
+ {getter_type} {getter_name}() const override {{
196
+ {I}return instance_->{getter_name}();
197
+ }}"""
198
+ )
199
+ )
200
+
201
+ mutable_getter_name = cpp_naming.mutable_getter_name(prop.name)
202
+ mutable_getter_type = cpp_common.generate_type_with_ref(
203
+ type_annotation=prop.type_annotation, types_namespace=Identifier("types")
204
+ )
205
+ public_members.append(
206
+ Stripped(
207
+ f"""\
208
+ {mutable_getter_type} {mutable_getter_name}() override {{
209
+ {I}return instance_->{mutable_getter_name}();
210
+ }}"""
211
+ )
212
+ )
213
+
214
+ setter_name = cpp_naming.setter_name(prop.name)
215
+
216
+ # NOTE (mristin, 2023-07-05):
217
+ # For a discussion on ``std::shared_ptr`` and referencing,
218
+ # see: https://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/
219
+
220
+ # NOTE (mristin, 2023-07-07):
221
+ # We provide setters which only set-by-value logic since this seems to be
222
+ # the best approach for general cases,
223
+ # see: https://stackoverflow.com/questions/10692345/is-it-worth-adding-a-move-enabled-setter.
224
+ #
225
+ # Whenever you know that you do not need the value after calling the setter,
226
+ # make sure to call it with ``std::move(.)``.
227
+
228
+ value_type = cpp_common.generate_type(
229
+ type_annotation=prop.type_annotation, types_namespace=Identifier("types")
230
+ )
231
+ public_members.append(
232
+ Stripped(
233
+ f"""\
234
+ void {setter_name}(
235
+ {I}{indent_but_first_line(value_type, I)} value
236
+ ) override {{
237
+ {I}instance_->{setter_name}(value);
238
+ }}"""
239
+ )
240
+ )
241
+
242
+ for method in cls.methods:
243
+ public_members.append(_generate_method_delegation(method=method))
244
+
245
+ enhancement_getter = cpp_naming.getter_name(Identifier("enhancement"))
246
+ public_members.append(
247
+ Stripped(
248
+ f"""\
249
+ const std::shared_ptr<E>& {enhancement_getter}() const {{
250
+ {I}return enhancement_;
251
+ }}"""
252
+ )
253
+ )
254
+
255
+ enhancement_mutable_getter = cpp_naming.mutable_getter_name(
256
+ Identifier("enhancement")
257
+ )
258
+ public_members.append(
259
+ Stripped(
260
+ f"""\
261
+ std::shared_ptr<E>& {enhancement_mutable_getter}() {{
262
+ {I}return enhancement_;
263
+ }}"""
264
+ )
265
+ )
266
+
267
+ # NOTE (mristin, 2023-07-07):
268
+ # See: https://stackoverflow.com/questions/41871115/why-would-i-stdmove-an-stdshared-ptr
269
+ # for why we ``std::move`` here.
270
+ enhancement_setter = cpp_naming.setter_name(Identifier("enhancement"))
271
+ public_members.append(
272
+ Stripped(
273
+ f"""\
274
+ void {enhancement_setter}(
275
+ {I}std::shared_ptr<E> value
276
+ ) {{
277
+ {I}enhancement_ = std::move(value);
278
+ }}"""
279
+ )
280
+ )
281
+
282
+ enhanced_cls_name = cpp_naming.class_name(Identifier(f"enhanced_{cls.name}"))
283
+ interface_name = cpp_naming.interface_name(cls.name)
284
+
285
+ public_members.append(
286
+ Stripped(
287
+ f"""\
288
+ {enhanced_cls_name}(
289
+ {I}std::shared_ptr<types::{interface_name}> instance,
290
+ {I}std::shared_ptr<E> enhancement
291
+ ) :
292
+ {I}instance_(instance),
293
+ {I}enhancement_(enhancement) {{
294
+ {I}// Intentionally empty.
295
+ }}"""
296
+ )
297
+ )
298
+
299
+ public_members.append(
300
+ Stripped(
301
+ f"""\
302
+ virtual ~{enhanced_cls_name}() = default;"""
303
+ )
304
+ )
305
+
306
+ public_members_joined = "\n\n".join(public_members)
307
+ enhanced_interface = cpp_naming.interface_name(Identifier("Enhanced"))
308
+
309
+ return Stripped(
310
+ f"""\
311
+ template<class E>
312
+ class {enhanced_cls_name}
313
+ {II}: virtual public types::{interface_name},
314
+ {II}virtual public {enhanced_interface}<E> {{
315
+ public:
316
+ {I}{indent_but_first_line(public_members_joined, I)}
317
+
318
+ private:
319
+ {I}std::shared_ptr<types::{interface_name}> instance_;
320
+ {I}std::shared_ptr<E> enhancement_;
321
+ }};"""
322
+ )
323
+
324
+
325
+ # NOTE (mristin, 2023-07-07):
326
+ # We write two separate functions, ``_generate_wrap_snippet_for_required_property`` and
327
+ # ``_generate_wrap_snippet_for_optional_property``, as the complexity grew over the top.
328
+ # This resulted in a much more readable code than if we tried to de-DRY the logic
329
+ # in a single function.
330
+
331
+
332
+ @require(lambda prop: not isinstance(prop, intermediate.OptionalTypeAnnotation))
333
+ def _generate_wrap_snippet_for_required_property(
334
+ prop: intermediate.Property,
335
+ ) -> Stripped:
336
+ """
337
+ Generate the snippet to recursively wrap the required property.
338
+
339
+ We return an empty string if there is no snippet for the property.
340
+ """
341
+ type_anno = prop.type_annotation
342
+
343
+ # NOTE (mristin, 2023-07-07):
344
+ # Duplicate the pre-condition for mypy.
345
+ assert not isinstance(type_anno, intermediate.OptionalTypeAnnotation)
346
+
347
+ setter_name = cpp_naming.setter_name(prop.name)
348
+
349
+ if isinstance(type_anno, intermediate.PrimitiveTypeAnnotation):
350
+ # Nothing to recurse into.
351
+ return Stripped("")
352
+
353
+ elif isinstance(type_anno, intermediate.OurTypeAnnotation):
354
+ if isinstance(type_anno.our_type, intermediate.Enumeration):
355
+ # Nothing to recurse into.
356
+ return Stripped("")
357
+
358
+ elif isinstance(type_anno.our_type, intermediate.ConstrainedPrimitive):
359
+ # Nothing to recurse into.
360
+ return Stripped("")
361
+
362
+ elif isinstance(
363
+ type_anno.our_type, (intermediate.AbstractClass, intermediate.ConcreteClass)
364
+ ):
365
+ # NOTE (mristin, 2023-07-07):
366
+ # The non-mutating getter means here that we will not change the reference,
367
+ # but we want to recurse into the object.
368
+ getter_name = cpp_naming.getter_name(prop.name)
369
+
370
+ return Stripped(
371
+ f"""\
372
+ that->{setter_name}(
373
+ {I}Wrap<E>(
374
+ {II}that->{getter_name}(),
375
+ {II}factory
376
+ {I})
377
+ );"""
378
+ )
379
+ else:
380
+ assert_never(type_anno.our_type)
381
+ elif isinstance(type_anno, intermediate.ListTypeAnnotation):
382
+ assert isinstance(
383
+ type_anno.items, intermediate.OurTypeAnnotation
384
+ ) and isinstance(
385
+ type_anno.items.our_type,
386
+ (intermediate.AbstractClass, intermediate.ConcreteClass),
387
+ ), (
388
+ f"NOTE (mristin, 2023-07-07): We expect only lists of classes "
389
+ f"at the moment, but you specified {type_anno}. "
390
+ f"Please contact the developers if you need this feature."
391
+ )
392
+
393
+ getter_name = cpp_naming.getter_name(prop.name)
394
+ const_ref_prop_type = cpp_common.generate_type_with_const_ref_if_applicable(
395
+ type_annotation=type_anno, types_namespace=Identifier("types")
396
+ )
397
+ prop_type = cpp_common.generate_type(
398
+ type_annotation=type_anno, types_namespace=cpp_common.TYPES_NAMESPACE
399
+ )
400
+
401
+ item_type = cpp_common.generate_type_with_const_ref_if_applicable(
402
+ type_annotation=type_anno.items, types_namespace=cpp_common.TYPES_NAMESPACE
403
+ )
404
+
405
+ return Stripped(
406
+ f"""\
407
+ {{
408
+ {I}{indent_but_first_line(const_ref_prop_type, I)} value(
409
+ {II}that->{getter_name}()
410
+ {I});
411
+ {I}const std::size_t size = value.size();
412
+
413
+ {I}{indent_but_first_line(prop_type, I)} wrapped;
414
+ {I}wrapped.reserve(size);
415
+
416
+ {I}for (
417
+ {II}{indent_but_first_line(item_type, II)} item
418
+ {II}: value
419
+ {I}) {{
420
+ {II}wrapped.emplace_back(
421
+ {III}Wrap<E>(
422
+ {IIII}item,
423
+ {IIII}factory
424
+ {III})
425
+ {II});
426
+ {I}}}
427
+
428
+ {I}that->{setter_name}(
429
+ {II}std::move(wrapped)
430
+ {I});
431
+ }}"""
432
+ )
433
+ else:
434
+ assert_never(type_anno)
435
+
436
+
437
+ # fmt: off
438
+ @require(
439
+ lambda prop:
440
+ isinstance(prop.type_annotation, intermediate.OptionalTypeAnnotation)
441
+ )
442
+ # fmt: on
443
+ def _generate_wrap_snippet_for_optional_property(
444
+ prop: intermediate.Property,
445
+ ) -> Stripped:
446
+ """
447
+ Generate the snippet to recursively wrap the optional property.
448
+
449
+ We return an empty string if there is no snippet for the property.
450
+ """
451
+ type_anno = intermediate.beneath_optional(prop.type_annotation)
452
+
453
+ setter_name = cpp_naming.setter_name(prop.name)
454
+
455
+ if isinstance(type_anno, intermediate.PrimitiveTypeAnnotation):
456
+ # Nothing to recurse into.
457
+ return Stripped("")
458
+
459
+ elif isinstance(type_anno, intermediate.OurTypeAnnotation):
460
+ if isinstance(type_anno.our_type, intermediate.Enumeration):
461
+ # Nothing to recurse into.
462
+ return Stripped("")
463
+
464
+ elif isinstance(type_anno.our_type, intermediate.ConstrainedPrimitive):
465
+ # Nothing to recurse into.
466
+ return Stripped("")
467
+
468
+ elif isinstance(
469
+ type_anno.our_type, (intermediate.AbstractClass, intermediate.ConcreteClass)
470
+ ):
471
+ # NOTE (mristin, 2023-07-07):
472
+ # The non-mutating getter means here that we will not change the reference,
473
+ # but we want to recurse into the object.
474
+ getter_name = cpp_naming.getter_name(prop.name)
475
+
476
+ value_type = cpp_common.generate_type(
477
+ type_annotation=type_anno, types_namespace=Identifier("types")
478
+ )
479
+
480
+ value_interface_name = cpp_naming.interface_name(type_anno.our_type.name)
481
+
482
+ return Stripped(
483
+ f"""\
484
+ if (that->{getter_name}().has_value()) {{
485
+ {I}const {indent_but_first_line(value_type, II)}& value(
486
+ {II}that->{getter_name}().value()
487
+ {I});
488
+
489
+ {I}std::shared_ptr<
490
+ {II}types::{value_interface_name}
491
+ {I}> wrapped(
492
+ {II}Wrap<E>(
493
+ {III}value,
494
+ {III}factory
495
+ {II})
496
+ {I});
497
+
498
+ {I}that->{setter_name}(
499
+ {II}common::make_optional(
500
+ {III}std::move(wrapped)
501
+ {II})
502
+ {I});
503
+ }}"""
504
+ )
505
+ else:
506
+ assert_never(type_anno.our_type)
507
+ elif isinstance(type_anno, intermediate.ListTypeAnnotation):
508
+ assert isinstance(
509
+ type_anno.items, intermediate.OurTypeAnnotation
510
+ ) and isinstance(
511
+ type_anno.items.our_type,
512
+ (intermediate.AbstractClass, intermediate.ConcreteClass),
513
+ ), (
514
+ f"NOTE (mristin, 2023-07-07): We expect only lists of classes "
515
+ f"at the moment, but you specified {type_anno}. "
516
+ f"Please contact the developers if you need this feature."
517
+ )
518
+
519
+ getter_name = cpp_naming.getter_name(prop.name)
520
+ value_type = cpp_common.generate_type(
521
+ type_annotation=type_anno, types_namespace=cpp_common.TYPES_NAMESPACE
522
+ )
523
+
524
+ item_type = cpp_common.generate_type_with_const_ref_if_applicable(
525
+ type_annotation=type_anno.items, types_namespace=cpp_common.TYPES_NAMESPACE
526
+ )
527
+
528
+ return Stripped(
529
+ f"""\
530
+ if (that->{getter_name}().has_value()) {{
531
+ {I}const {indent_but_first_line(value_type, II)}& value(
532
+ {II}that->{getter_name}().value()
533
+ {I});
534
+ {I}const std::size_t size = value.size();
535
+
536
+ {I}{indent_but_first_line(value_type, I)} wrapped;
537
+ {I}wrapped.reserve(size);
538
+
539
+ {I}for (
540
+ {II}{indent_but_first_line(item_type, II)} item
541
+ {II}: value
542
+ {I}) {{
543
+ {II}wrapped.emplace_back(
544
+ {III}Wrap<E>(
545
+ {IIII}item,
546
+ {IIII}factory
547
+ {III})
548
+ {II});
549
+ {I}}}
550
+
551
+ {I}that->{setter_name}(
552
+ {II}common::make_optional(
553
+ {III}std::move(wrapped)
554
+ {II})
555
+ {I});
556
+ }}"""
557
+ )
558
+ else:
559
+ assert_never(type_anno)
560
+
561
+
562
+ def _generate_concrete_wrap(cls: intermediate.ConcreteClass) -> Stripped:
563
+ """Generate the concrete wrapping function for the concrete class."""
564
+ recurse_blocks = [] # type: List[Stripped]
565
+ for prop in cls.properties:
566
+ if isinstance(prop.type_annotation, intermediate.OptionalTypeAnnotation):
567
+ recurse_block = _generate_wrap_snippet_for_optional_property(
568
+ prop=prop,
569
+ )
570
+ else:
571
+ recurse_block = _generate_wrap_snippet_for_required_property(
572
+ prop=prop,
573
+ )
574
+
575
+ if len(recurse_block) != 0:
576
+ recurse_blocks.append(recurse_block)
577
+
578
+ recurse_blocks_joined = Stripped(
579
+ "\n\n".join(recurse_blocks)
580
+ if len(recurse_blocks) > 0
581
+ else "// No properties to be recursively enhanced."
582
+ )
583
+
584
+ interface_name = cpp_naming.interface_name(cls.name)
585
+ enhanced_cls_name = cpp_naming.class_name(Identifier(f"enhanced_{cls.name}"))
586
+
587
+ blocks = [
588
+ Stripped(
589
+ """\
590
+ // We assume that we already checked whether `that` has been enhanced
591
+ // in the caller."""
592
+ ),
593
+ recurse_blocks_joined,
594
+ Stripped(
595
+ f"""\
596
+ std::shared_ptr<E> enh(
597
+ {I}factory(that)
598
+ );
599
+ return (enh == nullptr)
600
+ {I}? that
601
+ {I}: std::shared_ptr<types::{interface_name}>(
602
+ {II}new {enhanced_cls_name}<E>(
603
+ {III}that,
604
+ {III}enh
605
+ {II})
606
+ {I});"""
607
+ ),
608
+ ]
609
+
610
+ body = "\n\n".join(blocks)
611
+
612
+ function_name = cpp_naming.function_name(Identifier(f"wrap_{cls.name}"))
613
+
614
+ return Stripped(
615
+ f"""\
616
+ /**
617
+ * Wrap \\p that with an enhanced instance.
618
+ *
619
+ * \\param that instance to be wrapped and enhanced
620
+ * \\param factory to produce an enhancement based on an instance
621
+ * \\return Enhanced instance, or `that` if no enhancement produced
622
+ *
623
+ * \\tparam E type of the enhancement
624
+ */
625
+ template<typename E>
626
+ std::shared_ptr<types::{interface_name}> {function_name}(
627
+ {I}const std::shared_ptr<types::{interface_name}>& that,
628
+ {I}const std::function<
629
+ {II}std::shared_ptr<E>(
630
+ {III}const std::shared_ptr<types::IClass>&
631
+ {II})
632
+ {I}>& factory
633
+ ) {{
634
+ {I}{indent_but_first_line(body, I)}
635
+ }}"""
636
+ )
637
+
638
+
639
+ def _generate_wrap_for(
640
+ interface_name: Identifier, concrete_classes: Sequence[intermediate.ConcreteClass]
641
+ ) -> Stripped:
642
+ """
643
+ Generate the wrap function for the given interface.
644
+
645
+ We do not operate on ``intermediate.Class`` directly as we also want to
646
+ handle the case for the most abstract ``IClass``.
647
+ """
648
+ model_type_name = cpp_naming.enum_name(Identifier("Model_type"))
649
+
650
+ case_blocks = [] # type: List[Stripped]
651
+ for cls in concrete_classes:
652
+ literal = cpp_naming.enum_literal_name(literal_name=cls.name)
653
+
654
+ concrete_wrap_function = cpp_naming.function_name(
655
+ Identifier(f"wrap_{cls.name}")
656
+ )
657
+
658
+ concrete_interface_name = cpp_naming.interface_name(cls.name)
659
+
660
+ if concrete_interface_name == interface_name:
661
+ case_blocks.append(
662
+ Stripped(
663
+ f"""\
664
+ case types::{model_type_name}::{literal}:
665
+ {I}return impl::{concrete_wrap_function}<E>(
666
+ {II}that,
667
+ {II}factory
668
+ {I});
669
+ {I}break;"""
670
+ )
671
+ )
672
+ else:
673
+ case_blocks.append(
674
+ Stripped(
675
+ f"""\
676
+ case types::{model_type_name}::{literal}:
677
+ {I}return impl::{concrete_wrap_function}<E>(
678
+ {II}std::dynamic_pointer_cast<
679
+ {III}types::{concrete_interface_name}
680
+ {II}>(that),
681
+ {II}factory
682
+ {I});
683
+ {I}break;"""
684
+ )
685
+ )
686
+
687
+ case_blocks.append(
688
+ Stripped(
689
+ f"""\
690
+ default:
691
+ {I}throw std::invalid_argument(
692
+ {II}common::Concat(
693
+ {III}"Unexpected model type: ",
694
+ {III}std::to_string(
695
+ {IIII}static_cast<std::uint32_t>(
696
+ {IIIII}that->model_type()
697
+ {IIII})
698
+ {III})
699
+ {II})
700
+ {I});
701
+ {I}break;"""
702
+ )
703
+ )
704
+
705
+ case_blocks_joined = "\n".join(case_blocks)
706
+
707
+ # noinspection SpellCheckingInspection
708
+ body = Stripped(
709
+ f"""\
710
+ impl::AssertNotEnhanced<
711
+ {I}E,
712
+ {I}types::{interface_name}
713
+ >(that);
714
+
715
+ switch (that->model_type()) {{
716
+ {I}{indent_but_first_line(case_blocks_joined, I)}
717
+ }}"""
718
+ )
719
+
720
+ function_name = cpp_naming.function_name(Identifier("wrap"))
721
+
722
+ return Stripped(
723
+ f"""\
724
+ template <typename E>
725
+ std::shared_ptr<
726
+ {I}types::{interface_name}
727
+ > {function_name}(
728
+ {I}const std::shared_ptr<
729
+ {II}types::{interface_name}
730
+ {I}>& that,
731
+ {I}const std::function<
732
+ {II}std::shared_ptr<E>(
733
+ {III}const std::shared_ptr<types::IClass>&
734
+ {II})
735
+ {I}>& factory
736
+ ) {{
737
+ {I}{indent_but_first_line(body, I)}
738
+ }}"""
739
+ )
740
+
741
+
742
+ def _generate_wrap(symbol_table: intermediate.SymbolTable) -> List[Stripped]:
743
+ """Generate all the overloads of the main wrapping function."""
744
+ blocks = [
745
+ _generate_wrap_for(
746
+ interface_name=Identifier("IClass"),
747
+ concrete_classes=symbol_table.concrete_classes,
748
+ )
749
+ ] # type: List[Stripped]
750
+
751
+ for cls in symbol_table.classes:
752
+ interface_name = cpp_naming.interface_name(cls.name)
753
+
754
+ concrete_classes = [] # type: List[intermediate.ConcreteClass]
755
+ if isinstance(cls, intermediate.ConcreteClass):
756
+ concrete_classes.append(cls)
757
+
758
+ concrete_classes.extend(cls.concrete_descendants)
759
+
760
+ blocks.append(
761
+ _generate_wrap_for(
762
+ interface_name=interface_name, concrete_classes=concrete_classes
763
+ )
764
+ )
765
+
766
+ return [
767
+ Stripped(
768
+ """\
769
+ /**
770
+ * Wrap \\p that instance recursively with the enhancement produced by the \\p factory.
771
+ *
772
+ * The factory decides itself whether it will produce an enhancement for
773
+ * \\p that instance, or not. Even if no enhancement has been produced for \\p that
774
+ * instance, we will still continue to enhance the instances referenced
775
+ * by \\p that instance recursively.
776
+ *
777
+ * \\param that instance to wrap
778
+ * \\param factory to selectively produce an enhancement
779
+ * \\return enhanced \\p that instance
780
+ * \\throw std::logic_error if \\p that instance has been already wrapped.
781
+ * \\tparam E type of the enhancement
782
+ */
783
+ ///@{"""
784
+ ),
785
+ *blocks,
786
+ Stripped("///@}}"),
787
+ ]
788
+
789
+
790
+ def _generate_unwrap() -> Stripped:
791
+ """Generate the main unwrapping function."""
792
+ function_name = cpp_naming.function_name(Identifier("unwrap"))
793
+
794
+ body = Stripped(
795
+ f"""\
796
+ const std::shared_ptr<impl::IEnhanced<E> >& maybe_enhanced(
797
+ {I}std::dynamic_pointer_cast<impl::IEnhanced<E> >(that)
798
+ );
799
+
800
+ if (!maybe_enhanced) {{
801
+ {I}return nullptr;
802
+ }}
803
+
804
+ return maybe_enhanced->enhancement();"""
805
+ )
806
+
807
+ return Stripped(
808
+ f"""\
809
+ /**
810
+ * Try to unwrap the enhancement from \\p that instance.
811
+ *
812
+ * \\param that instance possibly wrapped with an enhancement
813
+ * \\return the enhancement, or `nullptr` if \\p that instance has not been wrapped
814
+ * \\tparam E type of the enhancement
815
+ */
816
+ template <typename E>
817
+ std::shared_ptr<E> {function_name}(
818
+ {I}const std::shared_ptr<types::IClass>& that
819
+ ) {{
820
+ {I}{indent_but_first_line(body, I)}
821
+ }}"""
822
+ )
823
+
824
+
825
+ def _generate_must_unwrap() -> Stripped:
826
+ """Generate the main unwrapping function which throws if no enhancement present."""
827
+ unwrap_name = cpp_naming.function_name(Identifier("unwrap"))
828
+ function_name = cpp_naming.function_name(Identifier("must_unwrap"))
829
+
830
+ enhancement_var = cpp_naming.variable_name(Identifier("enhancement"))
831
+
832
+ model_type_getter = cpp_naming.getter_name(Identifier("model_type"))
833
+
834
+ body = Stripped(
835
+ f"""\
836
+ std::shared_ptr<E> {enhancement_var}(
837
+ {I}{unwrap_name}<E>(that)
838
+ );
839
+ if (!{enhancement_var}) {{
840
+ {I}throw std::invalid_argument(
841
+ {II}common::Concat(
842
+ {III}"Expected an instance of ",
843
+ {III}stringification::to_string(that->{model_type_getter}()),
844
+ {III}" to have been already wrapped with an enhancement, "
845
+ {III}"but it has been not."
846
+ {II})
847
+ {I});
848
+ }}
849
+ return {enhancement_var};"""
850
+ )
851
+
852
+ return Stripped(
853
+ f"""\
854
+ /**
855
+ * Unwrap the enhancement from \\p that instance.
856
+ *
857
+ * \\remark \\p that instance must have been wrapped before.
858
+ *
859
+ * \\param that instance expected to be wrapped with an enhancement
860
+ * \\return the enhancement
861
+ * \\throw std::invalid_argument if \\p that instance has not been wrapped
862
+ * \\tparam E type of the enhancement
863
+ */
864
+ template <typename E>
865
+ std::shared_ptr<E> {function_name}(
866
+ {I}const std::shared_ptr<types::IClass>& that
867
+ ) {{
868
+ {I}{indent_but_first_line(body, I)}
869
+ }}"""
870
+ )
871
+
872
+
873
+ # fmt: off
874
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
875
+ @ensure(
876
+ lambda result:
877
+ not (result[0] is not None) or result[0].endswith('\n'),
878
+ "Trailing newline mandatory for valid end-of-files"
879
+ )
880
+ # fmt: on
881
+ def generate_header(
882
+ symbol_table: intermediate.SymbolTable,
883
+ library_namespace: Stripped,
884
+ ) -> Tuple[Optional[str], Optional[List[Error]]]:
885
+ """Generate the C++ code for wrapping model classes with custom enhancements."""
886
+ namespace = Stripped(f"{library_namespace}::enhancing")
887
+
888
+ include_guard_var = cpp_common.include_guard_var(namespace)
889
+
890
+ include_prefix_path = cpp_common.generate_include_prefix_path(library_namespace)
891
+
892
+ blocks = [
893
+ Stripped(
894
+ f"""\
895
+ #ifndef {include_guard_var}
896
+ #define {include_guard_var}"""
897
+ ),
898
+ cpp_common.WARNING,
899
+ Stripped(
900
+ f"""\
901
+ #include "{include_prefix_path}/common.hpp"
902
+ #include "{include_prefix_path}/stringification.hpp"
903
+ #include "{include_prefix_path}/types.hpp"
904
+
905
+ #pragma warning(push, 0)
906
+ #include <sstream>
907
+ #include <stdexcept>
908
+ #pragma warning(pop)"""
909
+ ),
910
+ cpp_common.generate_namespace_opening(library_namespace),
911
+ Stripped(
912
+ """\
913
+ /**
914
+ * \\defgroup enhancing Enhance instances of the model with your custom enhancements.
915
+ * @{
916
+ */
917
+ namespace enhancing {"""
918
+ ),
919
+ Stripped("// region Forward declarations"),
920
+ *_generate_wrap_forward_declarations(symbol_table=symbol_table),
921
+ Stripped("// endregion Forward declarations"),
922
+ Stripped(
923
+ """\
924
+ /// \\cond HIDDEN
925
+ namespace impl {"""
926
+ ),
927
+ _generate_enhanced_interface_definition(),
928
+ *[_generate_enhanced_class(cls) for cls in symbol_table.concrete_classes],
929
+ *[_generate_concrete_wrap(cls=cls) for cls in symbol_table.concrete_classes],
930
+ Stripped(
931
+ f"""\
932
+ /**
933
+ * Assert that the \\p that instance has not been already enhanced.
934
+ *
935
+ * \\param that instance to be checked
936
+ * \\tparam E type of the enhancement
937
+ * \\tparam T interface type of \\p that instance
938
+ * \\throw std::logic_error if \\p that already enhanced
939
+ */
940
+ template<
941
+ {I}typename E,
942
+ {I}typename T,
943
+ {I}typename std::enable_if<
944
+ {II}std::is_base_of<types::IClass, T>::value
945
+ {I}>::type* = nullptr
946
+ >
947
+ void AssertNotEnhanced(
948
+ {I}const std::shared_ptr<T>& that
949
+ ) {{
950
+ {I}std::shared_ptr<impl::IEnhanced<E> > enhanced(
951
+ {II}std::dynamic_pointer_cast<
952
+ {III}impl::IEnhanced<E>
953
+ {II}>(that)
954
+ {I});
955
+ {I}if (enhanced != nullptr) {{
956
+ {II}throw std::logic_error(
957
+ {III}common::Concat(
958
+ {IIII}"An instance of ",
959
+ {IIII}stringification::to_string(that->model_type()),
960
+ {IIII}" has been already wrapped."
961
+ {III})
962
+ {II});
963
+ {I}}}
964
+ }}"""
965
+ ),
966
+ Stripped(
967
+ """\
968
+ } // namespace impl
969
+ /// \\endcond"""
970
+ ),
971
+ *_generate_wrap(symbol_table),
972
+ _generate_unwrap(),
973
+ _generate_must_unwrap(),
974
+ Stripped(
975
+ """\
976
+ } // namespace enhancing
977
+ /**@}*/"""
978
+ ),
979
+ cpp_common.generate_namespace_closing(library_namespace),
980
+ cpp_common.WARNING,
981
+ Stripped(f"#endif // {include_guard_var}"),
982
+ ]
983
+
984
+ writer = io.StringIO()
985
+ for i, block in enumerate(blocks):
986
+ if i > 0:
987
+ writer.write("\n\n")
988
+
989
+ writer.write(block)
990
+
991
+ writer.write("\n")
992
+
993
+ return writer.getvalue(), None