expressir 2.4.29-arm-linux-musl

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 (426) hide show
  1. checksums.yaml +7 -0
  2. data/.cargo/config.toml +3 -0
  3. data/.github/scripts/test_installed_gem.rb +34 -0
  4. data/.github/workflows/codeql.yml +35 -0
  5. data/.github/workflows/docs.yml +99 -0
  6. data/.github/workflows/links.yml +100 -0
  7. data/.github/workflows/native-gems.yml +201 -0
  8. data/.github/workflows/rake.yml +19 -0
  9. data/.github/workflows/release.yml +37 -0
  10. data/.github/workflows/rust-ext.yml +41 -0
  11. data/.github/workflows/stress.yml +36 -0
  12. data/.github/workflows/validate_schemas.yml +48 -0
  13. data/.github/workflows/verify_remarks.yml +33 -0
  14. data/.gitignore +55 -0
  15. data/.hound.yml +3 -0
  16. data/.rspec +2 -0
  17. data/.rubocop.yml +18 -0
  18. data/.rubocop_todo.yml +297 -0
  19. data/CHANGELOG.md +159 -0
  20. data/Gemfile +18 -0
  21. data/README.adoc +2783 -0
  22. data/Rakefile +41 -0
  23. data/TODO.bugs/01-stale-transformer-autoload.md +39 -0
  24. data/TODO.bugs/02-parser-class-instance-vars.md +36 -0
  25. data/TODO.bugs/03-builder-mutable-state.md +43 -0
  26. data/TODO.bugs/04-formatter-public-send-dispatch.md +53 -0
  27. data/TODO.bugs/05-anonymous-formatter-subclass.md +45 -0
  28. data/TODO.bugs/06-collection-registry-single-source.md +53 -0
  29. data/TODO.bugs/07-require-relative-cleanup.md +42 -0
  30. data/TODO.bugs/08-require-expressir-in-commands.md +34 -0
  31. data/TODO.bugs/09-parser-split.md +53 -0
  32. data/TODO.bugs/10-to-s-override.md +42 -0
  33. data/TODO.bugs/11-parser-class-variables.md +39 -0
  34. data/TODO.bugs/12-marker-modules-vs-registry.md +64 -0
  35. data/TODO.bugs/13-string-literal-scanner-limitation.md +52 -0
  36. data/TODO.bugs/14-model-formatting-leak.md +30 -0
  37. data/TODO.bugs/15-expression-children-macro.md +27 -0
  38. data/TODO.bugs/16-pretty-formatter-duplication.md +28 -0
  39. data/TODO.bugs/17-snake-case-cache-mutable-constant.md +28 -0
  40. data/TODO.bugs/18-const-get-private-constants.md +30 -0
  41. data/TODO.bugs/19-format-methods-public.md +22 -0
  42. data/TODO.bugs/20-coverage-nested-entities-dedup.md +20 -0
  43. data/TODO.bugs/21-operator-tokens-secondary-dispatch.md +21 -0
  44. data/TODO.bugs/22-builder-fast-path-wrappers.md +32 -0
  45. data/TODO.bugs/23-coverage-inverse-maps.md +21 -0
  46. data/TODO.bugs/24-streaming-builder-complexity.md +19 -0
  47. data/TODO.bugs/25-debug-puts-in-production.md +21 -0
  48. data/TODO.bugs/26-generic-entity-children-misplaced.md +21 -0
  49. data/TODO.bugs/27-package-build-god-method.md +19 -0
  50. data/TODO.bugs/28-package-god-class.md +30 -0
  51. data/TODO.bugs/29-validate-ascii-god-class.md +24 -0
  52. data/TODO.bugs/30-unicode-map-extraction.md +19 -0
  53. data/TODO.bugs/README.md +43 -0
  54. data/TODO.max-perf/01-restore-ci-green.md +36 -0
  55. data/TODO.max-perf/02-streaming-parse-path.md +31 -0
  56. data/TODO.max-perf/03-cli-parallel-opt-in.md +27 -0
  57. data/TODO.max-perf/04-benchmark-harness.md +28 -0
  58. data/TODO.max-perf/05-parallel-fidelity-specs.md +22 -0
  59. data/TODO.max-perf/06-builder-cpu-audit.md +41 -0
  60. data/TODO.max-perf/07-upstream-parsanol-roadmap.md +27 -0
  61. data/TODO.max-perf/08-builder-build-perf.md +45 -0
  62. data/TODO.max-perf/09-grammar-cold-start.md +25 -0
  63. data/TODO.max-perf/10-parser-facade-hygiene.md +23 -0
  64. data/TODO.max-perf/11-ci-green-closeout.md +25 -0
  65. data/TODO.max-perf/12-require-boot-profile.md +25 -0
  66. data/TODO.max-perf/13-key-conversion-specs.md +26 -0
  67. data/TODO.max-perf/14-builder-call-handler-audit.md +28 -0
  68. data/TODO.parity-ee/00-overview.md +76 -0
  69. data/TODO.parity-ee/01-annex-g-rule-extraction.md +41 -0
  70. data/TODO.parity-ee/02-eeng-algorithm-inventory.md +8 -0
  71. data/TODO.parity-ee/03-eeng-oracle-harness.md +33 -0
  72. data/TODO.parity-ee/04-shtolo-concatenate.md +44 -0
  73. data/TODO.parity-ee/05-shtolo-longform-flatten.md +53 -0
  74. data/TODO.parity-ee/06-interface-scheduling-parity.md +47 -0
  75. data/TODO.parity-ee/07-semantic-checks-port.md +35 -0
  76. data/TODO.parity-ee/08-pretty-roundtrip-gate.md +27 -0
  77. data/TODO.parity-ee/09-smrl-index-and-listing.md +22 -0
  78. data/TODO.parity-ee/10-interface-dot-graph.md +21 -0
  79. data/TODO.parity-ee/11-import-eeng-tests.md +79 -0
  80. data/TODO.parity-ee/12-full-check-catalog.md +67 -0
  81. data/TODO.parity-ee/13-population-p21.md +54 -0
  82. data/TODO.parity-ee/14-shtolo-completion.md +44 -0
  83. data/TODO.parity-ee/15-part28-xml.md +51 -0
  84. data/TODO.parity-ee/16-compare-patch.md +48 -0
  85. data/TODO.parity-ee/17-official-tests.md +42 -0
  86. data/TODO.parity-ee/18-mim-mapping.md +47 -0
  87. data/TODO.parity-ee/19-architecture.md +97 -0
  88. data/TODO.parity-ee/parity-matrix.md +108 -0
  89. data/TODO.refpath-v2/00-overview.md +64 -0
  90. data/TODO.suma-improvements/00-overview.md +23 -0
  91. data/TODO.suma-improvements/01-prebuilt-platform-gems.md +33 -0
  92. data/TODO.suma-improvements/02-suma-e2e.md +39 -0
  93. data/TODO.suma-improvements/03-item-graph.md +22 -0
  94. data/TODO.suma-improvements/04-compiled-set-default.md +16 -0
  95. data/TODO.suma-improvements/05-validation-in-docs.md +17 -0
  96. data/TODO.suma-improvements/06-memory-remeasure.md +36 -0
  97. data/TODO.suma-improvements/07-part28-xml.md +15 -0
  98. data/TODO.suma-improvements/08-windows-gnu-toolchain.md +15 -0
  99. data/TODO.suma-improvements/09-checker-tranche3.md +13 -0
  100. data/TODO.suma-improvements/10-expressdoc.md +8 -0
  101. data/benchmark/srl_benchmark.rb +458 -0
  102. data/benchmark/srl_native_benchmark.rb +146 -0
  103. data/benchmark/srl_ruby_benchmark.rb +132 -0
  104. data/bin/console +11 -0
  105. data/bin/rspec +30 -0
  106. data/bin/setup +8 -0
  107. data/docs/Gemfile +12 -0
  108. data/docs/_config.yml +141 -0
  109. data/docs/_guides/changes/changes-format.adoc +778 -0
  110. data/docs/_guides/changes/importing-eengine.adoc +898 -0
  111. data/docs/_guides/changes/index.adoc +396 -0
  112. data/docs/_guides/changes/programmatic-usage.adoc +1038 -0
  113. data/docs/_guides/changes/validating-changes.adoc +681 -0
  114. data/docs/_guides/cli/benchmark-performance.adoc +834 -0
  115. data/docs/_guides/cli/coverage-analysis.adoc +921 -0
  116. data/docs/_guides/cli/format-schemas.adoc +547 -0
  117. data/docs/_guides/cli/index.adoc +8 -0
  118. data/docs/_guides/cli/managing-changes.adoc +927 -0
  119. data/docs/_guides/cli/validate-ascii.adoc +645 -0
  120. data/docs/_guides/cli/validate-schemas.adoc +534 -0
  121. data/docs/_guides/formatter/formatter-architecture.adoc +401 -0
  122. data/docs/_guides/index.adoc +165 -0
  123. data/docs/_guides/ler/creating-packages.adoc +664 -0
  124. data/docs/_guides/ler/index.adoc +305 -0
  125. data/docs/_guides/ler/loading-packages.adoc +707 -0
  126. data/docs/_guides/ler/package-formats.adoc +748 -0
  127. data/docs/_guides/ler/querying-packages.adoc +826 -0
  128. data/docs/_guides/ler/step-packages.adoc +385 -0
  129. data/docs/_guides/ler/validating-packages.adoc +750 -0
  130. data/docs/_guides/liquid/basic-templates.adoc +813 -0
  131. data/docs/_guides/liquid/documentation-generation.adoc +1042 -0
  132. data/docs/_guides/liquid/drops-reference.adoc +829 -0
  133. data/docs/_guides/liquid/filters-and-tags.adoc +912 -0
  134. data/docs/_guides/liquid/index.adoc +468 -0
  135. data/docs/_guides/manifests/creating-manifests.adoc +483 -0
  136. data/docs/_guides/manifests/index.adoc +307 -0
  137. data/docs/_guides/manifests/resolving-manifests.adoc +557 -0
  138. data/docs/_guides/manifests/validating-manifests.adoc +713 -0
  139. data/docs/_guides/ruby-api/formatting-schemas.adoc +605 -0
  140. data/docs/_guides/ruby-api/index.adoc +257 -0
  141. data/docs/_guides/ruby-api/parsing-files.adoc +421 -0
  142. data/docs/_guides/ruby-api/search-engine.adoc +609 -0
  143. data/docs/_guides/ruby-api/working-with-repository.adoc +577 -0
  144. data/docs/_pages/data-model.adoc +665 -0
  145. data/docs/_pages/express-language.adoc +506 -0
  146. data/docs/_pages/getting-started.adoc +414 -0
  147. data/docs/_pages/index.adoc +116 -0
  148. data/docs/_pages/introduction.adoc +256 -0
  149. data/docs/_pages/ler-packages.adoc +837 -0
  150. data/docs/_pages/parsers.adoc +709 -0
  151. data/docs/_pages/schema-manifests.adoc +431 -0
  152. data/docs/_references/index.adoc +228 -0
  153. data/docs/_tutorials/creating-ler-package.adoc +735 -0
  154. data/docs/_tutorials/documentation-coverage.adoc +795 -0
  155. data/docs/_tutorials/formatting-schemas.adoc +89 -0
  156. data/docs/_tutorials/index.adoc +231 -0
  157. data/docs/_tutorials/liquid-templates.adoc +806 -0
  158. data/docs/_tutorials/parsing-your-first-schema.adoc +522 -0
  159. data/docs/_tutorials/querying-schemas.adoc +751 -0
  160. data/docs/_tutorials/working-with-multiple-schemas.adoc +676 -0
  161. data/docs/index.adoc +242 -0
  162. data/docs/lychee.toml +90 -0
  163. data/examples/demo_ler_usage.sh +86 -0
  164. data/examples/ler/README.md +111 -0
  165. data/examples/ler/simple_example.ler +0 -0
  166. data/examples/ler/simple_schema.exp +33 -0
  167. data/examples/ler_build.rb +75 -0
  168. data/examples/ler_cli.rb +79 -0
  169. data/examples/ler_demo_complete.rb +276 -0
  170. data/examples/ler_query.rb +91 -0
  171. data/examples/ler_query_examples.rb +305 -0
  172. data/examples/ler_stats.rb +81 -0
  173. data/examples/phase3_demo.rb +159 -0
  174. data/examples/query_demo_simple.rb +131 -0
  175. data/exe/expressir +11 -0
  176. data/exe/expressir-format +14 -0
  177. data/exe/expressir-format-test +82 -0
  178. data/expressir.gemspec +61 -0
  179. data/lib/expressir/3.2/expressir_core.so +0 -0
  180. data/lib/expressir/3.3/expressir_core.so +0 -0
  181. data/lib/expressir/3.4/expressir_core.so +0 -0
  182. data/lib/expressir/4.0/expressir_core.so +0 -0
  183. data/lib/expressir/benchmark.rb +310 -0
  184. data/lib/expressir/changes/item_change.rb +20 -0
  185. data/lib/expressir/changes/mapping_change.rb +16 -0
  186. data/lib/expressir/changes/schema_change.rb +85 -0
  187. data/lib/expressir/changes/version_change.rb +26 -0
  188. data/lib/expressir/changes.rb +9 -0
  189. data/lib/expressir/cli.rb +148 -0
  190. data/lib/expressir/commands/base.rb +25 -0
  191. data/lib/expressir/commands/benchmark.rb +59 -0
  192. data/lib/expressir/commands/benchmark_cache.rb +80 -0
  193. data/lib/expressir/commands/changes.rb +34 -0
  194. data/lib/expressir/commands/changes_import_eengine.rb +146 -0
  195. data/lib/expressir/commands/changes_validate.rb +63 -0
  196. data/lib/expressir/commands/check.rb +56 -0
  197. data/lib/expressir/commands/clean.rb +20 -0
  198. data/lib/expressir/commands/coverage.rb +458 -0
  199. data/lib/expressir/commands/expand.rb +26 -0
  200. data/lib/expressir/commands/file_violations.rb +70 -0
  201. data/lib/expressir/commands/fix.rb +33 -0
  202. data/lib/expressir/commands/flatten.rb +29 -0
  203. data/lib/expressir/commands/format.rb +43 -0
  204. data/lib/expressir/commands/manifest.rb +420 -0
  205. data/lib/expressir/commands/mapping_validate.rb +68 -0
  206. data/lib/expressir/commands/non_ascii_character.rb +49 -0
  207. data/lib/expressir/commands/non_ascii_violation_collection.rb +301 -0
  208. data/lib/expressir/commands/package.rb +1222 -0
  209. data/lib/expressir/commands/parity_inputs.rb +160 -0
  210. data/lib/expressir/commands/validate.rb +106 -0
  211. data/lib/expressir/commands/validate_ascii.rb +94 -0
  212. data/lib/expressir/commands/validate_load.rb +91 -0
  213. data/lib/expressir/commands/version.rb +9 -0
  214. data/lib/expressir/commands/xsd.rb +23 -0
  215. data/lib/expressir/commands.rb +30 -0
  216. data/lib/expressir/config.rb +60 -0
  217. data/lib/expressir/coverage.rb +510 -0
  218. data/lib/expressir/eengine/arm_compare_report.rb +23 -0
  219. data/lib/expressir/eengine/changes_section.rb +16 -0
  220. data/lib/expressir/eengine/compare_report.rb +69 -0
  221. data/lib/expressir/eengine/mim_compare_report.rb +23 -0
  222. data/lib/expressir/eengine/modified_object.rb +21 -0
  223. data/lib/expressir/eengine.rb +9 -0
  224. data/lib/expressir/errors.rb +113 -0
  225. data/lib/expressir/express/adoc_hyperlink_formatter.rb +30 -0
  226. data/lib/expressir/express/adoc_source_formatter.rb +12 -0
  227. data/lib/expressir/express/ast_key_converter.rb +114 -0
  228. data/lib/expressir/express/builder.rb +277 -0
  229. data/lib/expressir/express/builder_context.rb +22 -0
  230. data/lib/expressir/express/builder_registry.rb +397 -0
  231. data/lib/expressir/express/builders/attribute_decl_builder.rb +32 -0
  232. data/lib/expressir/express/builders/built_in_builder.rb +75 -0
  233. data/lib/expressir/express/builders/constant_builder.rb +108 -0
  234. data/lib/expressir/express/builders/declaration_builder.rb +20 -0
  235. data/lib/expressir/express/builders/derive_clause_builder.rb +14 -0
  236. data/lib/expressir/express/builders/derived_attr_builder.rb +28 -0
  237. data/lib/expressir/express/builders/domain_rule_builder.rb +21 -0
  238. data/lib/expressir/express/builders/entity_decl_builder.rb +116 -0
  239. data/lib/expressir/express/builders/explicit_attr_builder.rb +49 -0
  240. data/lib/expressir/express/builders/expression_builder.rb +416 -0
  241. data/lib/expressir/express/builders/function_decl_builder.rb +86 -0
  242. data/lib/expressir/express/builders/helpers.rb +148 -0
  243. data/lib/expressir/express/builders/interface_builder.rb +151 -0
  244. data/lib/expressir/express/builders/inverse_attr_builder.rb +43 -0
  245. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +30 -0
  246. data/lib/expressir/express/builders/inverse_clause_builder.rb +14 -0
  247. data/lib/expressir/express/builders/literal_builder.rb +93 -0
  248. data/lib/expressir/express/builders/procedure_decl_builder.rb +82 -0
  249. data/lib/expressir/express/builders/qualifier_builder.rb +102 -0
  250. data/lib/expressir/express/builders/reference_builder.rb +18 -0
  251. data/lib/expressir/express/builders/rule_decl_builder.rb +97 -0
  252. data/lib/expressir/express/builders/schema_body_decl_builder.rb +18 -0
  253. data/lib/expressir/express/builders/schema_decl_builder.rb +56 -0
  254. data/lib/expressir/express/builders/schema_version_builder.rb +34 -0
  255. data/lib/expressir/express/builders/simple_id_builder.rb +17 -0
  256. data/lib/expressir/express/builders/statement_builder.rb +243 -0
  257. data/lib/expressir/express/builders/subtype_constraint_builder.rb +166 -0
  258. data/lib/expressir/express/builders/syntax_builder.rb +30 -0
  259. data/lib/expressir/express/builders/type_builder.rb +238 -0
  260. data/lib/expressir/express/builders/type_decl_builder.rb +26 -0
  261. data/lib/expressir/express/builders/unique_clause_builder.rb +20 -0
  262. data/lib/expressir/express/builders/unique_rule_builder.rb +41 -0
  263. data/lib/expressir/express/builders/where_clause_builder.rb +20 -0
  264. data/lib/expressir/express/builders.rb +55 -0
  265. data/lib/expressir/express/cache.rb +76 -0
  266. data/lib/expressir/express/checker.rb +812 -0
  267. data/lib/expressir/express/concatenator.rb +79 -0
  268. data/lib/expressir/express/core.rb +95 -0
  269. data/lib/expressir/express/error.rb +124 -0
  270. data/lib/expressir/express/formatter.rb +149 -0
  271. data/lib/expressir/express/formatters/data_types_formatter.rb +362 -0
  272. data/lib/expressir/express/formatters/declarations_formatter.rb +753 -0
  273. data/lib/expressir/express/formatters/expressions_formatter.rb +180 -0
  274. data/lib/expressir/express/formatters/literals_formatter.rb +55 -0
  275. data/lib/expressir/express/formatters/references_formatter.rb +53 -0
  276. data/lib/expressir/express/formatters/remark_formatter.rb +270 -0
  277. data/lib/expressir/express/formatters/remark_item_formatter.rb +28 -0
  278. data/lib/expressir/express/formatters/statements_formatter.rb +272 -0
  279. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +54 -0
  280. data/lib/expressir/express/formatters.rb +22 -0
  281. data/lib/expressir/express/grammar/parser.rb +712 -0
  282. data/lib/expressir/express/grammar.rb +11 -0
  283. data/lib/expressir/express/hyperlink_formatter.rb +35 -0
  284. data/lib/expressir/express/interface_dot.rb +105 -0
  285. data/lib/expressir/express/lazy_repository.rb +211 -0
  286. data/lib/expressir/express/line_map.rb +48 -0
  287. data/lib/expressir/express/listing.rb +174 -0
  288. data/lib/expressir/express/model_traversal.rb +42 -0
  289. data/lib/expressir/express/model_visitor.rb +25 -0
  290. data/lib/expressir/express/node_position_index.rb +342 -0
  291. data/lib/expressir/express/parallel_files.rb +229 -0
  292. data/lib/expressir/express/parser.rb +523 -0
  293. data/lib/expressir/express/pretty_formatter.rb +586 -0
  294. data/lib/expressir/express/pretty_gate.rb +61 -0
  295. data/lib/expressir/express/refs_overlay.rb +47 -0
  296. data/lib/expressir/express/remark_attacher.rb +1098 -0
  297. data/lib/expressir/express/remark_overlay.rb +86 -0
  298. data/lib/expressir/express/remark_scanner.rb +245 -0
  299. data/lib/expressir/express/resolve_references_model_visitor.rb +29 -0
  300. data/lib/expressir/express/schema_block_scanner.rb +137 -0
  301. data/lib/expressir/express/schema_head_formatter.rb +22 -0
  302. data/lib/expressir/express/schema_plain_source_formatter.rb +11 -0
  303. data/lib/expressir/express/schema_source_formatter.rb +15 -0
  304. data/lib/expressir/express/scope_resolver.rb +223 -0
  305. data/lib/expressir/express/self_schema_reference.rb +126 -0
  306. data/lib/expressir/express/shtolo.rb +679 -0
  307. data/lib/expressir/express/smrl_xml.rb +125 -0
  308. data/lib/expressir/express/source_formatter.rb +15 -0
  309. data/lib/expressir/express/streaming_builder.rb +435 -0
  310. data/lib/expressir/express/xsd.rb +259 -0
  311. data/lib/expressir/express.rb +53 -0
  312. data/lib/expressir/liquid.rb +1 -0
  313. data/lib/expressir/manifest/resolver.rb +210 -0
  314. data/lib/expressir/manifest/validator.rb +192 -0
  315. data/lib/expressir/manifest.rb +6 -0
  316. data/lib/expressir/mapping/refpath.rb +857 -0
  317. data/lib/expressir/mapping.rb +253 -0
  318. data/lib/expressir/model/cache.rb +18 -0
  319. data/lib/expressir/model/concerns.rb +42 -0
  320. data/lib/expressir/model/data_types/aggregate.rb +26 -0
  321. data/lib/expressir/model/data_types/array.rb +25 -0
  322. data/lib/expressir/model/data_types/bag.rb +21 -0
  323. data/lib/expressir/model/data_types/binary.rb +19 -0
  324. data/lib/expressir/model/data_types/boolean.rb +15 -0
  325. data/lib/expressir/model/data_types/enumeration.rb +21 -0
  326. data/lib/expressir/model/data_types/enumeration_item.rb +24 -0
  327. data/lib/expressir/model/data_types/generic.rb +24 -0
  328. data/lib/expressir/model/data_types/generic_entity.rb +24 -0
  329. data/lib/expressir/model/data_types/integer.rb +15 -0
  330. data/lib/expressir/model/data_types/list.rb +23 -0
  331. data/lib/expressir/model/data_types/logical.rb +15 -0
  332. data/lib/expressir/model/data_types/number.rb +15 -0
  333. data/lib/expressir/model/data_types/real.rb +17 -0
  334. data/lib/expressir/model/data_types/select.rb +23 -0
  335. data/lib/expressir/model/data_types/set.rb +21 -0
  336. data/lib/expressir/model/data_types/string.rb +19 -0
  337. data/lib/expressir/model/data_types.rb +25 -0
  338. data/lib/expressir/model/declarations/attribute.rb +38 -0
  339. data/lib/expressir/model/declarations/constant.rb +28 -0
  340. data/lib/expressir/model/declarations/derived_attribute.rb +25 -0
  341. data/lib/expressir/model/declarations/entity.rb +62 -0
  342. data/lib/expressir/model/declarations/function.rb +59 -0
  343. data/lib/expressir/model/declarations/informal_proposition_rule.rb +25 -0
  344. data/lib/expressir/model/declarations/interface.rb +37 -0
  345. data/lib/expressir/model/declarations/interface_item.rb +21 -0
  346. data/lib/expressir/model/declarations/interfaced_item.rb +33 -0
  347. data/lib/expressir/model/declarations/inverse_attribute.rb +25 -0
  348. data/lib/expressir/model/declarations/parameter.rb +28 -0
  349. data/lib/expressir/model/declarations/procedure.rb +57 -0
  350. data/lib/expressir/model/declarations/remark_item.rb +21 -0
  351. data/lib/expressir/model/declarations/rule.rb +66 -0
  352. data/lib/expressir/model/declarations/schema.rb +215 -0
  353. data/lib/expressir/model/declarations/schema_version.rb +19 -0
  354. data/lib/expressir/model/declarations/schema_version_item.rb +19 -0
  355. data/lib/expressir/model/declarations/subtype_constraint.rb +32 -0
  356. data/lib/expressir/model/declarations/type.rb +45 -0
  357. data/lib/expressir/model/declarations/unique_rule.rb +26 -0
  358. data/lib/expressir/model/declarations/variable.rb +28 -0
  359. data/lib/expressir/model/declarations/where_rule.rb +26 -0
  360. data/lib/expressir/model/declarations.rb +31 -0
  361. data/lib/expressir/model/dependency_resolver.rb +268 -0
  362. data/lib/expressir/model/exp_file.rb +42 -0
  363. data/lib/expressir/model/expressions/aggregate_initializer.rb +18 -0
  364. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +20 -0
  365. data/lib/expressir/model/expressions/binary_expression.rb +59 -0
  366. data/lib/expressir/model/expressions/entity_constructor.rb +20 -0
  367. data/lib/expressir/model/expressions/function_call.rb +20 -0
  368. data/lib/expressir/model/expressions/interval.rb +29 -0
  369. data/lib/expressir/model/expressions/query_expression.rb +31 -0
  370. data/lib/expressir/model/expressions/unary_expression.rb +25 -0
  371. data/lib/expressir/model/expressions.rb +18 -0
  372. data/lib/expressir/model/identifier.rb +26 -0
  373. data/lib/expressir/model/indexes/entity_index.rb +103 -0
  374. data/lib/expressir/model/indexes/item_graph.rb +185 -0
  375. data/lib/expressir/model/indexes/reference_index.rb +148 -0
  376. data/lib/expressir/model/indexes/type_index.rb +149 -0
  377. data/lib/expressir/model/indexes.rb +12 -0
  378. data/lib/expressir/model/interface_validator.rb +384 -0
  379. data/lib/expressir/model/literals/binary.rb +17 -0
  380. data/lib/expressir/model/literals/integer.rb +17 -0
  381. data/lib/expressir/model/literals/logical.rb +21 -0
  382. data/lib/expressir/model/literals/real.rb +17 -0
  383. data/lib/expressir/model/literals/string.rb +20 -0
  384. data/lib/expressir/model/literals.rb +13 -0
  385. data/lib/expressir/model/model_element.rb +377 -0
  386. data/lib/expressir/model/references/attribute_reference.rb +19 -0
  387. data/lib/expressir/model/references/group_reference.rb +19 -0
  388. data/lib/expressir/model/references/index_reference.rb +23 -0
  389. data/lib/expressir/model/references/simple_reference.rb +21 -0
  390. data/lib/expressir/model/references.rb +12 -0
  391. data/lib/expressir/model/remark_format.rb +17 -0
  392. data/lib/expressir/model/remark_info.rb +92 -0
  393. data/lib/expressir/model/remark_placement.rb +42 -0
  394. data/lib/expressir/model/repository.rb +483 -0
  395. data/lib/expressir/model/repository_validator.rb +293 -0
  396. data/lib/expressir/model/search_engine.rb +551 -0
  397. data/lib/expressir/model/statements/alias.rb +31 -0
  398. data/lib/expressir/model/statements/assignment.rb +23 -0
  399. data/lib/expressir/model/statements/case.rb +42 -0
  400. data/lib/expressir/model/statements/case_action.rb +20 -0
  401. data/lib/expressir/model/statements/compound.rb +21 -0
  402. data/lib/expressir/model/statements/escape.rb +18 -0
  403. data/lib/expressir/model/statements/if.rb +26 -0
  404. data/lib/expressir/model/statements/null.rb +18 -0
  405. data/lib/expressir/model/statements/procedure_call.rb +22 -0
  406. data/lib/expressir/model/statements/repeat.rb +40 -0
  407. data/lib/expressir/model/statements/return.rb +20 -0
  408. data/lib/expressir/model/statements/skip.rb +18 -0
  409. data/lib/expressir/model/statements.rb +20 -0
  410. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +25 -0
  411. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +17 -0
  412. data/lib/expressir/model/supertype_expressions.rb +12 -0
  413. data/lib/expressir/model.rb +39 -0
  414. data/lib/expressir/package/builder.rb +231 -0
  415. data/lib/expressir/package/metadata.rb +79 -0
  416. data/lib/expressir/package/reader.rb +149 -0
  417. data/lib/expressir/package.rb +8 -0
  418. data/lib/expressir/schema_manifest.rb +159 -0
  419. data/lib/expressir/schema_manifest_entry.rb +15 -0
  420. data/lib/expressir/version.rb +8 -0
  421. data/lib/expressir.rb +94 -0
  422. data/lib/tasks/verify_remarks.rake +16 -0
  423. data/rakelib/native.rake +24 -0
  424. data/rakelib/oracle.rake +52 -0
  425. data/rakelib/verify_remarks.rake +16 -0
  426. metadata +692 -0
