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,311 @@
1
+ """Infer the constraints on a property based on regular expressions."""
2
+ from typing import (
3
+ Optional,
4
+ List,
5
+ MutableMapping,
6
+ Sequence,
7
+ Mapping,
8
+ cast,
9
+ Iterator,
10
+ )
11
+
12
+ from icontract import require
13
+
14
+ from aas_core_codegen import intermediate
15
+ from aas_core_codegen.common import Identifier
16
+ from aas_core_codegen.infer_for_schema import match as infer_for_schema_match
17
+ from aas_core_codegen.infer_for_schema._types import PatternConstraint
18
+ from aas_core_codegen.parse import tree as parse_tree
19
+
20
+
21
+ class PatternVerificationsByName(Mapping[Identifier, intermediate.PatternVerification]):
22
+ """Map verification functions based on patterns by their names."""
23
+
24
+ # fmt: off
25
+ # noinspection PyAbstractClass
26
+ @require(
27
+ lambda mapping:
28
+ all(
29
+ name == func.name
30
+ for name, func in mapping.items()
31
+ )
32
+ )
33
+ # fmt: on
34
+ def __new__(
35
+ cls, mapping: Mapping[Identifier, intermediate.PatternVerification]
36
+ ) -> "PatternVerificationsByName":
37
+ return cast(PatternVerificationsByName, mapping)
38
+
39
+ def __getitem__(self, k: Identifier) -> intermediate.PatternVerification:
40
+ # Only for type annotation
41
+ raise NotImplementedError()
42
+
43
+ def __iter__(self) -> Iterator[Identifier]:
44
+ # Only for type annotation
45
+ raise NotImplementedError()
46
+
47
+ def __len__(self) -> int:
48
+ # Only for type annotation
49
+ raise NotImplementedError()
50
+
51
+
52
+ def map_pattern_verifications_by_name(
53
+ verifications: Sequence[intermediate.Verification],
54
+ ) -> PatternVerificationsByName:
55
+ """
56
+ Go over all verifications and map the pattern verifications by their name.
57
+
58
+ The verifications which do not perform pattern matching are ignored.
59
+ """
60
+ result = (
61
+ dict()
62
+ ) # type: MutableMapping[Identifier, intermediate.PatternVerification]
63
+
64
+ for verification in verifications:
65
+ if isinstance(verification, intermediate.PatternVerification):
66
+ result[verification.name] = verification
67
+
68
+ return PatternVerificationsByName(result)
69
+
70
+
71
+ class _ConstraintOnProperty:
72
+ """Represent a match on an expression like ``is_ID_short(self.something)``."""
73
+
74
+ def __init__(self, prop_name: Identifier, constraint: PatternConstraint) -> None:
75
+ """Initialize with the given values."""
76
+ self.prop_name = prop_name
77
+ self.constraint = constraint
78
+
79
+
80
+ def _match_constraint_on_property(
81
+ node: parse_tree.Node, pattern_verifications_by_name: PatternVerificationsByName
82
+ ) -> Optional[_ConstraintOnProperty]:
83
+ """
84
+ Match the pattern constraints on a property.
85
+
86
+ Return the match, or None if not matched.
87
+ """
88
+ if not isinstance(node, parse_tree.FunctionCall):
89
+ return None
90
+
91
+ if len(node.args) != 1:
92
+ return None
93
+
94
+ prop_name = infer_for_schema_match.try_property(node.args[0])
95
+ if prop_name is None:
96
+ return None
97
+
98
+ pattern_verification = pattern_verifications_by_name.get(node.name.identifier, None)
99
+ if pattern_verification is None:
100
+ return None
101
+
102
+ return _ConstraintOnProperty(
103
+ prop_name=prop_name,
104
+ constraint=PatternConstraint(pattern=pattern_verification.pattern),
105
+ )
106
+
107
+
108
+ def patterns_from_invariants(
109
+ cls: intermediate.Class,
110
+ pattern_verifications_by_name: PatternVerificationsByName,
111
+ ) -> MutableMapping[intermediate.Property, List[PatternConstraint]]:
112
+ """
113
+ Infer the pattern constraints for every property of the class ``cls``.
114
+
115
+ Even if a property is optional, the constraint will still be inferred, since
116
+ schemas usually separate constraints from defining optional/required fields
117
+ (*e.g.*, see JSON schema).
118
+
119
+ The constraints are not exhaustive. We only infer constraints based on invariants
120
+ which involve pre-defined list of functions. It might be that the actual invariants
121
+ are tighter.
122
+
123
+ The list of patterns means that *all* the patterns need to be satisfied, *i.e.*
124
+ there is a conjunction of patterns.
125
+ """
126
+ # NOTE (mristin, 2021-11-30):
127
+ # We iterate only once through the invariants instead of inferring the constraints
128
+ # for each property individually to be able to keep linear time complexity.
129
+
130
+ constraints_on_props = [] # type: List[_ConstraintOnProperty]
131
+
132
+ for invariant in cls.invariants:
133
+ # NOTE (mristin, 2022-01-02):
134
+ # We consider only the genuine invariants of the class, and ignore
135
+ # the invariants of its ancestors.
136
+ if invariant.specified_for is not cls:
137
+ continue
138
+
139
+ # Match something like ``self.something is None or is_ID_short(self.something)``
140
+ conditional_on_prop = infer_for_schema_match.try_conditional_on_prop(
141
+ invariant.body
142
+ )
143
+
144
+ if conditional_on_prop is not None:
145
+ # Match something like
146
+ # ``is_ID_short(self.something) and is_MIME(self.something)``
147
+ if isinstance(conditional_on_prop.consequent, parse_tree.And):
148
+ for value_node in conditional_on_prop.consequent.values:
149
+ constraint_on_prop = _match_constraint_on_property(
150
+ node=value_node,
151
+ pattern_verifications_by_name=pattern_verifications_by_name,
152
+ )
153
+
154
+ if (
155
+ constraint_on_prop is not None
156
+ and constraint_on_prop.prop_name
157
+ == conditional_on_prop.prop_name
158
+ ):
159
+ constraints_on_props.append(constraint_on_prop)
160
+
161
+ # Match something like ``is_ID_short(self.something)``
162
+ elif isinstance(conditional_on_prop.consequent, parse_tree.FunctionCall):
163
+ constraint_on_prop = _match_constraint_on_property(
164
+ node=conditional_on_prop.consequent,
165
+ pattern_verifications_by_name=pattern_verifications_by_name,
166
+ )
167
+
168
+ if constraint_on_prop is not None:
169
+ constraints_on_props.append(constraint_on_prop)
170
+
171
+ else:
172
+ # No match
173
+ pass
174
+
175
+ else:
176
+ # Match something like
177
+ # ``is_ID_short(self.something) and is_MIME(self.something)``
178
+ if isinstance(invariant.body, parse_tree.And):
179
+ for value_node in invariant.body.values:
180
+ constraint_on_prop = _match_constraint_on_property(
181
+ node=value_node,
182
+ pattern_verifications_by_name=pattern_verifications_by_name,
183
+ )
184
+
185
+ if constraint_on_prop is not None:
186
+ constraints_on_props.append(constraint_on_prop)
187
+
188
+ # Match something like ``is_ID_short(self.something)``
189
+ elif isinstance(invariant.body, parse_tree.FunctionCall):
190
+ constraint_on_prop = _match_constraint_on_property(
191
+ node=invariant.body,
192
+ pattern_verifications_by_name=pattern_verifications_by_name,
193
+ )
194
+
195
+ if constraint_on_prop is not None:
196
+ constraints_on_props.append(constraint_on_prop)
197
+
198
+ else:
199
+ # No match
200
+ pass
201
+
202
+ # endregion
203
+
204
+ # region Group the constraints by property
205
+
206
+ result = (
207
+ dict()
208
+ ) # type: MutableMapping[intermediate.Property, List[PatternConstraint]]
209
+
210
+ for constraint_on_prop in constraints_on_props:
211
+ prop = cls.properties_by_name.get(constraint_on_prop.prop_name, None)
212
+ if prop is None:
213
+ continue
214
+
215
+ constraints_for_prop = result.get(prop, None)
216
+ if constraints_for_prop is None:
217
+ constraints_for_prop = []
218
+ result[prop] = constraints_for_prop
219
+
220
+ constraints_for_prop.append(constraint_on_prop.constraint)
221
+
222
+ # endregion
223
+
224
+ return result
225
+
226
+
227
+ def _match_pattern_on_self(
228
+ node: parse_tree.Node, pattern_verifications_by_name: PatternVerificationsByName
229
+ ) -> Optional[PatternConstraint]:
230
+ """
231
+ Match the pattern constraints on ``self``.
232
+
233
+ Return the match, or None if not matched.
234
+ """
235
+ if not isinstance(node, parse_tree.FunctionCall):
236
+ return None
237
+
238
+ if len(node.args) != 1:
239
+ return None
240
+
241
+ if not isinstance(node.args[0], parse_tree.Name):
242
+ return None
243
+
244
+ # noinspection PyUnresolvedReferences
245
+ if node.args[0].identifier != "self":
246
+ return None
247
+
248
+ pattern_verification = pattern_verifications_by_name.get(node.name.identifier, None)
249
+ if pattern_verification is None:
250
+ return None
251
+
252
+ return PatternConstraint(pattern=pattern_verification.pattern)
253
+
254
+
255
+ # fmt: off
256
+ @require(
257
+ lambda constrained_primitive:
258
+ constrained_primitive.constrainee == intermediate.PrimitiveType.STR,
259
+ "Infer only patterns on constrained strings"
260
+ )
261
+ # fmt: on
262
+ def infer_patterns_on_self(
263
+ constrained_primitive: intermediate.ConstrainedPrimitive,
264
+ pattern_verifications_by_name: PatternVerificationsByName,
265
+ ) -> List[PatternConstraint]:
266
+ """
267
+ Infer the pattern constraints for the constrained string ``constrained_primitive``.
268
+
269
+ The constraints are not exhaustive. We only infer constraints based on invariants
270
+ which involve pre-defined list of functions. It might be that the actual invariants
271
+ are tighter.
272
+
273
+ The list of patterns means that *all* the patterns need to be satisfied, *i.e.*
274
+ there is a conjunction of patterns.
275
+ """
276
+ result = [] # type: List[PatternConstraint]
277
+
278
+ for invariant in constrained_primitive.invariants:
279
+ # NOTE (mristin, 2022-01-02):
280
+ # We consider only the genuine invariants of the constrained primitive, and
281
+ # ignore the invariants of its ancestors.
282
+ if invariant.specified_for is not constrained_primitive:
283
+ continue
284
+
285
+ # Match something like
286
+ # ``is_ID_short(self) and is_MIME(self)``
287
+ if isinstance(invariant.body, parse_tree.And):
288
+ for value_node in invariant.body.values:
289
+ pattern_on_self = _match_pattern_on_self(
290
+ node=value_node,
291
+ pattern_verifications_by_name=pattern_verifications_by_name,
292
+ )
293
+
294
+ if pattern_on_self is not None:
295
+ result.append(pattern_on_self)
296
+
297
+ # Match something like ``is_ID_short(self)``
298
+ elif isinstance(invariant.body, parse_tree.FunctionCall):
299
+ pattern_on_self = _match_pattern_on_self(
300
+ node=invariant.body,
301
+ pattern_verifications_by_name=pattern_verifications_by_name,
302
+ )
303
+
304
+ if pattern_on_self is not None:
305
+ result.append(pattern_on_self)
306
+
307
+ else:
308
+ # No match
309
+ pass
310
+
311
+ return result
@@ -0,0 +1,394 @@
1
+ """Infer the constraints on a property based on constant sets."""
2
+ import collections
3
+ from typing import Optional, Tuple, MutableMapping, List, Mapping, Union, Sequence
4
+
5
+ from icontract import ensure, require
6
+
7
+ from aas_core_codegen.common import Identifier, Error, assert_never
8
+ from aas_core_codegen.infer_for_schema._types import (
9
+ SetOfPrimitivesConstraint,
10
+ SetOfEnumerationLiteralsConstraint,
11
+ )
12
+ from aas_core_codegen.parse import tree as parse_tree
13
+ from aas_core_codegen import intermediate
14
+ from aas_core_codegen.infer_for_schema import match as infer_for_schema_match
15
+
16
+
17
+ class _PropNameInNamedContainer:
18
+ """Hold the information for matches of the form ``self.something in X``."""
19
+
20
+ def __init__(
21
+ self, prop_name: Identifier, container_name: Identifier, node: parse_tree.IsIn
22
+ ) -> None:
23
+ """Initialize with the given values."""
24
+ self.prop_name = prop_name
25
+ self.container_name = container_name
26
+ self.node = node
27
+
28
+
29
+ def _match_prop_in_named_container(
30
+ node: parse_tree.Node,
31
+ ) -> Optional[_PropNameInNamedContainer]:
32
+ """Match the expression ``self.something in Something``."""
33
+ if not isinstance(node, parse_tree.IsIn):
34
+ return None
35
+
36
+ prop_name = infer_for_schema_match.try_property(node.member)
37
+ if prop_name is None:
38
+ return None
39
+
40
+ if not isinstance(node.container, parse_tree.Name):
41
+ return None
42
+
43
+ return _PropNameInNamedContainer(
44
+ prop_name=prop_name, container_name=node.container.identifier, node=node
45
+ )
46
+
47
+
48
+ class SetConstraintsByProperty:
49
+ """Group the set constraints by the class properties."""
50
+
51
+ def __init__(
52
+ self,
53
+ set_of_primitives_by_property: Mapping[
54
+ intermediate.Property, SetOfPrimitivesConstraint
55
+ ],
56
+ set_of_enumeration_literals_by_property: Mapping[
57
+ intermediate.Property, SetOfEnumerationLiteralsConstraint
58
+ ],
59
+ ) -> None:
60
+ """Initialize with the given values."""
61
+ self.set_of_primitives_by_property = set_of_primitives_by_property
62
+ # fmt: off
63
+ self.set_of_enumeration_literals_by_property = (
64
+ set_of_enumeration_literals_by_property
65
+ )
66
+ # fmt: on
67
+
68
+
69
+ class _IntersectionOfPrimitiveSetLiterals:
70
+ """Track an intersection of primitive set literals."""
71
+
72
+ # fmt: off
73
+ @require(
74
+ lambda a_type, literals:
75
+ all(
76
+ literal.a_type is a_type
77
+ for literal in literals
78
+ )
79
+ )
80
+ # fmt: on
81
+ def __init__(
82
+ self,
83
+ a_type: intermediate.PrimitiveType,
84
+ literals: Sequence[intermediate.PrimitiveSetLiteral],
85
+ ) -> None:
86
+ """Initialize with the given set."""
87
+ self.a_type = a_type
88
+ self._literals = literals
89
+
90
+ self._count_by_literal_value = {
91
+ literal.value: 0 for literal in literals
92
+ } # type: MutableMapping[Union[bool, int, float, str, bytearray], int]
93
+
94
+ self._counter = 0
95
+
96
+ # fmt: off
97
+ @require(
98
+ lambda self, literals:
99
+ all(
100
+ literal.a_type is self.a_type
101
+ for literal in literals
102
+ )
103
+ )
104
+ # fmt: on
105
+ def observe(self, literals: Sequence[intermediate.PrimitiveSetLiteral]) -> None:
106
+ """Limit the intersection by the literals in-place."""
107
+ for literal in literals:
108
+ if literal.value in self._count_by_literal_value:
109
+ self._count_by_literal_value[literal.value] += 1
110
+
111
+ self._counter += 1
112
+
113
+ def compute_literals(self) -> List[intermediate.PrimitiveSetLiteral]:
114
+ """Compute the literals contained in the intersection."""
115
+ return [
116
+ literal
117
+ for literal in self._literals
118
+ if self._count_by_literal_value[literal.value] == self._counter
119
+ ]
120
+
121
+
122
+ @require(lambda constraints: len(constraints) >= 1)
123
+ def intersect_set_of_primitives_constraints(
124
+ constraints: Sequence[SetOfPrimitivesConstraint],
125
+ ) -> SetOfPrimitivesConstraint:
126
+ """Compute the intersection over all the primitive set literals."""
127
+ intersection = None # type: Optional[_IntersectionOfPrimitiveSetLiterals]
128
+ for constraint in constraints:
129
+ if intersection is None:
130
+ intersection = _IntersectionOfPrimitiveSetLiterals(
131
+ a_type=constraint.a_type, literals=constraint.literals
132
+ )
133
+ else:
134
+ intersection.observe(literals=constraint.literals)
135
+
136
+ assert intersection is not None
137
+
138
+ return SetOfPrimitivesConstraint(
139
+ a_type=intersection.a_type, literals=intersection.compute_literals()
140
+ )
141
+
142
+
143
+ class _IntersectionOfEnumerationLiterals:
144
+ """Track an intersection of enumeration literals by their Python object ID."""
145
+
146
+ def __init__(self, literals: Sequence[intermediate.EnumerationLiteral]) -> None:
147
+ """Initialize with the given set."""
148
+ self._literals = literals
149
+
150
+ self._count_by_literal_id = {
151
+ id(literal): 0 for literal in literals
152
+ } # type: MutableMapping[int, int]
153
+
154
+ self._counter = 0
155
+
156
+ def observe(self, literals: Sequence[intermediate.EnumerationLiteral]) -> None:
157
+ """Limit the literals in the intersection."""
158
+ for literal in literals:
159
+ if id(literal) in self._count_by_literal_id:
160
+ self._count_by_literal_id[id(literal)] += 1
161
+
162
+ self._counter += 1
163
+
164
+ def compute_literals(self) -> List[intermediate.EnumerationLiteral]:
165
+ """Compute the literals contained in the intersection."""
166
+ return [
167
+ literal
168
+ for literal in self._literals
169
+ if self._count_by_literal_id[id(literal)] == self._counter
170
+ ]
171
+
172
+
173
+ # fmt: off
174
+ @require(
175
+ lambda constraints:
176
+ all(
177
+ constraint.enumeration is constraints[0].enumeration
178
+ for constraint in constraints
179
+ )
180
+ )
181
+ @require(
182
+ lambda constraints:
183
+ all(
184
+ all(
185
+ id(literal) in constraint.enumeration.literal_id_set
186
+ for literal in constraint.literals
187
+ )
188
+ for constraint in constraints
189
+ )
190
+ )
191
+ @require(
192
+ lambda constraints:
193
+ len(constraints) >= 1
194
+ )
195
+ # fmt: on
196
+ def intersect_set_of_enumeration_literals_constraints(
197
+ constraints: Sequence[SetOfEnumerationLiteralsConstraint],
198
+ ) -> SetOfEnumerationLiteralsConstraint:
199
+ """Compute the intersection over all the set literals."""
200
+ enumeration = None # type: Optional[intermediate.Enumeration]
201
+ intersection = None # type: Optional[_IntersectionOfEnumerationLiterals]
202
+
203
+ for constraint in constraints:
204
+ if intersection is None:
205
+ enumeration = constraint.enumeration
206
+
207
+ intersection = _IntersectionOfEnumerationLiterals(
208
+ literals=constraint.literals
209
+ )
210
+ else:
211
+ intersection.observe(literals=constraint.literals)
212
+
213
+ assert enumeration is not None
214
+ assert intersection is not None
215
+
216
+ return SetOfEnumerationLiteralsConstraint(
217
+ enumeration=enumeration, literals=intersection.compute_literals()
218
+ )
219
+
220
+
221
+ # fmt: off
222
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
223
+ def infer_set_constraints_by_property_from_invariants(
224
+ cls: intermediate.Class,
225
+ symbol_table: intermediate.SymbolTable
226
+ ) -> Tuple[
227
+ Optional[SetConstraintsByProperty],
228
+ Optional[List[Error]]
229
+ ]:
230
+ # fmt: on
231
+ """
232
+ Match all the named constant sets that a property needs to belong to.
233
+
234
+ Even if a property is optional, the constraint will still be inferred.
235
+
236
+ The constraints are not exhaustive. We only infer constraints based on invariants
237
+ which involve constant sets. It might be that the actual invariants are tighter.
238
+ """
239
+ errors = [] # type: List[Error]
240
+
241
+ # fmt: off
242
+ sets_of_primitives_by_property: MutableMapping[
243
+ intermediate.Property,
244
+ List[SetOfPrimitivesConstraint]
245
+ ] = collections.defaultdict(lambda: [])
246
+ # fmt: on
247
+
248
+ # fmt: off
249
+ sets_of_enumeration_literals_by_property: MutableMapping[
250
+ intermediate.Property, List[SetOfEnumerationLiteralsConstraint]
251
+ ] = collections.defaultdict(lambda: [])
252
+ # fmt: on
253
+
254
+ # region Collect
255
+
256
+ for invariant in cls.invariants:
257
+ # NOTE (mristin, 2022-07-08):
258
+ # We consider only the genuine invariants of the class, and ignore
259
+ # the invariants of its ancestors.
260
+
261
+ if invariant.specified_for is not cls:
262
+ continue
263
+
264
+ # Match ``not (self.something is not None) or self.something in X``
265
+ conditional_on_prop = infer_for_schema_match.try_conditional_on_prop(
266
+ invariant.body
267
+ )
268
+ if conditional_on_prop is not None:
269
+ node = conditional_on_prop.consequent
270
+ else:
271
+ # Match ``self.something in X``
272
+ node = invariant.body
273
+
274
+ matches = [] # type: List[_PropNameInNamedContainer]
275
+
276
+ if isinstance(node, parse_tree.And):
277
+ for value_node in node.values:
278
+ match = _match_prop_in_named_container(value_node)
279
+ if match is not None:
280
+ matches.append(match)
281
+ else:
282
+ match = _match_prop_in_named_container(node)
283
+ if match is not None:
284
+ matches.append(match)
285
+
286
+ for match in matches:
287
+ prop = cls.properties_by_name.get(match.prop_name, None)
288
+ if prop is None:
289
+ errors.append(
290
+ Error(
291
+ match.node.member.original_node,
292
+ f"The property {match.prop_name!r} does not "
293
+ f"belong to the class {cls.name!r}"
294
+ )
295
+ )
296
+ continue
297
+
298
+ constant = symbol_table.constants_by_name.get(match.container_name, None)
299
+ if constant is None:
300
+ continue
301
+
302
+ type_anno = intermediate.beneath_optional(prop.type_annotation)
303
+
304
+ if isinstance(constant, intermediate.ConstantPrimitive):
305
+ continue
306
+ elif isinstance(constant, intermediate.ConstantSetOfPrimitives):
307
+ prop_primitive_type = intermediate.try_primitive_type(type_anno)
308
+
309
+ if prop_primitive_type is not constant.a_type:
310
+ errors.append(
311
+ Error(
312
+ match.node.container.original_node,
313
+ f"The container is a constant set "
314
+ f"of {constant.a_type.value}'s while "
315
+ f"the property {prop.name!r} in class {cls.name!r} "
316
+ f"has type {prop.type_annotation}"
317
+ )
318
+ )
319
+ continue
320
+
321
+ sets_of_primitives_by_property[prop].append(
322
+ SetOfPrimitivesConstraint(
323
+ a_type=constant.a_type,
324
+ literals=constant.literals
325
+ )
326
+ )
327
+
328
+ elif isinstance(constant, intermediate.ConstantSetOfEnumerationLiterals):
329
+ if not (
330
+ isinstance(type_anno, intermediate.OurTypeAnnotation)
331
+ and isinstance(type_anno.our_type, intermediate.Enumeration)
332
+ and (type_anno.our_type is constant.enumeration)
333
+ ):
334
+ errors.append(
335
+ Error(
336
+ match.node.container.original_node,
337
+ f"The container is a constant set "
338
+ f"of enumeration literals of {constant.enumeration.name} "
339
+ f"while the property {prop.name!r} in class {cls.name!r} "
340
+ f"has type {prop.type_annotation}"
341
+ )
342
+ )
343
+ continue
344
+
345
+ sets_of_enumeration_literals_by_property[prop].append(
346
+ SetOfEnumerationLiteralsConstraint(
347
+ enumeration=constant.enumeration,
348
+ literals=constant.literals
349
+ )
350
+ )
351
+
352
+ else:
353
+ assert_never(constant)
354
+
355
+ if len(errors) > 0:
356
+ return None, errors
357
+
358
+ # endregion
359
+
360
+ # region Reduce
361
+
362
+ # fmt: off
363
+ set_of_primitives_by_property: MutableMapping[
364
+ intermediate.Property,
365
+ SetOfPrimitivesConstraint
366
+ ] = dict()
367
+ # fmt: on
368
+
369
+ # fmt: off
370
+ set_of_enumeration_literals_by_property: MutableMapping[
371
+ intermediate.Property, SetOfEnumerationLiteralsConstraint
372
+ ] = dict()
373
+ # fmt: on
374
+
375
+ for prop, set_of_primitives_constraints in sets_of_primitives_by_property.items():
376
+ set_of_primitives_by_property[prop] = intersect_set_of_primitives_constraints(
377
+ constraints=set_of_primitives_constraints
378
+ )
379
+
380
+ for prop, set_of_enumeration_literals_constraints in (
381
+ sets_of_enumeration_literals_by_property.items()
382
+ ):
383
+ set_of_enumeration_literals_by_property[prop] = (
384
+ intersect_set_of_enumeration_literals_constraints(
385
+ constraints=set_of_enumeration_literals_constraints
386
+ )
387
+ )
388
+
389
+ # endregion
390
+
391
+ return SetConstraintsByProperty(
392
+ set_of_primitives_by_property=set_of_primitives_by_property,
393
+ set_of_enumeration_literals_by_property=set_of_enumeration_literals_by_property
394
+ ), None