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,820 @@
1
+ """Generate Java code for enhancing model classes."""
2
+
3
+ import io
4
+ import textwrap
5
+ from typing import Tuple, Optional, List
6
+
7
+ from icontract import ensure, require
8
+
9
+ from aas_core_codegen import intermediate, specific_implementations
10
+ from aas_core_codegen.common import (
11
+ Error,
12
+ Identifier,
13
+ assert_never,
14
+ Stripped,
15
+ indent_but_first_line,
16
+ )
17
+ from aas_core_codegen.java import (
18
+ common as java_common,
19
+ naming as java_naming,
20
+ )
21
+ from aas_core_codegen.java.common import (
22
+ INDENT as I,
23
+ INDENT2 as II,
24
+ INDENT3 as III,
25
+ INDENT4 as IIII,
26
+ )
27
+
28
+
29
+ def _generate_delegate_method(method: intermediate.Method) -> Stripped:
30
+ """Generate the delegated method to ``instance``."""
31
+ returns = (
32
+ java_common.generate_type(method.returns)
33
+ if method.returns is not None
34
+ else "void"
35
+ )
36
+
37
+ arg_types_names = [
38
+ (
39
+ java_common.generate_type(arg.type_annotation),
40
+ java_naming.argument_name(arg.name),
41
+ )
42
+ for arg in method.arguments
43
+ ]
44
+
45
+ method_name = java_naming.method_name(method.name)
46
+
47
+ return_prefix = "return " if method.returns is not None else ""
48
+
49
+ if len(method.arguments) == 0:
50
+ return Stripped(
51
+ f"""\
52
+ public {returns} {method_name}() {{
53
+ {I}{return_prefix}instance.{method_name}();
54
+ }}"""
55
+ )
56
+
57
+ arguments_definition = ",\n".join(
58
+ f"{arg_type} {arg_name}" for arg_type, arg_name in arg_types_names
59
+ )
60
+
61
+ arguments_delegation = ",\n".join(arg_name for _, arg_name in arg_types_names)
62
+
63
+ return Stripped(
64
+ f"""\
65
+ public {returns} {method_name}(
66
+ {I}{indent_but_first_line(arguments_definition, I)}
67
+ )
68
+ {{
69
+ {I}{return_prefix}instance.{method_name}(
70
+ {II}{indent_but_first_line(arguments_delegation, II)}
71
+ {I});
72
+ }}"""
73
+ )
74
+
75
+
76
+ def _generate_enhanced_abstract_class(
77
+ package: java_common.PackageIdentifier,
78
+ ) -> java_common.JavaFile:
79
+ enhanced = Stripped(
80
+ f"""\
81
+ public abstract class Enhanced<EnhancementT> {{
82
+ {I}protected final EnhancementT enhancement;
83
+
84
+ {I}protected Enhanced(EnhancementT enhancement) {{
85
+ {II}this.enhancement = enhancement;
86
+ {I}}}
87
+
88
+ {I}EnhancementT getEnhancement() {{
89
+ {II}return enhancement;
90
+ {I}}}
91
+ }}"""
92
+ )
93
+
94
+ blocks = [
95
+ java_common.WARNING,
96
+ Stripped(f"package {package}.enhancing;"),
97
+ enhanced,
98
+ java_common.WARNING,
99
+ ] # type: List[Stripped]
100
+
101
+ code = "\n\n".join(blocks)
102
+
103
+ return java_common.JavaFile(
104
+ Stripped("Enhanced.java"),
105
+ f"{code}\n",
106
+ )
107
+
108
+
109
+ def _generate_unwrapper_class(
110
+ package: java_common.PackageIdentifier,
111
+ ) -> java_common.JavaFile:
112
+ imports = [
113
+ Stripped("import java.util.Optional;"),
114
+ Stripped(f"import {package}.types.model.*;"),
115
+ ] # type: List[Stripped]
116
+
117
+ unwrapper = Stripped(
118
+ f"""\
119
+ /**
120
+ * Unwrap enhancements from the wrapped instances.
121
+ *
122
+ * @param <EnhancementT> structure of the expected enhancement
123
+ */
124
+ public class Unwrapper<EnhancementT> {{
125
+ {I}/**
126
+ {I} * Unwrap the given model instance.
127
+ {I} *
128
+ {I} * @param that model instance to be unwrapped
129
+ {I} * @return Enhancement, or {{@link java.util.Optional#empty()}} if {{@code that}}
130
+ {I} * has not been wrapped yet.
131
+ {I} */
132
+ {I}public Optional<EnhancementT> unwrap(IClass that)
133
+ {I}{{
134
+ {II}if (that instanceof Enhanced) {{
135
+ {III}@SuppressWarnings("unchecked")
136
+ {III}Enhanced<EnhancementT> enhanced = (Enhanced<EnhancementT>) that;
137
+ {III}return Optional.of(enhanced.getEnhancement());
138
+ {II}}} else {{
139
+ {III}return Optional.empty();
140
+ {II}}}
141
+ {I}}}
142
+
143
+ {I}/**
144
+ {I} * Unwrap the given model instance.
145
+ {I} *
146
+ {I} * @param that model instance to be unwrapped
147
+ {I} * @return Enhancement wrapped around {{@code that}}
148
+ {I} */
149
+ {I}public EnhancementT mustUnwrap(IClass that)
150
+ {I}{{
151
+ {II}Optional<EnhancementT> value = unwrap(that);
152
+ {II}if (!value.isPresent()) {{
153
+ {III}throw new IllegalArgumentException(
154
+ {IIII}"Expected the instance to have been wrapped, but it was not: " + that
155
+ {III});
156
+ {II}}}
157
+ {II}return value.get();
158
+ {I}}}
159
+ }}"""
160
+ )
161
+
162
+ blocks = [
163
+ java_common.WARNING,
164
+ Stripped(f"package {package}.enhancing;"),
165
+ Stripped("\n".join(imports)),
166
+ unwrapper,
167
+ java_common.WARNING,
168
+ ] # type: List[Stripped]
169
+
170
+ code = "\n\n".join(blocks)
171
+
172
+ return java_common.JavaFile(
173
+ Stripped("Unwrapper.java"),
174
+ f"{code}\n",
175
+ )
176
+
177
+
178
+ def _generate_enhancer_class(
179
+ package: java_common.PackageIdentifier,
180
+ ) -> java_common.JavaFile:
181
+ imports = [
182
+ Stripped("import java.util.function.Function;"),
183
+ Stripped("import java.util.Optional;"),
184
+ Stripped(f"import {package}.enhancing.Unwrapper;"),
185
+ Stripped(f"import {package}.types.model.*;"),
186
+ ] # type: List[Stripped]
187
+
188
+ enhancer = Stripped(
189
+ f"""\
190
+ /**
191
+ * Wrap and unwrap the instances of model classes with enhancement.
192
+ *
193
+ * @param <EnhancementT> structure of the enhancement
194
+ */
195
+ public class Enhancer<EnhancementT> extends Unwrapper<EnhancementT> {{
196
+ {I}private final Wrapper<EnhancementT> wrapper;
197
+
198
+ {I}/**
199
+ {I} * @param enhancementFactory how to enhance the instances.
200
+ {I} *
201
+ {I} * <p>If it returns {{@code null}}, the instance will not be wrapped. However,
202
+ {I} * the wrapping will continue recursively.
203
+ {I} */
204
+ {I}public Enhancer(
205
+ {II}Function<IClass, Optional<EnhancementT>> enhancementFactory
206
+ {I}) {{
207
+ {II}this.wrapper = new Wrapper<>(enhancementFactory);
208
+ {I}}}
209
+
210
+ {I}/**
211
+ {I} * Wrap the instance with an enhancement.
212
+ {I} *
213
+ {I} * <p>Double wraps are not allowed to prevent runtime leakage.
214
+ {I} *
215
+ {I} * <p>If you use references to the instance objects, you have to update them
216
+ {I} * after the wrapping, as the wrapping is recursive.
217
+ {I} *
218
+ {I} * @param that model instance to be wrapped
219
+ {I} * @return {{@code that}} instance wrapped recursively with enhancements
220
+ {I} */
221
+ {I}public IClass wrap(
222
+ {II}IClass that
223
+ {I}) {{
224
+ {II}IClass wrapped;
225
+ {II}try {{
226
+ {III}wrapped = wrapper.transform(that);
227
+ {II}}} catch (IllegalArgumentException exception) {{
228
+ {III}throw new UnsupportedOperationException(
229
+ {IIII}"Expected the wrapped instance to be an instance of IClass, " +
230
+ {IIII}"but got: " + that
231
+ {III});
232
+ {II}}}
233
+
234
+ {II}return wrapped;
235
+ {I}}}
236
+ }}"""
237
+ )
238
+
239
+ blocks = [
240
+ java_common.WARNING,
241
+ Stripped(f"package {package}.enhancing;"),
242
+ Stripped("\n".join(imports)),
243
+ enhancer,
244
+ java_common.WARNING,
245
+ ] # type: List[Stripped]
246
+
247
+ code = "\n\n".join(blocks)
248
+
249
+ return java_common.JavaFile(
250
+ Stripped("Enhancer.java"),
251
+ f"{code}\n",
252
+ )
253
+
254
+
255
+ # fmt: off
256
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
257
+ @require(lambda cls: not cls.is_implementation_specific)
258
+ def _generate_enhanced_class(
259
+ cls: intermediate.ConcreteClass,
260
+ ) -> Tuple[Optional[Stripped], Optional[Error]]:
261
+ # fmt: on
262
+ """Generate the structure for the enhanced concrete class."""
263
+ enhanced_name = java_naming.class_name(Identifier(f"enhanced_{cls.name}"))
264
+ interface_name = java_naming.interface_name(cls.name)
265
+
266
+ blocks = [
267
+ Stripped(f"private final {interface_name} instance;"),
268
+ Stripped(
269
+ f"""\
270
+ public {enhanced_name}(
271
+ {I}{interface_name} instance,
272
+ {I}EnhancementT enhancement
273
+ ) {{
274
+ {I}super(enhancement);
275
+ {I}this.instance = instance;
276
+ }}"""
277
+ ),
278
+ ] # type: List[Stripped]
279
+
280
+ for prop in cls.properties:
281
+ prop_type = java_common.generate_type(prop.type_annotation)
282
+
283
+ inner_type = java_common.generate_type(
284
+ intermediate.beneath_optional(prop.type_annotation)
285
+ )
286
+
287
+ prop_name = java_naming.property_name(prop.name)
288
+
289
+ getter_name = java_naming.getter_name(prop.name)
290
+
291
+ setter_name = java_naming.setter_name(prop.name)
292
+
293
+ if isinstance(prop_type, intermediate.OptionalTypeAnnotation):
294
+ blocks.append(
295
+ Stripped(
296
+ f"""\
297
+ @Override
298
+ public {prop_type} {getter_name}() {{
299
+ {I}return instance.{getter_name}();
300
+ }}"""
301
+ )
302
+ )
303
+ else:
304
+ blocks.append(
305
+ Stripped(
306
+ f"""\
307
+ @Override
308
+ public {prop_type} {getter_name}() {{
309
+ {I}return instance.{getter_name}();
310
+ }}"""
311
+ )
312
+ )
313
+
314
+ blocks.append(
315
+ Stripped(
316
+ f"""\
317
+ @Override
318
+ public void {setter_name}({inner_type} {prop_name}) {{
319
+ {I}instance.{setter_name}({prop_name});
320
+ }}"""
321
+ )
322
+ )
323
+
324
+ # region OverXOrEmpty getter
325
+
326
+ for prop in cls.properties:
327
+ if isinstance(
328
+ prop.type_annotation, intermediate.OptionalTypeAnnotation
329
+ ) and isinstance(prop.type_annotation.value, intermediate.ListTypeAnnotation):
330
+ prop_name = java_naming.property_name(prop.name)
331
+ method_name = f"over{java_naming.class_name(prop.name)}OrEmpty"
332
+ getter_name = java_naming.getter_name(prop.name)
333
+ items_type = java_common.generate_type(prop.type_annotation.value.items)
334
+
335
+ blocks.append(
336
+ Stripped(
337
+ f"""\
338
+ public Iterable<{items_type}> {method_name}() {{
339
+ {I}return instance.{method_name}();
340
+ }}"""
341
+ )
342
+ )
343
+
344
+ # endregion
345
+
346
+ for method in cls.methods:
347
+ blocks.append(_generate_delegate_method(method))
348
+
349
+ visit_name = java_naming.method_name(Identifier(f"visit_{cls.name}"))
350
+
351
+ transform_name = java_naming.method_name(Identifier(f"transform_{cls.name}"))
352
+
353
+ blocks.extend(
354
+ [
355
+ Stripped(
356
+ f"""\
357
+ public Iterable<IClass> descendOnce() {{
358
+ {I}return instance.descendOnce();
359
+ }}"""
360
+ ),
361
+ Stripped(
362
+ f"""\
363
+ public Iterable<IClass> descend() {{
364
+ {I}return instance.descend();
365
+ }}"""
366
+ ),
367
+ Stripped(
368
+ f"""\
369
+ public void accept(IVisitor visitor) {{
370
+ {I}visitor.{visit_name}(instance);
371
+ }}"""
372
+ ),
373
+ Stripped(
374
+ f"""\
375
+ public <ContextT> void accept(
376
+ {I}IVisitorWithContext<ContextT> visitor,
377
+ {I}ContextT context
378
+ ) {{
379
+ {I}visitor.{visit_name}(instance, context);
380
+ }}"""
381
+ ),
382
+ Stripped(
383
+ f"""\
384
+ public <T> T transform(ITransformer<T> transformer) {{
385
+ {I}return transformer.{transform_name}(instance);
386
+ }}"""
387
+ ),
388
+ Stripped(
389
+ f"""\
390
+ public <ContextT, T> T transform(
391
+ {I}ITransformerWithContext<ContextT, T> transformer,
392
+ {I}ContextT context
393
+ ) {{
394
+ {I}return transformer.{transform_name}(instance, context);
395
+ }}"""
396
+ ),
397
+ ]
398
+ )
399
+
400
+ writer = io.StringIO()
401
+ writer.write(
402
+ f"""\
403
+ public class {enhanced_name}<EnhancementT>
404
+ {I}extends Enhanced<EnhancementT>
405
+ {I}implements {interface_name} {{
406
+ """
407
+ )
408
+
409
+ if len(blocks) > 0:
410
+ for i, block in enumerate(blocks):
411
+ if i > 0:
412
+ writer.write("\n\n")
413
+ writer.write(textwrap.indent(block, I))
414
+ else:
415
+ writer.write("// No properties to wire to instance.")
416
+
417
+ writer.write("\n}")
418
+
419
+ return Stripped(writer.getvalue()), None
420
+
421
+
422
+ # fmt: off
423
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
424
+ # fmt: on
425
+ def _generate_enhanced(
426
+ symbol_table: intermediate.SymbolTable,
427
+ package: java_common.PackageIdentifier,
428
+ spec_impls: specific_implementations.SpecificImplementations,
429
+ ) -> Tuple[Optional[List[java_common.JavaFile]], Optional[List[Error]]]:
430
+ files = [] # type: List[java_common.JavaFile]
431
+
432
+ errors = [] # type: List[Error]
433
+
434
+ for cls in symbol_table.concrete_classes:
435
+ cls_name = java_naming.class_name(cls.name)
436
+
437
+ if cls.is_implementation_specific:
438
+ implementation_key = specific_implementations.ImplementationKey(
439
+ f"Enhancing/Enhanced/{cls.name}.java"
440
+ )
441
+
442
+ code = spec_impls.get(implementation_key, None)
443
+ if code is None:
444
+ errors.append(
445
+ Error(
446
+ cls.parsed.node,
447
+ f"The implementation is missing "
448
+ f"for the implementation-specific class: {implementation_key}",
449
+ )
450
+ )
451
+ continue
452
+
453
+ assert code is not None
454
+
455
+ files.append(
456
+ java_common.JavaFile(
457
+ f"{cls_name}.java",
458
+ f"{code}\n",
459
+ ),
460
+ )
461
+ else:
462
+ code, error = _generate_enhanced_class(cls=cls)
463
+ if error is not None:
464
+ errors.append(error)
465
+ continue
466
+
467
+ assert code is not None
468
+
469
+ imports = [
470
+ Stripped("import java.lang.Iterable;"),
471
+ Stripped("import java.util.Optional;"),
472
+ Stripped("import java.util.List;"),
473
+ Stripped(f"import {package}.visitation.IVisitor;"),
474
+ Stripped(f"import {package}.visitation.IVisitorWithContext;"),
475
+ Stripped(f"import {package}.visitation.ITransformer;"),
476
+ Stripped(f"import {package}.visitation.ITransformerWithContext;"),
477
+ Stripped(f"import {package}.types.enums.*;"),
478
+ Stripped(f"import {package}.types.impl.*;"),
479
+ Stripped(f"import {package}.types.model.*;"),
480
+ ] # type: List[Stripped]
481
+
482
+ blocks = [
483
+ java_common.WARNING,
484
+ Stripped(f"package {package}.enhancing;"),
485
+ Stripped("\n".join(imports)),
486
+ code,
487
+ java_common.WARNING,
488
+ ] # type: List[Stripped]
489
+
490
+ code = Stripped("\n\n".join(blocks))
491
+
492
+ files.append(
493
+ java_common.JavaFile(
494
+ f"Enhanced{cls_name}.java",
495
+ f"{code}\n",
496
+ ),
497
+ )
498
+
499
+ if len(errors) > 0:
500
+ return None, errors
501
+
502
+ return files, None
503
+
504
+
505
+ @require(lambda cls: not cls.is_implementation_specific)
506
+ def _generate_transform(cls: intermediate.ConcreteClass) -> Stripped:
507
+ """Generate the transform method to wrap the instance with an enhancement."""
508
+ blocks = [
509
+ Stripped(
510
+ f"""\
511
+ if (that instanceof Enhanced)
512
+ {{
513
+ {I}throw new IllegalArgumentException(
514
+ {II}"The instance has been already enhanced: " + that
515
+ {I});
516
+ }}"""
517
+ )
518
+ ] # type: List[Stripped]
519
+
520
+ for prop in cls.properties:
521
+ type_anno = intermediate.beneath_optional(prop.type_annotation)
522
+ prop_name = java_naming.property_name(prop.name)
523
+
524
+ optional = isinstance(prop.type_annotation, intermediate.OptionalTypeAnnotation)
525
+
526
+ wrap_stmt: Stripped
527
+
528
+ if isinstance(type_anno, intermediate.PrimitiveTypeAnnotation):
529
+ # We can not enhance primitive types; nothing to do here.
530
+ continue
531
+
532
+ elif isinstance(type_anno, intermediate.OurTypeAnnotation):
533
+ if isinstance(type_anno.our_type, intermediate.Enumeration):
534
+ # We can not enhance enumerations; nothing to do here.
535
+ continue
536
+
537
+ elif isinstance(type_anno.our_type, intermediate.ConstrainedPrimitive):
538
+ # We can not enhance primitive types; nothing to do here.
539
+ continue
540
+
541
+ elif isinstance(
542
+ type_anno.our_type,
543
+ (intermediate.AbstractClass, intermediate.ConcreteClass),
544
+ ):
545
+ getter_name = java_naming.getter_name(prop.name)
546
+ setter_name = java_naming.setter_name(prop.name)
547
+ value_interface_name = java_naming.interface_name(
548
+ type_anno.our_type.name
549
+ )
550
+ transformed_name = java_naming.variable_name(
551
+ Identifier(f"transformed_{prop.name}")
552
+ )
553
+ casted_name = java_naming.variable_name(
554
+ Identifier(f"casted_{prop.name}")
555
+ )
556
+
557
+ stmt = Stripped(
558
+ f"""\
559
+ IClass {transformed_name} = transform({prop_name});
560
+ if (!({transformed_name} instanceof {value_interface_name})) {{
561
+ {I}throw new UnsupportedOperationException(
562
+ {II}"Expected the transformed value to be a {value_interface_name} " +
563
+ {II}", but got: " + {transformed_name}
564
+ {I});
565
+ }}
566
+ {value_interface_name} {casted_name} = ({value_interface_name}) {transformed_name};
567
+ that.{setter_name}({casted_name});"""
568
+ )
569
+
570
+ writer = io.StringIO()
571
+
572
+ if optional:
573
+ writer.write(
574
+ f"""\
575
+ if (that.{getter_name}().isPresent()) {{
576
+ {I}{value_interface_name} {prop_name} = that.{getter_name}().get();
577
+ {I}{indent_but_first_line(stmt, I)}
578
+ }}"""
579
+ )
580
+ else:
581
+ writer.write(
582
+ f"""\
583
+ {value_interface_name} {prop_name} = that.{getter_name}();
584
+ {stmt}"""
585
+ )
586
+
587
+ wrap_stmt = Stripped(writer.getvalue())
588
+ else:
589
+ assert_never(type_anno.our_type)
590
+ elif isinstance(type_anno, intermediate.ListTypeAnnotation):
591
+ # fmt: off
592
+ assert (
593
+ isinstance(type_anno.items, intermediate.OurTypeAnnotation)
594
+ and isinstance(
595
+ type_anno.items.our_type,
596
+ (intermediate.AbstractClass, intermediate.ConcreteClass)
597
+ )
598
+ ), (
599
+ "We handle only lists of classes in the enhancing at the moment. "
600
+ "The meta-model does not contain any other lists, so we wanted to "
601
+ "keep the code as simple as possible, and avoid unrolling. Please "
602
+ "contact the developers if you need this feature."
603
+ )
604
+ # fmt: on
605
+
606
+ item_interface_name = java_naming.interface_name(
607
+ type_anno.items.our_type.name
608
+ )
609
+ transformed_name = java_naming.variable_name(
610
+ Identifier(f"transformed_{prop.name}")
611
+ )
612
+
613
+ getter_name = java_naming.getter_name(prop.name)
614
+
615
+ setter_name = java_naming.setter_name(prop.name)
616
+
617
+ stmt = Stripped(
618
+ f"""\
619
+ List<{item_interface_name}> {transformed_name} = {prop_name}.stream()
620
+ {I}.map(item -> {{
621
+ {II}IClass transformed = transform(item);
622
+ {II}if (!(transformed instanceof {item_interface_name})) {{
623
+ {III}throw new UnsupportedOperationException(
624
+ {IIII}"Expected the transformed value to be a {item_interface_name} " +
625
+ {IIII}", but got: " + transformed
626
+ {III});
627
+ {II}}}
628
+ {II}return ({item_interface_name}) transformed;
629
+ {I}}}).collect(Collectors.toList());
630
+ that.{setter_name}({transformed_name});"""
631
+ )
632
+
633
+ writer = io.StringIO()
634
+
635
+ if optional:
636
+ writer.write(
637
+ f"""\
638
+ if (that.{getter_name}().isPresent()) {{
639
+ {I}List<{item_interface_name}> {prop_name} = that.{getter_name}().get();
640
+ {I}{indent_but_first_line(stmt, I)}
641
+ }}"""
642
+ )
643
+ else:
644
+ writer.write(
645
+ f"""\
646
+ List<{item_interface_name}> {prop_name} = that.{getter_name}();
647
+ {stmt}"""
648
+ )
649
+
650
+ wrap_stmt = Stripped(writer.getvalue())
651
+ else:
652
+ assert_never(type_anno.our_type)
653
+
654
+ blocks.append(wrap_stmt)
655
+
656
+ enhanced_name = java_naming.class_name(Identifier(f"enhanced_{cls.name}"))
657
+
658
+ blocks.append(
659
+ Stripped(
660
+ f"""\
661
+ Optional<EnhancementT> enhancement = enhancementFactory.apply(that);
662
+ return !enhancement.isPresent()
663
+ {I}? that
664
+ {I}: new {enhanced_name}<>(
665
+ {II}that,
666
+ {II}enhancement.get()
667
+ {I});"""
668
+ )
669
+ )
670
+
671
+ interface_name = java_naming.interface_name(cls.name)
672
+ transform_name = java_naming.method_name(Identifier(f"transform_{cls.name}"))
673
+
674
+ blocks_joined = "\n\n".join(blocks)
675
+
676
+ return Stripped(
677
+ f"""\
678
+ @Override
679
+ public IClass {transform_name}(
680
+ {I}{interface_name} that
681
+ ) {{
682
+ {I}{indent_but_first_line(blocks_joined, I)}
683
+ }}"""
684
+ )
685
+
686
+
687
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
688
+ def _generate_wrapper(
689
+ symbol_table: intermediate.SymbolTable,
690
+ package: java_common.PackageIdentifier,
691
+ spec_impls: specific_implementations.SpecificImplementations,
692
+ ) -> Tuple[Optional[java_common.JavaFile], Optional[List[Error]]]:
693
+ """Generate the transformer that wraps an instance with the enhancement."""
694
+ errors = [] # type: List[Error]
695
+ imports = [
696
+ Stripped("import java.util.List;"),
697
+ Stripped("import java.util.Optional;"),
698
+ Stripped("import java.util.function.Function;"),
699
+ Stripped("import java.util.stream.Collectors;"),
700
+ Stripped("import java.util.stream.Stream;"),
701
+ Stripped(f"import {package}.types.model.*;"),
702
+ Stripped(f"import {package}.visitation.AbstractTransformer;"),
703
+ ] # type: List[Stripped]
704
+ body = [
705
+ Stripped(
706
+ "private final Function<IClass, Optional<EnhancementT>> "
707
+ "enhancementFactory;"
708
+ ),
709
+ Stripped(
710
+ f"""\
711
+ Wrapper(
712
+ {I}Function<IClass, Optional<EnhancementT>> enhancementFactory
713
+ ) {{
714
+ {I}this.enhancementFactory = enhancementFactory;
715
+ }}"""
716
+ ),
717
+ ] # type: List[Stripped]
718
+
719
+ for cls in symbol_table.concrete_classes:
720
+ if cls.is_implementation_specific:
721
+ implementation_key = specific_implementations.ImplementationKey(
722
+ f"Enhancing/Wrap/{cls.name}.java"
723
+ )
724
+
725
+ code = spec_impls.get(implementation_key, None)
726
+ if code is None:
727
+ errors.append(
728
+ Error(
729
+ cls.parsed.node,
730
+ f"The implementation is missing "
731
+ f"for the implementation-specific class: {implementation_key}",
732
+ )
733
+ )
734
+ continue
735
+
736
+ body.append(code)
737
+ continue
738
+
739
+ body.append(_generate_transform(cls=cls))
740
+
741
+ writer = io.StringIO()
742
+ writer.write(
743
+ """\
744
+ class Wrapper<EnhancementT> extends AbstractTransformer<IClass> {
745
+ """
746
+ )
747
+
748
+ for i, block in enumerate(body):
749
+ if i > 0:
750
+ writer.write("\n\n")
751
+
752
+ writer.write(textwrap.indent(block, I))
753
+
754
+ writer.write("\n}")
755
+
756
+ blocks = [
757
+ Stripped(java_common.WARNING),
758
+ Stripped(Stripped(f"package {package}.enhancing;")),
759
+ Stripped("\n".join(imports)),
760
+ Stripped(writer.getvalue()),
761
+ Stripped(java_common.WARNING),
762
+ ] # type: List[Stripped]
763
+
764
+ code = Stripped("\n\n".join(blocks))
765
+
766
+ return (
767
+ java_common.JavaFile(
768
+ "Wrapper.java",
769
+ f"{code}\n",
770
+ ),
771
+ None,
772
+ )
773
+
774
+
775
+ # fmt: off
776
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
777
+ # fmt: on
778
+ def generate(
779
+ symbol_table: intermediate.SymbolTable,
780
+ package: java_common.PackageIdentifier,
781
+ spec_impls: specific_implementations.SpecificImplementations,
782
+ ) -> Tuple[Optional[List[java_common.JavaFile]], Optional[List[Error]]]:
783
+ """
784
+ Generate the Java code for enhancing model classes with custom wraps.
785
+
786
+ The ``package`` defines the root Java package.
787
+ """
788
+
789
+ errors = [] # type: List[Error]
790
+
791
+ java_files = [
792
+ _generate_enhanced_abstract_class(package),
793
+ _generate_unwrapper_class(package),
794
+ _generate_enhancer_class(package),
795
+ ] # type: List[java_common.JavaFile]
796
+
797
+ enhanced_files, enhanced_errors = _generate_enhanced(
798
+ symbol_table, package, spec_impls
799
+ )
800
+
801
+ if enhanced_errors is not None:
802
+ errors.extend(enhanced_errors)
803
+ else:
804
+ assert enhanced_files is not None
805
+
806
+ java_files.extend(enhanced_files)
807
+
808
+ wrapper_file, wrapper_errors = _generate_wrapper(symbol_table, package, spec_impls)
809
+
810
+ if wrapper_errors is not None:
811
+ errors.extend(wrapper_errors)
812
+ else:
813
+ assert wrapper_file is not None
814
+
815
+ java_files.append(wrapper_file)
816
+
817
+ if len(errors) > 0:
818
+ return None, errors
819
+
820
+ return java_files, None