@@ -0,0 +1,753 @@
1
+ module Expressir
2
+ module Express
3
+ module Formatters
4
+ module DeclarationsFormatter
5
+ def self.included(base)
6
+ base.register_formatter Model::Declarations::Attribute,
7
+ :format_declarations_attribute
8
+ base.register_formatter Model::Declarations::Constant,
9
+ :format_declarations_constant
10
+ base.register_formatter Model::Declarations::Entity,
11
+ :format_declarations_entity
12
+ base.register_formatter Model::Declarations::Function,
13
+ :format_declarations_function
14
+ base.register_formatter Model::Declarations::Interface,
15
+ :format_declarations_interface
16
+ base.register_formatter Model::Declarations::InterfaceItem,
17
+ :format_declarations_interface_item
18
+ base.register_formatter Model::Declarations::Parameter,
19
+ :format_declarations_parameter
20
+ base.register_formatter Model::Declarations::Procedure,
21
+ :format_declarations_procedure
22
+ base.register_formatter Model::Declarations::Rule,
23
+ :format_declarations_rule
24
+ base.register_formatter Model::Declarations::Schema,
25
+ :format_declarations_schema
26
+ base.register_formatter Model::Declarations::SchemaVersion,
27
+ :format_declarations_schema_version
28
+ base.register_formatter Model::Declarations::SubtypeConstraint,
29
+ :format_declarations_subtype_constraint
30
+ base.register_formatter Model::Declarations::Type,
31
+ :format_declarations_type
32
+ base.register_formatter Model::Declarations::UniqueRule,
33
+ :format_declarations_unique_rule
34
+ base.register_formatter Model::Declarations::Variable,
35
+ :format_declarations_variable
36
+ base.register_formatter Model::Declarations::WhereRule,
37
+ :format_declarations_where_rule
38
+ base.register_formatter Model::Declarations::InformalPropositionRule,
39
+ :format_declarations_informal_proposition_rule
40
+ base.register_formatter Model::Declarations::DerivedAttribute,
41
+ :format_declarations_attribute
42
+ base.register_formatter Model::Declarations::InverseAttribute,
43
+ :format_declarations_attribute
44
+ end
45
+
46
+ def format_declarations_attribute(node)
47
+ [
48
+ *if node.supertype_attribute
49
+ [
50
+ format(node.supertype_attribute),
51
+ " ",
52
+ ].join
53
+ end,
54
+ *if node.supertype_attribute && node.id != node.supertype_attribute.attribute.id
55
+ [
56
+ "RENAMED",
57
+ " ",
58
+ node.id,
59
+ " ",
60
+ ].join
61
+ end,
62
+ *if node.id && !node.supertype_attribute
63
+ [
64
+ node.id,
65
+ " ",
66
+ ].join
67
+ end,
68
+ ":",
69
+ *if node.optional
70
+ [
71
+ " ",
72
+ "OPTIONAL",
73
+ ].join
74
+ end,
75
+ " ",
76
+ format(node.type),
77
+ *if node.kind == Model::Declarations::Attribute::DERIVED
78
+ [
79
+ " ",
80
+ ":=",
81
+ " ",
82
+ format(node.expression),
83
+ ].join
84
+ elsif node.kind == Model::Declarations::Attribute::INVERSE
85
+ [
86
+ " ",
87
+ "FOR",
88
+ " ",
89
+ format(node.expression),
90
+ ].join
91
+ end,
92
+ ";",
93
+ format_inline_tail_remark(node),
94
+ ].join
95
+ end
96
+
97
+ def format_declarations_constant(node)
98
+ [
99
+ node.id,
100
+ " ",
101
+ ":",
102
+ " ",
103
+ format(node.type),
104
+ " ",
105
+ ":=",
106
+ " ",
107
+ format(node.expression),
108
+ ";",
109
+ ].join
110
+ end
111
+
112
+ def format_declarations_entity(node)
113
+ if node.attributes.nil?
114
+ explicit_attributes = []
115
+ derived_attributes = []
116
+ inverse_attributes = []
117
+ else
118
+ explicit_attributes = node.attributes.select do |x|
119
+ x.kind == Model::Declarations::Attribute::EXPLICIT
120
+ end
121
+ derived_attributes = node.attributes.select do |x|
122
+ x.kind == Model::Declarations::Attribute::DERIVED
123
+ end
124
+ inverse_attributes = node.attributes.select do |x|
125
+ x.kind == Model::Declarations::Attribute::INVERSE
126
+ end
127
+ end
128
+
129
+ indent_const = self.class.const_get(:INDENT)
130
+ # Only show preamble remarks if entity has explicit attributes
131
+ preamble = if explicit_attributes&.length&.positive?
132
+ format_preamble_remarks(node, indent(indent_const))
133
+ end
134
+
135
+ [
136
+ [
137
+ "ENTITY",
138
+ " ",
139
+ node.id,
140
+ *if node.abstract && !node.supertype_expression
141
+ [
142
+ "\n",
143
+ indent([
144
+ "ABSTRACT",
145
+ " ",
146
+ "SUPERTYPE",
147
+ ].join),
148
+ ].join
149
+ end,
150
+ *if node.abstract && node.supertype_expression
151
+ [
152
+ "\n",
153
+ indent([
154
+ "ABSTRACT",
155
+ " ",
156
+ "SUPERTYPE",
157
+ " ",
158
+ "OF",
159
+ " ",
160
+ "(",
161
+ format(node.supertype_expression),
162
+ ")",
163
+ ].join),
164
+ ].join
165
+ end,
166
+ *if !node.abstract && node.supertype_expression
167
+ [
168
+ "\n",
169
+ indent([
170
+ "SUPERTYPE",
171
+ " ",
172
+ "OF",
173
+ " ",
174
+ "(",
175
+ format(node.supertype_expression),
176
+ ")",
177
+ ].join),
178
+ ].join
179
+ end,
180
+ *if node.subtype_of&.length&.positive?
181
+ [
182
+ "\n",
183
+ indent([
184
+ "SUBTYPE",
185
+ " ",
186
+ "OF",
187
+ " ",
188
+ "(",
189
+ node.subtype_of.map { |x| format(x) }.join(", "),
190
+ ")",
191
+ ].join),
192
+ ].join
193
+ end,
194
+ ";",
195
+ ].join,
196
+ *if preamble && !preamble.empty?
197
+ preamble.rstrip
198
+ end,
199
+ *if explicit_attributes&.length&.positive?
200
+ indent(explicit_attributes.map { |x| format(x) }.join("\n"))
201
+ end,
202
+ *if derived_attributes&.length&.positive?
203
+ [
204
+ "DERIVE",
205
+ indent(derived_attributes.map { |x| format(x) }.join("\n")),
206
+ ]
207
+ end,
208
+ *if inverse_attributes&.length&.positive?
209
+ [
210
+ "INVERSE",
211
+ indent(inverse_attributes.map { |x| format(x) }.join("\n")),
212
+ ]
213
+ end,
214
+ *if node.unique_rules&.length&.positive?
215
+ [
216
+ "UNIQUE",
217
+ indent(node.unique_rules.map { |x| format(x) }.join("\n")),
218
+ ]
219
+ end,
220
+ *if node.where_rules&.length&.positive?
221
+ [
222
+ "WHERE",
223
+ indent(node.where_rules.map { |x| format(x) }.join("\n")),
224
+ ]
225
+ end,
226
+ [
227
+ "END_ENTITY",
228
+ ";",
229
+ format_end_scope_remark(node),
230
+ ].join,
231
+ ].join("\n")
232
+ end
233
+
234
+ def format_declarations_function(node)
235
+ indent_char = self.class.const_get(:INDENT_CHAR)
236
+ [
237
+ [
238
+ "FUNCTION",
239
+ " ",
240
+ node.id,
241
+ *if node.parameters&.length&.positive?
242
+ parameter_indent = indent_char * "FUNCTION #{node.id}(".length
243
+ [
244
+ "(",
245
+ node.parameters.map do |x|
246
+ format(x)
247
+ end.join(";\n#{parameter_indent}"),
248
+ ")",
249
+ ].join
250
+ end,
251
+ " ",
252
+ ":",
253
+ " ",
254
+ format(node.return_type),
255
+ ";",
256
+ ].join,
257
+ *if node.types&.length&.positive?
258
+ indent(node.types.map { |x| format(x) }.join("\n"))
259
+ end,
260
+ *if node.entities&.length&.positive?
261
+ indent(node.entities.map { |x| format(x) }.join("\n"))
262
+ end,
263
+ *if node.subtype_constraints&.length&.positive?
264
+ indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
265
+ end,
266
+ *if node.functions&.length&.positive?
267
+ indent(node.functions.map { |x| format(x) }.join("\n"))
268
+ end,
269
+ *if node.procedures&.length&.positive?
270
+ indent(node.procedures.map { |x| format(x) }.join("\n"))
271
+ end,
272
+ *if node.constants&.length&.positive?
273
+ indent([
274
+ "CONSTANT",
275
+ indent(node.constants.map { |x| format(x) }.join("\n")),
276
+ [
277
+ "END_CONSTANT",
278
+ ";",
279
+ ].join,
280
+ ].join("\n"))
281
+ end,
282
+ *if node.variables&.length&.positive?
283
+ indent([
284
+ "LOCAL",
285
+ indent(node.variables.map { |x| format(x) }.join("\n")),
286
+ [
287
+ "END_LOCAL",
288
+ ";",
289
+ ].join,
290
+ ].join("\n"))
291
+ end,
292
+ *if node.statements&.length&.positive?
293
+ indent(node.statements.map { |x| format(x) }.join("\n"))
294
+ end,
295
+ *format_trailing_region_remarks(node, :statements).map { |x| indent(x) },
296
+ [
297
+ "END_FUNCTION",
298
+ ";",
299
+ format_end_scope_remark(node),
300
+ ].join,
301
+ ].join("\n")
302
+ end
303
+
304
+ def format_declarations_interface(node)
305
+ indent_char = self.class.const_get(:INDENT_CHAR)
306
+ [
307
+ case node.kind
308
+ when Model::Declarations::Interface::USE then "USE"
309
+ when Model::Declarations::Interface::REFERENCE then "REFERENCE"
310
+ end,
311
+ " ",
312
+ "FROM",
313
+ " ",
314
+ format(node.schema),
315
+ *if node.items&.length&.positive?
316
+ item_indent = indent_char * "(".length
317
+ [
318
+ "\n",
319
+ indent([
320
+ "(",
321
+ node.items.map { |x| format(x) }.join(",\n#{item_indent}"),
322
+ ")",
323
+ ].join),
324
+ ].join
325
+ end,
326
+ ";",
327
+ ].join
328
+ end
329
+
330
+ def format_declarations_interface_item(node)
331
+ [
332
+ format(node.ref),
333
+ *if node.id
334
+ [
335
+ " ",
336
+ "AS",
337
+ " ",
338
+ node.id,
339
+ ]
340
+ end,
341
+ ].join
342
+ end
343
+
344
+ def format_declarations_parameter(node)
345
+ [
346
+ *if node.var
347
+ [
348
+ "VAR",
349
+ " ",
350
+ ].join
351
+ end,
352
+ node.id,
353
+ " ",
354
+ ":",
355
+ " ",
356
+ format(node.type),
357
+ ].join
358
+ end
359
+
360
+ def format_declarations_procedure(node)
361
+ indent_char = self.class.const_get(:INDENT_CHAR)
362
+ [
363
+ [
364
+ "PROCEDURE",
365
+ " ",
366
+ node.id,
367
+ *if node.parameters&.length&.positive?
368
+ parameter_indent = indent_char * "PROCEDURE #{node.id}(".length
369
+ [
370
+ "(",
371
+ node.parameters.map do |x|
372
+ format(x)
373
+ end.join(";\n#{parameter_indent}"),
374
+ ")",
375
+ ].join
376
+ end,
377
+ ";",
378
+ ].join,
379
+ *if node.types&.length&.positive?
380
+ indent(node.types.map { |x| format(x) }.join("\n"))
381
+ end,
382
+ *if node.entities&.length&.positive?
383
+ indent(node.entities.map { |x| format(x) }.join("\n"))
384
+ end,
385
+ *if node.subtype_constraints&.length&.positive?
386
+ indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
387
+ end,
388
+ *if node.functions&.length&.positive?
389
+ indent(node.functions.map { |x| format(x) }.join("\n"))
390
+ end,
391
+ *if node.procedures&.length&.positive?
392
+ indent(node.procedures.map { |x| format(x) }.join("\n"))
393
+ end,
394
+ *if node.constants&.length&.positive?
395
+ indent([
396
+ "CONSTANT",
397
+ indent(node.constants.map { |x| format(x) }.join("\n")),
398
+ [
399
+ "END_CONSTANT",
400
+ ";",
401
+ ].join,
402
+ ].join("\n"))
403
+ end,
404
+ *if node.variables&.length&.positive?
405
+ indent([
406
+ "LOCAL",
407
+ indent(node.variables.map { |x| format(x) }.join("\n")),
408
+ [
409
+ "END_LOCAL",
410
+ ";",
411
+ ].join,
412
+ ].join("\n"))
413
+ end,
414
+ *if node.statements&.length&.positive?
415
+ indent(node.statements.map { |x| format(x) }.join("\n"))
416
+ end,
417
+ *format_trailing_region_remarks(node, :statements).map { |x| indent(x) },
418
+ [
419
+ "END_PROCEDURE",
420
+ ";",
421
+ format_end_scope_remark(node),
422
+ ].join,
423
+ ].join("\n")
424
+ end
425
+
426
+ # True when the statement holds a remark that only it can render.
427
+ # Under no_remarks nothing is emitted anyway, so the statement stays
428
+ # filtered and remark-free output is byte-identical to before.
429
+ def carries_placed_remark?(statement)
430
+ return false if @no_remarks
431
+
432
+ Array(statement.untagged_remarks).any?(&:placement)
433
+ end
434
+
435
+ def format_declarations_rule(node)
436
+ # Filter out statements that only exist to hold remarks in rules
437
+ # (ALIAS/REPEAT with only Null sub-statements, query assignments, or Null statements)
438
+ formatted_statements = []
439
+ if node.statements&.length&.positive?
440
+ formatted_statements = node.statements.reject do |stmt|
441
+ # A statement holding a placed remark is the only thing that can
442
+ # render it, so filtering it would silently drop the comment —
443
+ # and PrettyFormatter, which does not filter, would then produce
444
+ # different content from this formatter.
445
+ if carries_placed_remark?(stmt)
446
+ false
447
+ # Filter ALIAS/REPEAT with only Null statements
448
+ elsif stmt.is_a?(Model::Statements::Alias) || stmt.is_a?(Model::Statements::Repeat)
449
+ stmt.statements&.all?(Model::Statements::Null)
450
+ # Filter query assignments (assignments with QueryExpression that exist only for remarks)
451
+ elsif stmt.is_a?(Model::Statements::Assignment) &&
452
+ stmt.expression.is_a?(Model::Expressions::QueryExpression)
453
+ true
454
+ # Filter Null statements
455
+ elsif stmt.is_a?(Model::Statements::Null)
456
+ true
457
+ else
458
+ false
459
+ end
460
+ end
461
+ end
462
+
463
+ [
464
+ [
465
+ "RULE",
466
+ " ",
467
+ node.id,
468
+ " ",
469
+ "FOR",
470
+ " ",
471
+ "(",
472
+ Array(node.applies_to).map { |x| format(x) }.join(", "),
473
+ ")",
474
+ ";",
475
+ ].join,
476
+ *if node.types&.length&.positive?
477
+ indent(node.types.map { |x| format(x) }.join("\n"))
478
+ end,
479
+ *if node.entities&.length&.positive?
480
+ indent(node.entities.map { |x| format(x) }.join("\n"))
481
+ end,
482
+ *if node.subtype_constraints&.length&.positive?
483
+ indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
484
+ end,
485
+ *if node.functions&.length&.positive?
486
+ indent(node.functions.map { |x| format(x) }.join("\n"))
487
+ end,
488
+ *if node.procedures&.length&.positive?
489
+ indent(node.procedures.map { |x| format(x) }.join("\n"))
490
+ end,
491
+ *if node.constants&.length&.positive?
492
+ indent([
493
+ "CONSTANT",
494
+ indent(node.constants.map { |x| format(x) }.join("\n")),
495
+ [
496
+ "END_CONSTANT",
497
+ ";",
498
+ ].join,
499
+ ].join("\n"))
500
+ end,
501
+ *if node.variables&.length&.positive?
502
+ indent([
503
+ "LOCAL",
504
+ indent(node.variables.map { |x| format(x) }.join("\n")),
505
+ [
506
+ "END_LOCAL",
507
+ ";",
508
+ ].join,
509
+ ].join("\n"))
510
+ end,
511
+ *if formatted_statements.length.positive?
512
+ indent(formatted_statements.map { |x| format(x) }.join("\n"))
513
+ end,
514
+ # A RULE's executable body ends at WHERE, so its trailing
515
+ # remarks belong above that keyword, not after the where rules.
516
+ *format_trailing_region_remarks(node, :statements).map { |x| indent(x) },
517
+ *if node.where_rules&.length&.positive?
518
+ [
519
+ "WHERE",
520
+ indent(node.where_rules.map { |x| format(x) }.join("\n")),
521
+ ]
522
+ end,
523
+ # A comment after the last where rule closes the WHERE section.
524
+ *format_trailing_region_remarks(node, :where_rules).map { |x| indent(x) },
525
+ [
526
+ "END_RULE",
527
+ ";",
528
+ format_end_scope_remark(node),
529
+ ].join,
530
+ ].join("\n")
531
+ end
532
+
533
+ def format_declarations_schema_head(node)
534
+ [
535
+ [
536
+ "SCHEMA",
537
+ " ",
538
+ node.id,
539
+ *if node.version
540
+ [
541
+ " ",
542
+ format(node.version),
543
+ ].join
544
+ end,
545
+ ";",
546
+ ].join,
547
+ *if node.interfaces&.length&.positive?
548
+ [
549
+ "",
550
+ node.interfaces.map { |x| format(x) }.join("\n\n"),
551
+ ]
552
+ end,
553
+ ].join("\n")
554
+ end
555
+
556
+ def format_declarations_schema(node)
557
+ indent_const = self.class.const_get(:INDENT)
558
+ preamble = format_preamble_remarks(node, indent(indent_const))
559
+
560
+ schema_declarations = [
561
+ *if node.constants&.length&.positive?
562
+ [
563
+ "CONSTANT",
564
+ indent(node.constants.map { |x| format(x) }.join("\n")),
565
+ [
566
+ "END_CONSTANT",
567
+ ";",
568
+ ].join,
569
+ ].join("\n")
570
+ end,
571
+ *if node.types&.length&.positive?
572
+ node.types.map { |x| format(x) }
573
+ end,
574
+ *if node.entities&.length&.positive?
575
+ node.entities.map { |x| format(x) }
576
+ end,
577
+ *if node.subtype_constraints&.length&.positive?
578
+ node.subtype_constraints.map { |x| format(x) }
579
+ end,
580
+ *if node.functions&.length&.positive?
581
+ node.functions.map { |x| format(x) }
582
+ end,
583
+ *if node.rules&.length&.positive?
584
+ node.rules.map { |x| format(x) }
585
+ end,
586
+ *if node.procedures&.length&.positive?
587
+ node.procedures.map { |x| format(x) }
588
+ end,
589
+ ]
590
+
591
+ [
592
+ format_declarations_schema_head(node),
593
+ *if preamble && !preamble.empty?
594
+ [
595
+ "",
596
+ preamble.rstrip,
597
+ "",
598
+ ]
599
+ end,
600
+ *if schema_declarations&.length&.positive?
601
+ [
602
+ "",
603
+ schema_declarations.join("\n\n"),
604
+ "",
605
+ ]
606
+ end,
607
+ [
608
+ "END_SCHEMA",
609
+ ";",
610
+ format_end_scope_remark(node),
611
+ ].join,
612
+ ].join("\n")
613
+ end
614
+
615
+ def format_declarations_schema_version(node)
616
+ [
617
+ "'",
618
+ node.value,
619
+ "'",
620
+ ].join
621
+ end
622
+
623
+ def format_declarations_subtype_constraint(node)
624
+ [
625
+ [
626
+ "SUBTYPE_CONSTRAINT",
627
+ " ",
628
+ node.id,
629
+ " ",
630
+ "FOR",
631
+ " ",
632
+ format(node.applies_to),
633
+ ";",
634
+ ].join,
635
+ # ISO 10303-11: abstract_supertype_constraint = ABSTRACT ';' —
636
+ # the ABSTRACT SUPERTYPE form is entity-header syntax.
637
+ *if node.abstract
638
+ indent([
639
+ "ABSTRACT",
640
+ ";",
641
+ ].join)
642
+ end,
643
+ *if node.total_over&.length&.positive?
644
+ indent([
645
+ "TOTAL_OVER",
646
+ "(",
647
+ node.total_over.map { |x| format(x) }.join(", "),
648
+ ")",
649
+ ";",
650
+ ].join)
651
+ end,
652
+ *if node.supertype_expression
653
+ indent([
654
+ format(node.supertype_expression),
655
+ ";",
656
+ ].join)
657
+ end,
658
+ [
659
+ "END_SUBTYPE_CONSTRAINT",
660
+ ";",
661
+ format_end_scope_remark(node),
662
+ ].join,
663
+ ].join("\n")
664
+ end
665
+
666
+ def format_declarations_type(node)
667
+ [
668
+ [
669
+ "TYPE",
670
+ " ",
671
+ node.id,
672
+ " ",
673
+ "=",
674
+ " ",
675
+ format(node.underlying_type),
676
+ ";",
677
+ ].join,
678
+ *if node.where_rules&.length&.positive?
679
+ [
680
+ "WHERE",
681
+ indent(node.where_rules.map { |x| format(x) }.join("\n")),
682
+ ]
683
+ end,
684
+ [
685
+ "END_TYPE",
686
+ ";",
687
+ format_end_scope_remark(node),
688
+ ].join,
689
+ ].join("\n")
690
+ end
691
+
692
+ def format_declarations_unique_rule(node)
693
+ [
694
+ *if node.id
695
+ [
696
+ node.id,
697
+ ":",
698
+ " ",
699
+ ].join
700
+ end,
701
+ Array(node.attributes).map { |x| format(x) }.join(", "),
702
+ ";",
703
+ ].join
704
+ end
705
+
706
+ def format_declarations_variable(node)
707
+ [
708
+ node.id,
709
+ " ",
710
+ ":",
711
+ " ",
712
+ format(node.type),
713
+ *if node.expression
714
+ [
715
+ " ",
716
+ ":=",
717
+ " ",
718
+ format(node.expression),
719
+ ].join
720
+ end,
721
+ ";",
722
+ ].join
723
+ end
724
+
725
+ def format_declarations_where_rule(node)
726
+ [
727
+ *if node.id
728
+ [
729
+ node.id,
730
+ ":",
731
+ " ",
732
+ ].join
733
+ end,
734
+ format(node.expression),
735
+ ";",
736
+ ].join
737
+ end
738
+
739
+ def format_declarations_informal_proposition_rule(node)
740
+ [
741
+ *if node.id
742
+ [
743
+ node.id,
744
+ ":",
745
+ " ",
746
+ ].join
747
+ end,
748
+ ].join
749
+ end
750
+ end
751
+ end
752
+ end
753
+ end