expressir 2.1.31 → 2.2.1

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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/docs.yml +3 -2
  3. data/.github/workflows/release.yml +6 -0
  4. data/.rubocop_todo.yml +106 -92
  5. data/Gemfile +1 -1
  6. data/README.adoc +372 -1
  7. data/docs/_guides/formatter/formatter-architecture.adoc +401 -0
  8. data/docs/_guides/ruby-api/parsing-files.adoc +1 -1
  9. data/docs/_pages/parsers.adoc +31 -5
  10. data/docs/lychee.toml +3 -0
  11. data/expressir.gemspec +3 -2
  12. data/lib/expressir/benchmark.rb +6 -6
  13. data/lib/expressir/cli.rb +9 -0
  14. data/lib/expressir/commands/base.rb +2 -9
  15. data/lib/expressir/commands/format.rb +30 -0
  16. data/lib/expressir/commands/package.rb +92 -87
  17. data/lib/expressir/commands/validate_ascii.rb +2 -4
  18. data/lib/expressir/commands/validate_load.rb +8 -5
  19. data/lib/expressir/coverage.rb +15 -11
  20. data/lib/expressir/errors.rb +115 -0
  21. data/lib/expressir/express/builder.rb +350 -0
  22. data/lib/expressir/express/builders/attribute_decl_builder.rb +38 -0
  23. data/lib/expressir/express/builders/built_in_builder.rb +88 -0
  24. data/lib/expressir/express/builders/constant_builder.rb +115 -0
  25. data/lib/expressir/express/builders/declaration_builder.rb +24 -0
  26. data/lib/expressir/express/builders/derive_clause_builder.rb +16 -0
  27. data/lib/expressir/express/builders/derived_attr_builder.rb +28 -0
  28. data/lib/expressir/express/builders/domain_rule_builder.rb +21 -0
  29. data/lib/expressir/express/builders/entity_decl_builder.rb +108 -0
  30. data/lib/expressir/express/builders/explicit_attr_builder.rb +52 -0
  31. data/lib/expressir/express/builders/expression_builder.rb +453 -0
  32. data/lib/expressir/express/builders/function_decl_builder.rb +84 -0
  33. data/lib/expressir/express/builders/helpers.rb +148 -0
  34. data/lib/expressir/express/builders/interface_builder.rb +171 -0
  35. data/lib/expressir/express/builders/inverse_attr_builder.rb +45 -0
  36. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +36 -0
  37. data/lib/expressir/express/builders/inverse_clause_builder.rb +16 -0
  38. data/lib/expressir/express/builders/literal_builder.rb +107 -0
  39. data/lib/expressir/express/builders/procedure_decl_builder.rb +80 -0
  40. data/lib/expressir/express/builders/qualifier_builder.rb +128 -0
  41. data/lib/expressir/express/builders/reference_builder.rb +27 -0
  42. data/lib/expressir/express/builders/rule_decl_builder.rb +95 -0
  43. data/lib/expressir/express/builders/schema_body_decl_builder.rb +22 -0
  44. data/lib/expressir/express/builders/schema_decl_builder.rb +62 -0
  45. data/lib/expressir/express/builders/schema_version_builder.rb +40 -0
  46. data/lib/expressir/express/builders/simple_id_builder.rb +26 -0
  47. data/lib/expressir/express/builders/statement_builder.rb +250 -0
  48. data/lib/expressir/express/builders/subtype_constraint_builder.rb +188 -0
  49. data/lib/expressir/express/builders/syntax_builder.rb +19 -0
  50. data/lib/expressir/express/builders/token_builder.rb +15 -0
  51. data/lib/expressir/express/builders/type_builder.rb +264 -0
  52. data/lib/expressir/express/builders/type_decl_builder.rb +32 -0
  53. data/lib/expressir/express/builders/unique_clause_builder.rb +22 -0
  54. data/lib/expressir/express/builders/unique_rule_builder.rb +36 -0
  55. data/lib/expressir/express/builders/where_clause_builder.rb +22 -0
  56. data/lib/expressir/express/builders.rb +43 -0
  57. data/lib/expressir/express/error.rb +18 -2
  58. data/lib/expressir/express/formatter.rb +18 -1508
  59. data/lib/expressir/express/formatters/data_types_formatter.rb +317 -0
  60. data/lib/expressir/express/formatters/declarations_formatter.rb +689 -0
  61. data/lib/expressir/express/formatters/expressions_formatter.rb +160 -0
  62. data/lib/expressir/express/formatters/literals_formatter.rb +46 -0
  63. data/lib/expressir/express/formatters/references_formatter.rb +42 -0
  64. data/lib/expressir/express/formatters/remark_formatter.rb +296 -0
  65. data/lib/expressir/express/formatters/statements_formatter.rb +224 -0
  66. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +48 -0
  67. data/lib/expressir/express/parser.rb +129 -14
  68. data/lib/expressir/express/pretty_formatter.rb +624 -0
  69. data/lib/expressir/express/remark_attacher.rb +1155 -0
  70. data/lib/expressir/express/resolve_references_model_visitor.rb +1 -0
  71. data/lib/expressir/express/streaming_builder.rb +467 -0
  72. data/lib/expressir/express/transformer/remark_handling.rb +196 -0
  73. data/lib/expressir/model/identifier.rb +1 -1
  74. data/lib/expressir/model/model_element.rb +30 -2
  75. data/lib/expressir/model/remark_info.rb +51 -0
  76. data/lib/expressir/model/search_engine.rb +58 -9
  77. data/lib/expressir/version.rb +1 -1
  78. data/lib/expressir.rb +6 -4
  79. metadata +71 -7
  80. data/lib/expressir/express/visitor.rb +0 -2815
@@ -0,0 +1,317 @@
1
+ module Expressir
2
+ module Express
3
+ module DataTypesFormatter
4
+ private
5
+
6
+ def format_data_types_aggregate(_node)
7
+ "AGGREGATE"
8
+ end
9
+
10
+ def format_data_types_array(node)
11
+ [
12
+ "ARRAY",
13
+ *if node.bound1 && node.bound2
14
+ [
15
+ " ",
16
+ "[",
17
+ format(node.bound1),
18
+ ":",
19
+ format(node.bound2),
20
+ "]",
21
+ ].join
22
+ end,
23
+ " ",
24
+ "OF",
25
+ *if node.optional
26
+ [
27
+ " ",
28
+ "OPTIONAL",
29
+ ].join
30
+ end,
31
+ *if node.unique
32
+ [
33
+ " ",
34
+ "UNIQUE",
35
+ ].join
36
+ end,
37
+ " ",
38
+ format(node.base_type),
39
+ ].join
40
+ end
41
+
42
+ def format_data_types_bag(node)
43
+ [
44
+ "BAG",
45
+ *if node.bound1 && node.bound2
46
+ [
47
+ " ",
48
+ "[",
49
+ format(node.bound1),
50
+ ":",
51
+ format(node.bound2),
52
+ "]",
53
+ ].join
54
+ end,
55
+ " ",
56
+ "OF",
57
+ " ",
58
+ format(node.base_type),
59
+ ].join
60
+ end
61
+
62
+ def format_data_types_binary(node)
63
+ [
64
+ "BINARY",
65
+ *if node.width
66
+ [
67
+ " ",
68
+ "(",
69
+ format(node.width),
70
+ ")",
71
+ ].join
72
+ end,
73
+ *if node.fixed
74
+ [
75
+ " ",
76
+ "FIXED",
77
+ ].join
78
+ end,
79
+ ].join
80
+ end
81
+
82
+ def format_data_types_boolean(_node)
83
+ "BOOLEAN"
84
+ end
85
+
86
+ def format_data_types_enumeration(node)
87
+ indent_char = self.class.const_get(:INDENT_CHAR)
88
+ [
89
+ *if node.extensible
90
+ [
91
+ "EXTENSIBLE",
92
+ " ",
93
+ ].join
94
+ end,
95
+ "ENUMERATION",
96
+ *if node.based_on
97
+ [
98
+ " ",
99
+ "BASED_ON",
100
+ " ",
101
+ format(node.based_on),
102
+ *if node.items&.length&.positive?
103
+ item_indent = indent_char * "(".length
104
+ [
105
+ " ",
106
+ "WITH",
107
+ "\n",
108
+ indent([
109
+ "(",
110
+ node.items.map do |x|
111
+ format(x)
112
+ end.join(",\n#{item_indent}"),
113
+ ")",
114
+ ].join),
115
+ ].join
116
+ end,
117
+ ].join
118
+ else
119
+ [
120
+ *if node.items&.length&.positive?
121
+ item_indent = indent_char * "(".length
122
+ [
123
+ " ",
124
+ "OF",
125
+ "\n",
126
+ indent([
127
+ "(",
128
+ node.items.map do |x|
129
+ format(x)
130
+ end.join(",\n#{item_indent}"),
131
+ ")",
132
+ ].join),
133
+ ].join
134
+ end,
135
+ ].join
136
+ end,
137
+ ].join
138
+ end
139
+
140
+ def format_data_types_enumeration_item(node)
141
+ node.id
142
+ end
143
+
144
+ def format_data_types_generic_entity(node)
145
+ [
146
+ "GENERIC_ENTITY",
147
+ *if node.id
148
+ [
149
+ ":",
150
+ node.id,
151
+ ]
152
+ end,
153
+ ].join
154
+ end
155
+
156
+ def format_data_types_generic(node)
157
+ [
158
+ "GENERIC",
159
+ *if node.id
160
+ [
161
+ ":",
162
+ node.id,
163
+ ]
164
+ end,
165
+ ].join
166
+ end
167
+
168
+ def format_data_types_integer(_node)
169
+ "INTEGER"
170
+ end
171
+
172
+ def format_data_types_list(node)
173
+ [
174
+ "LIST",
175
+ *if node.bound1 && node.bound2
176
+ [
177
+ " ",
178
+ "[",
179
+ format(node.bound1),
180
+ ":",
181
+ format(node.bound2),
182
+ "]",
183
+ ].join
184
+ end,
185
+ " ",
186
+ "OF",
187
+ *if node.unique
188
+ [
189
+ " ",
190
+ "UNIQUE",
191
+ ].join
192
+ end,
193
+ " ",
194
+ format(node.base_type),
195
+ ].join
196
+ end
197
+
198
+ def format_data_types_logical(_node)
199
+ "LOGICAL"
200
+ end
201
+
202
+ def format_data_types_number(_node)
203
+ "NUMBER"
204
+ end
205
+
206
+ def format_data_types_real(node)
207
+ [
208
+ "REAL",
209
+ *if node.precision
210
+ [
211
+ " ",
212
+ "(",
213
+ format(node.precision),
214
+ ")",
215
+ ].join
216
+ end,
217
+ ].join
218
+ end
219
+
220
+ def format_data_types_select(node)
221
+ indent_char = self.class.const_get(:INDENT_CHAR)
222
+ node.items ||= []
223
+ [
224
+ *if node.extensible
225
+ [
226
+ "EXTENSIBLE",
227
+ " ",
228
+ ].join
229
+ end,
230
+ *if node.generic_entity
231
+ [
232
+ "GENERIC_ENTITY",
233
+ " ",
234
+ ].join
235
+ end,
236
+ "SELECT",
237
+ *if node.based_on
238
+ [
239
+ " ",
240
+ "BASED_ON",
241
+ " ",
242
+ format(node.based_on),
243
+ *if node.items&.length&.positive?
244
+ item_indent = indent_char * "(".length
245
+ [
246
+ " ",
247
+ "WITH",
248
+ "\n",
249
+ indent([
250
+ "(",
251
+ node.items.map do |x|
252
+ format(x)
253
+ end.join(",\n#{item_indent}"),
254
+ ")",
255
+ ].join),
256
+ ].join
257
+ end,
258
+ ].join
259
+ else
260
+ indent_char = self.class.const_get(:INDENT_CHAR)
261
+ item_indent = indent_char * "(".length
262
+ [
263
+ "\n",
264
+ indent([
265
+ "(",
266
+ node.items.map do |x|
267
+ format(x)
268
+ end.join(",\n#{item_indent}"),
269
+ ")",
270
+ ].join),
271
+ ].join
272
+ end,
273
+ ].join
274
+ end
275
+
276
+ def format_data_types_set(node)
277
+ [
278
+ "SET",
279
+ *if node.bound1 && node.bound2
280
+ [
281
+ " ",
282
+ "[",
283
+ format(node.bound1),
284
+ ":",
285
+ format(node.bound2),
286
+ "]",
287
+ ].join
288
+ end,
289
+ " ",
290
+ "OF",
291
+ " ",
292
+ format(node.base_type),
293
+ ].join
294
+ end
295
+
296
+ def format_data_types_string(node)
297
+ [
298
+ "STRING",
299
+ *if node.width
300
+ [
301
+ " ",
302
+ "(",
303
+ format(node.width),
304
+ ")",
305
+ ].join
306
+ end,
307
+ *if node.fixed
308
+ [
309
+ " ",
310
+ "FIXED",
311
+ ].join
312
+ end,
313
+ ].join
314
+ end
315
+ end
316
+ end
317
+ end