expressir 2.2.0 → 2.3.0

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 (192) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.rubocop_todo.yml +254 -77
  4. data/Gemfile +4 -1
  5. data/README.adoc +63 -26
  6. data/benchmark/srl_benchmark.rb +386 -0
  7. data/benchmark/srl_native_benchmark.rb +142 -0
  8. data/benchmark/srl_ruby_benchmark.rb +130 -0
  9. data/expressir.gemspec +4 -2
  10. data/lib/expressir/benchmark.rb +1 -1
  11. data/lib/expressir/changes/item_change.rb +0 -1
  12. data/lib/expressir/changes/mapping_change.rb +0 -1
  13. data/lib/expressir/changes/schema_change.rb +0 -2
  14. data/lib/expressir/changes/version_change.rb +0 -3
  15. data/lib/expressir/changes.rb +5 -6
  16. data/lib/expressir/cli.rb +10 -24
  17. data/lib/expressir/commands/base.rb +2 -9
  18. data/lib/expressir/commands/changes.rb +0 -2
  19. data/lib/expressir/commands/changes_import_eengine.rb +0 -3
  20. data/lib/expressir/commands/changes_validate.rb +0 -2
  21. data/lib/expressir/commands/format.rb +5 -3
  22. data/lib/expressir/commands/manifest.rb +0 -7
  23. data/lib/expressir/commands/package.rb +93 -101
  24. data/lib/expressir/commands/validate.rb +0 -2
  25. data/lib/expressir/commands/validate_ascii.rb +2 -4
  26. data/lib/expressir/commands/validate_load.rb +8 -5
  27. data/lib/expressir/commands.rb +20 -0
  28. data/lib/expressir/config.rb +0 -2
  29. data/lib/expressir/coverage.rb +11 -4
  30. data/lib/expressir/eengine/arm_compare_report.rb +1 -4
  31. data/lib/expressir/eengine/changes_section.rb +1 -3
  32. data/lib/expressir/eengine/compare_report.rb +1 -13
  33. data/lib/expressir/eengine/mim_compare_report.rb +1 -4
  34. data/lib/expressir/eengine/modified_object.rb +1 -2
  35. data/lib/expressir/eengine.rb +9 -0
  36. data/lib/expressir/errors.rb +113 -0
  37. data/lib/expressir/express/builder.rb +22 -7
  38. data/lib/expressir/express/builder_registry.rb +411 -0
  39. data/lib/expressir/express/builders/attribute_decl_builder.rb +0 -6
  40. data/lib/expressir/express/builders/built_in_builder.rb +1 -16
  41. data/lib/expressir/express/builders/constant_builder.rb +4 -19
  42. data/lib/expressir/express/builders/declaration_builder.rb +0 -4
  43. data/lib/expressir/express/builders/derive_clause_builder.rb +0 -2
  44. data/lib/expressir/express/builders/derived_attr_builder.rb +0 -2
  45. data/lib/expressir/express/builders/domain_rule_builder.rb +0 -2
  46. data/lib/expressir/express/builders/entity_decl_builder.rb +7 -13
  47. data/lib/expressir/express/builders/explicit_attr_builder.rb +5 -8
  48. data/lib/expressir/express/builders/expression_builder.rb +31 -67
  49. data/lib/expressir/express/builders/function_decl_builder.rb +20 -18
  50. data/lib/expressir/express/builders/interface_builder.rb +0 -20
  51. data/lib/expressir/express/builders/inverse_attr_builder.rb +0 -2
  52. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +0 -6
  53. data/lib/expressir/express/builders/inverse_clause_builder.rb +0 -2
  54. data/lib/expressir/express/builders/literal_builder.rb +1 -15
  55. data/lib/expressir/express/builders/procedure_decl_builder.rb +20 -19
  56. data/lib/expressir/express/builders/qualifier_builder.rb +0 -27
  57. data/lib/expressir/express/builders/reference_builder.rb +1 -10
  58. data/lib/expressir/express/builders/rule_decl_builder.rb +21 -19
  59. data/lib/expressir/express/builders/schema_body_decl_builder.rb +0 -4
  60. data/lib/expressir/express/builders/schema_decl_builder.rb +7 -13
  61. data/lib/expressir/express/builders/schema_version_builder.rb +0 -6
  62. data/lib/expressir/express/builders/simple_id_builder.rb +1 -10
  63. data/lib/expressir/express/builders/statement_builder.rb +4 -32
  64. data/lib/expressir/express/builders/subtype_constraint_builder.rb +6 -30
  65. data/lib/expressir/express/builders/syntax_builder.rb +60 -7
  66. data/lib/expressir/express/builders/type_builder.rb +3 -45
  67. data/lib/expressir/express/builders/type_decl_builder.rb +1 -7
  68. data/lib/expressir/express/builders/unique_clause_builder.rb +1 -3
  69. data/lib/expressir/express/builders/unique_rule_builder.rb +0 -2
  70. data/lib/expressir/express/builders/where_clause_builder.rb +1 -3
  71. data/lib/expressir/express/builders.rb +47 -35
  72. data/lib/expressir/express/error.rb +0 -3
  73. data/lib/expressir/express/formatter.rb +17 -19
  74. data/lib/expressir/express/formatters/data_types_formatter.rb +295 -293
  75. data/lib/expressir/express/formatters/declarations_formatter.rb +617 -615
  76. data/lib/expressir/express/formatters/expressions_formatter.rb +146 -144
  77. data/lib/expressir/express/formatters/literals_formatter.rb +35 -33
  78. data/lib/expressir/express/formatters/references_formatter.rb +34 -32
  79. data/lib/expressir/express/formatters/remark_formatter.rb +176 -209
  80. data/lib/expressir/express/formatters/remark_item_formatter.rb +18 -16
  81. data/lib/expressir/express/formatters/statements_formatter.rb +190 -188
  82. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +41 -39
  83. data/lib/expressir/express/formatters.rb +22 -0
  84. data/lib/expressir/express/parser.rb +40 -41
  85. data/lib/expressir/express/pretty_formatter.rb +68 -47
  86. data/lib/expressir/express/remark_attacher.rb +210 -147
  87. data/lib/expressir/express/streaming_builder.rb +0 -3
  88. data/lib/expressir/express/transformer/remark_handling.rb +1 -2
  89. data/lib/expressir/express.rb +29 -0
  90. data/lib/expressir/manifest/resolver.rb +0 -3
  91. data/lib/expressir/manifest/validator.rb +0 -3
  92. data/lib/expressir/manifest.rb +6 -0
  93. data/lib/expressir/model/cache.rb +1 -1
  94. data/lib/expressir/model/concerns.rb +19 -0
  95. data/lib/expressir/model/data_types/aggregate.rb +1 -1
  96. data/lib/expressir/model/data_types/array.rb +1 -1
  97. data/lib/expressir/model/data_types/bag.rb +1 -1
  98. data/lib/expressir/model/data_types/binary.rb +1 -1
  99. data/lib/expressir/model/data_types/boolean.rb +1 -1
  100. data/lib/expressir/model/data_types/enumeration.rb +1 -1
  101. data/lib/expressir/model/data_types/enumeration_item.rb +1 -1
  102. data/lib/expressir/model/data_types/generic.rb +1 -1
  103. data/lib/expressir/model/data_types/generic_entity.rb +1 -1
  104. data/lib/expressir/model/data_types/integer.rb +1 -1
  105. data/lib/expressir/model/data_types/list.rb +1 -1
  106. data/lib/expressir/model/data_types/logical.rb +1 -1
  107. data/lib/expressir/model/data_types/number.rb +1 -1
  108. data/lib/expressir/model/data_types/real.rb +1 -1
  109. data/lib/expressir/model/data_types/select.rb +1 -1
  110. data/lib/expressir/model/data_types/set.rb +1 -1
  111. data/lib/expressir/model/data_types/string.rb +1 -1
  112. data/lib/expressir/model/data_types.rb +25 -0
  113. data/lib/expressir/model/declarations/attribute.rb +1 -1
  114. data/lib/expressir/model/declarations/constant.rb +1 -1
  115. data/lib/expressir/model/declarations/derived_attribute.rb +1 -1
  116. data/lib/expressir/model/declarations/entity.rb +4 -1
  117. data/lib/expressir/model/declarations/function.rb +3 -1
  118. data/lib/expressir/model/declarations/informal_proposition_rule.rb +2 -1
  119. data/lib/expressir/model/declarations/interface.rb +1 -1
  120. data/lib/expressir/model/declarations/interface_item.rb +1 -1
  121. data/lib/expressir/model/declarations/interfaced_item.rb +1 -1
  122. data/lib/expressir/model/declarations/inverse_attribute.rb +1 -1
  123. data/lib/expressir/model/declarations/parameter.rb +1 -1
  124. data/lib/expressir/model/declarations/procedure.rb +3 -1
  125. data/lib/expressir/model/declarations/remark_item.rb +1 -1
  126. data/lib/expressir/model/declarations/rule.rb +4 -1
  127. data/lib/expressir/model/declarations/schema.rb +2 -1
  128. data/lib/expressir/model/declarations/schema_version.rb +1 -1
  129. data/lib/expressir/model/declarations/schema_version_item.rb +1 -1
  130. data/lib/expressir/model/declarations/subtype_constraint.rb +1 -1
  131. data/lib/expressir/model/declarations/type.rb +4 -1
  132. data/lib/expressir/model/declarations/unique_rule.rb +1 -1
  133. data/lib/expressir/model/declarations/variable.rb +1 -1
  134. data/lib/expressir/model/declarations/where_rule.rb +1 -1
  135. data/lib/expressir/model/declarations.rb +31 -0
  136. data/lib/expressir/model/dependency_resolver.rb +0 -2
  137. data/lib/expressir/model/exp_file.rb +38 -0
  138. data/lib/expressir/model/expressions/aggregate_initializer.rb +1 -1
  139. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +1 -1
  140. data/lib/expressir/model/expressions/binary_expression.rb +1 -1
  141. data/lib/expressir/model/expressions/entity_constructor.rb +1 -1
  142. data/lib/expressir/model/expressions/function_call.rb +1 -1
  143. data/lib/expressir/model/expressions/interval.rb +1 -1
  144. data/lib/expressir/model/expressions/query_expression.rb +1 -1
  145. data/lib/expressir/model/expressions/unary_expression.rb +1 -1
  146. data/lib/expressir/model/expressions.rb +18 -0
  147. data/lib/expressir/model/identifier.rb +5 -1
  148. data/lib/expressir/model/indexes.rb +11 -0
  149. data/lib/expressir/model/literals/binary.rb +1 -1
  150. data/lib/expressir/model/literals/integer.rb +1 -1
  151. data/lib/expressir/model/literals/logical.rb +1 -1
  152. data/lib/expressir/model/literals/real.rb +1 -1
  153. data/lib/expressir/model/literals/string.rb +1 -1
  154. data/lib/expressir/model/literals.rb +13 -0
  155. data/lib/expressir/model/model_element.rb +7 -15
  156. data/lib/expressir/model/references/attribute_reference.rb +1 -1
  157. data/lib/expressir/model/references/group_reference.rb +1 -1
  158. data/lib/expressir/model/references/index_reference.rb +1 -1
  159. data/lib/expressir/model/references/simple_reference.rb +1 -1
  160. data/lib/expressir/model/references.rb +12 -0
  161. data/lib/expressir/model/remark_info.rb +1 -7
  162. data/lib/expressir/model/repository.rb +72 -36
  163. data/lib/expressir/model/repository_validator.rb +0 -2
  164. data/lib/expressir/model/search_engine.rb +6 -30
  165. data/lib/expressir/model/statements/alias.rb +1 -1
  166. data/lib/expressir/model/statements/assignment.rb +1 -1
  167. data/lib/expressir/model/statements/case.rb +1 -1
  168. data/lib/expressir/model/statements/case_action.rb +1 -1
  169. data/lib/expressir/model/statements/compound.rb +1 -1
  170. data/lib/expressir/model/statements/escape.rb +1 -1
  171. data/lib/expressir/model/statements/if.rb +1 -1
  172. data/lib/expressir/model/statements/null.rb +1 -1
  173. data/lib/expressir/model/statements/procedure_call.rb +1 -1
  174. data/lib/expressir/model/statements/repeat.rb +1 -1
  175. data/lib/expressir/model/statements/return.rb +1 -1
  176. data/lib/expressir/model/statements/skip.rb +1 -1
  177. data/lib/expressir/model/statements.rb +20 -0
  178. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +1 -1
  179. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +1 -1
  180. data/lib/expressir/model/supertype_expressions.rb +12 -0
  181. data/lib/expressir/model.rb +28 -4
  182. data/lib/expressir/package/builder.rb +33 -4
  183. data/lib/expressir/package/metadata.rb +0 -1
  184. data/lib/expressir/package/reader.rb +0 -1
  185. data/lib/expressir/package.rb +8 -0
  186. data/lib/expressir/schema_manifest.rb +5 -6
  187. data/lib/expressir/schema_manifest_entry.rb +3 -4
  188. data/lib/expressir/transformer.rb +7 -0
  189. data/lib/expressir/version.rb +1 -1
  190. data/lib/expressir.rb +23 -173
  191. metadata +64 -9
  192. data/lib/expressir/express/builders/token_builder.rb +0 -15
@@ -1,688 +1,690 @@
1
1
  module Expressir
2
2
  module Express
3
- module DeclarationsFormatter
4
- private
3
+ module Formatters
4
+ module DeclarationsFormatter
5
+ private
5
6
 
6
- def format_declarations_attribute(node)
7
- [
8
- *if node.supertype_attribute
9
- [
10
- format(node.supertype_attribute),
11
- " ",
12
- ].join
13
- end,
14
- *if node.supertype_attribute && node.id != node.supertype_attribute.attribute.id
15
- [
16
- "RENAMED",
17
- " ",
18
- node.id,
19
- " ",
20
- ].join
21
- end,
22
- *if node.id && !node.supertype_attribute
23
- [
24
- node.id,
25
- " ",
26
- ].join
27
- end,
28
- ":",
29
- *if node.optional
30
- [
31
- " ",
32
- "OPTIONAL",
33
- ].join
34
- end,
35
- " ",
36
- format(node.type),
37
- *if node.kind == Model::Declarations::Attribute::DERIVED
38
- [
39
- " ",
40
- ":=",
41
- " ",
42
- format(node.expression),
43
- ].join
44
- elsif node.kind == Model::Declarations::Attribute::INVERSE
45
- [
46
- " ",
47
- "FOR",
48
- " ",
49
- format(node.expression),
50
- ].join
51
- end,
52
- ";",
53
- format_inline_tail_remark(node),
54
- ].join
55
- end
7
+ def format_declarations_attribute(node)
8
+ [
9
+ *if node.supertype_attribute
10
+ [
11
+ format(node.supertype_attribute),
12
+ " ",
13
+ ].join
14
+ end,
15
+ *if node.supertype_attribute && node.id != node.supertype_attribute.attribute.id
16
+ [
17
+ "RENAMED",
18
+ " ",
19
+ node.id,
20
+ " ",
21
+ ].join
22
+ end,
23
+ *if node.id && !node.supertype_attribute
24
+ [
25
+ node.id,
26
+ " ",
27
+ ].join
28
+ end,
29
+ ":",
30
+ *if node.optional
31
+ [
32
+ " ",
33
+ "OPTIONAL",
34
+ ].join
35
+ end,
36
+ " ",
37
+ format(node.type),
38
+ *if node.kind == Model::Declarations::Attribute::DERIVED
39
+ [
40
+ " ",
41
+ ":=",
42
+ " ",
43
+ format(node.expression),
44
+ ].join
45
+ elsif node.kind == Model::Declarations::Attribute::INVERSE
46
+ [
47
+ " ",
48
+ "FOR",
49
+ " ",
50
+ format(node.expression),
51
+ ].join
52
+ end,
53
+ ";",
54
+ format_inline_tail_remark(node),
55
+ ].join
56
+ end
56
57
 
57
- def format_declarations_constant(node)
58
- [
59
- node.id,
60
- " ",
61
- ":",
62
- " ",
63
- format(node.type),
64
- " ",
65
- ":=",
66
- " ",
67
- format(node.expression),
68
- ";",
69
- ].join
70
- end
58
+ def format_declarations_constant(node)
59
+ [
60
+ node.id,
61
+ " ",
62
+ ":",
63
+ " ",
64
+ format(node.type),
65
+ " ",
66
+ ":=",
67
+ " ",
68
+ format(node.expression),
69
+ ";",
70
+ ].join
71
+ end
71
72
 
72
- def format_declarations_entity(node)
73
- if node.attributes.nil?
74
- explicit_attributes = []
75
- derived_attributes = []
76
- inverse_attributes = []
77
- else
78
- explicit_attributes = node.attributes.select do |x|
79
- x.kind == Model::Declarations::Attribute::EXPLICIT
80
- end
81
- derived_attributes = node.attributes.select do |x|
82
- x.kind == Model::Declarations::Attribute::DERIVED
83
- end
84
- inverse_attributes = node.attributes.select do |x|
85
- x.kind == Model::Declarations::Attribute::INVERSE
73
+ def format_declarations_entity(node)
74
+ if node.attributes.nil?
75
+ explicit_attributes = []
76
+ derived_attributes = []
77
+ inverse_attributes = []
78
+ else
79
+ explicit_attributes = node.attributes.select do |x|
80
+ x.kind == Model::Declarations::Attribute::EXPLICIT
81
+ end
82
+ derived_attributes = node.attributes.select do |x|
83
+ x.kind == Model::Declarations::Attribute::DERIVED
84
+ end
85
+ inverse_attributes = node.attributes.select do |x|
86
+ x.kind == Model::Declarations::Attribute::INVERSE
87
+ end
86
88
  end
87
- end
88
89
 
89
- indent_const = self.class.const_get(:INDENT)
90
- # Only show preamble remarks if entity has explicit attributes
91
- preamble = if explicit_attributes&.length&.positive?
92
- format_preamble_remarks(node, indent(indent_const))
93
- end
90
+ indent_const = self.class.const_get(:INDENT)
91
+ # Only show preamble remarks if entity has explicit attributes
92
+ preamble = if explicit_attributes&.length&.positive?
93
+ format_preamble_remarks(node, indent(indent_const))
94
+ end
94
95
 
95
- [
96
96
  [
97
- "ENTITY",
98
- " ",
99
- node.id,
100
- *if node.abstract && !node.supertype_expression
97
+ [
98
+ "ENTITY",
99
+ " ",
100
+ node.id,
101
+ *if node.abstract && !node.supertype_expression
102
+ [
103
+ "\n",
104
+ indent([
105
+ "ABSTRACT",
106
+ " ",
107
+ "SUPERTYPE",
108
+ ].join),
109
+ ].join
110
+ end,
111
+ *if node.abstract && node.supertype_expression
112
+ [
113
+ "\n",
114
+ indent([
115
+ "ABSTRACT",
116
+ " ",
117
+ "SUPERTYPE",
118
+ " ",
119
+ "OF",
120
+ " ",
121
+ "(",
122
+ format(node.supertype_expression),
123
+ ")",
124
+ ].join),
125
+ ].join
126
+ end,
127
+ *if !node.abstract && node.supertype_expression
128
+ [
129
+ "\n",
130
+ indent([
131
+ "SUPERTYPE",
132
+ " ",
133
+ "OF",
134
+ " ",
135
+ "(",
136
+ format(node.supertype_expression),
137
+ ")",
138
+ ].join),
139
+ ].join
140
+ end,
141
+ *if node.subtype_of&.length&.positive?
142
+ [
143
+ "\n",
144
+ indent([
145
+ "SUBTYPE",
146
+ " ",
147
+ "OF",
148
+ " ",
149
+ "(",
150
+ node.subtype_of.map { |x| format(x) }.join(", "),
151
+ ")",
152
+ ].join),
153
+ ].join
154
+ end,
155
+ ";",
156
+ ].join,
157
+ *if preamble && !preamble.empty?
158
+ preamble.rstrip
159
+ end,
160
+ *if explicit_attributes&.length&.positive?
161
+ indent(explicit_attributes.map { |x| format(x) }.join("\n"))
162
+ end,
163
+ *if derived_attributes&.length&.positive?
101
164
  [
102
- "\n",
103
- indent([
104
- "ABSTRACT",
105
- " ",
106
- "SUPERTYPE",
107
- ].join),
108
- ].join
165
+ "DERIVE",
166
+ indent(derived_attributes.map { |x| format(x) }.join("\n")),
167
+ ]
109
168
  end,
110
- *if node.abstract && node.supertype_expression
169
+ *if inverse_attributes&.length&.positive?
111
170
  [
112
- "\n",
113
- indent([
114
- "ABSTRACT",
115
- " ",
116
- "SUPERTYPE",
117
- " ",
118
- "OF",
119
- " ",
120
- "(",
121
- format(node.supertype_expression),
122
- ")",
123
- ].join),
124
- ].join
171
+ "INVERSE",
172
+ indent(inverse_attributes.map { |x| format(x) }.join("\n")),
173
+ ]
125
174
  end,
126
- *if !node.abstract && node.supertype_expression
175
+ *if node.unique_rules&.length&.positive?
127
176
  [
128
- "\n",
129
- indent([
130
- "SUPERTYPE",
131
- " ",
132
- "OF",
133
- " ",
177
+ "UNIQUE",
178
+ indent(node.unique_rules.map { |x| format(x) }.join("\n")),
179
+ ]
180
+ end,
181
+ *if node.where_rules&.length&.positive?
182
+ [
183
+ "WHERE",
184
+ indent(node.where_rules.map { |x| format(x) }.join("\n")),
185
+ ]
186
+ end,
187
+ [
188
+ "END_ENTITY",
189
+ ";",
190
+ # Only show end_scope_remark if entity has explicit attributes
191
+ explicit_attributes&.length&.positive? ? format_end_scope_remark(node) : "",
192
+ ].join,
193
+ ].join("\n")
194
+ end
195
+
196
+ def format_declarations_function(node)
197
+ indent_char = self.class.const_get(:INDENT_CHAR)
198
+ [
199
+ [
200
+ "FUNCTION",
201
+ " ",
202
+ node.id,
203
+ *if node.parameters&.length&.positive?
204
+ parameter_indent = indent_char * "FUNCTION #{node.id}(".length
205
+ [
134
206
  "(",
135
- format(node.supertype_expression),
207
+ node.parameters.map do |x|
208
+ format(x)
209
+ end.join(";\n#{parameter_indent}"),
136
210
  ")",
137
- ].join),
138
- ].join
211
+ ].join
212
+ end,
213
+ " ",
214
+ ":",
215
+ " ",
216
+ format(node.return_type),
217
+ ";",
218
+ ].join,
219
+ *if node.types&.length&.positive?
220
+ indent(node.types.map { |x| format(x) }.join("\n"))
221
+ end,
222
+ *if node.entities&.length&.positive?
223
+ indent(node.entities.map { |x| format(x) }.join("\n"))
224
+ end,
225
+ *if node.subtype_constraints&.length&.positive?
226
+ indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
139
227
  end,
140
- *if node.subtype_of&.length&.positive?
228
+ *if node.functions&.length&.positive?
229
+ indent(node.functions.map { |x| format(x) }.join("\n"))
230
+ end,
231
+ *if node.procedures&.length&.positive?
232
+ indent(node.procedures.map { |x| format(x) }.join("\n"))
233
+ end,
234
+ *if node.constants&.length&.positive?
235
+ indent([
236
+ "CONSTANT",
237
+ indent(node.constants.map { |x| format(x) }.join("\n")),
238
+ [
239
+ "END_CONSTANT",
240
+ ";",
241
+ ].join,
242
+ ].join("\n"))
243
+ end,
244
+ *if node.variables&.length&.positive?
245
+ indent([
246
+ "LOCAL",
247
+ indent(node.variables.map { |x| format(x) }.join("\n")),
248
+ [
249
+ "END_LOCAL",
250
+ ";",
251
+ ].join,
252
+ ].join("\n"))
253
+ end,
254
+ *if node.statements&.length&.positive?
255
+ indent(node.statements.map { |x| format(x) }.join("\n"))
256
+ end,
257
+ [
258
+ "END_FUNCTION",
259
+ ";",
260
+ ].join,
261
+ ].join("\n")
262
+ end
263
+
264
+ def format_declarations_interface(node)
265
+ indent_char = self.class.const_get(:INDENT_CHAR)
266
+ [
267
+ case node.kind
268
+ when Model::Declarations::Interface::USE then "USE"
269
+ when Model::Declarations::Interface::REFERENCE then "REFERENCE"
270
+ end,
271
+ " ",
272
+ "FROM",
273
+ " ",
274
+ format(node.schema),
275
+ *if node.items&.length&.positive?
276
+ item_indent = indent_char * "(".length
141
277
  [
142
278
  "\n",
143
279
  indent([
144
- "SUBTYPE",
145
- " ",
146
- "OF",
147
- " ",
148
280
  "(",
149
- node.subtype_of.map { |x| format(x) }.join(", "),
281
+ node.items.map { |x| format(x) }.join(",\n#{item_indent}"),
150
282
  ")",
151
283
  ].join),
152
284
  ].join
153
285
  end,
154
286
  ";",
155
- ].join,
156
- *if preamble && !preamble.empty?
157
- preamble.rstrip
158
- end,
159
- *if explicit_attributes&.length&.positive?
160
- indent(explicit_attributes.map { |x| format(x) }.join("\n"))
161
- end,
162
- *if derived_attributes&.length&.positive?
163
- [
164
- "DERIVE",
165
- indent(derived_attributes.map { |x| format(x) }.join("\n")),
166
- ]
167
- end,
168
- *if inverse_attributes&.length&.positive?
169
- [
170
- "INVERSE",
171
- indent(inverse_attributes.map { |x| format(x) }.join("\n")),
172
- ]
173
- end,
174
- *if node.unique_rules&.length&.positive?
175
- [
176
- "UNIQUE",
177
- indent(node.unique_rules.map { |x| format(x) }.join("\n")),
178
- ]
179
- end,
180
- *if node.where_rules&.length&.positive?
181
- [
182
- "WHERE",
183
- indent(node.where_rules.map { |x| format(x) }.join("\n")),
184
- ]
185
- end,
287
+ ].join
288
+ end
289
+
290
+ def format_declarations_interface_item(node)
186
291
  [
187
- "END_ENTITY",
188
- ";",
189
- # Only show end_scope_remark if entity has explicit attributes
190
- explicit_attributes&.length&.positive? ? format_end_scope_remark(node) : "",
191
- ].join,
192
- ].join("\n")
193
- end
292
+ format(node.ref),
293
+ *if node.id
294
+ [
295
+ " ",
296
+ "AS",
297
+ " ",
298
+ node.id,
299
+ ]
300
+ end,
301
+ ].join
302
+ end
194
303
 
195
- def format_declarations_function(node)
196
- indent_char = self.class.const_get(:INDENT_CHAR)
197
- [
304
+ def format_declarations_parameter(node)
198
305
  [
199
- "FUNCTION",
200
- " ",
201
- node.id,
202
- *if node.parameters&.length&.positive?
203
- parameter_indent = indent_char * "FUNCTION #{node.id}(".length
306
+ *if node.var
204
307
  [
205
- "(",
206
- node.parameters.map do |x|
207
- format(x)
208
- end.join(";\n#{parameter_indent}"),
209
- ")",
308
+ "VAR",
309
+ " ",
210
310
  ].join
211
311
  end,
312
+ node.id,
212
313
  " ",
213
314
  ":",
214
315
  " ",
215
- format(node.return_type),
216
- ";",
217
- ].join,
218
- *if node.types&.length&.positive?
219
- indent(node.types.map { |x| format(x) }.join("\n"))
220
- end,
221
- *if node.entities&.length&.positive?
222
- indent(node.entities.map { |x| format(x) }.join("\n"))
223
- end,
224
- *if node.subtype_constraints&.length&.positive?
225
- indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
226
- end,
227
- *if node.functions&.length&.positive?
228
- indent(node.functions.map { |x| format(x) }.join("\n"))
229
- end,
230
- *if node.procedures&.length&.positive?
231
- indent(node.procedures.map { |x| format(x) }.join("\n"))
232
- end,
233
- *if node.constants&.length&.positive?
234
- indent([
235
- "CONSTANT",
236
- indent(node.constants.map { |x| format(x) }.join("\n")),
237
- [
238
- "END_CONSTANT",
239
- ";",
240
- ].join,
241
- ].join("\n"))
242
- end,
243
- *if node.variables&.length&.positive?
244
- indent([
245
- "LOCAL",
246
- indent(node.variables.map { |x| format(x) }.join("\n")),
247
- [
248
- "END_LOCAL",
249
- ";",
250
- ].join,
251
- ].join("\n"))
252
- end,
253
- *if node.statements&.length&.positive?
254
- indent(node.statements.map { |x| format(x) }.join("\n"))
255
- end,
256
- [
257
- "END_FUNCTION",
258
- ";",
259
- ].join,
260
- ].join("\n")
261
- end
316
+ format(node.type),
317
+ ].join
318
+ end
262
319
 
263
- def format_declarations_interface(node)
264
- indent_char = self.class.const_get(:INDENT_CHAR)
265
- [
266
- case node.kind
267
- when Model::Declarations::Interface::USE then "USE"
268
- when Model::Declarations::Interface::REFERENCE then "REFERENCE"
269
- end,
270
- " ",
271
- "FROM",
272
- " ",
273
- format(node.schema),
274
- *if node.items&.length&.positive?
275
- item_indent = indent_char * "(".length
276
- [
277
- "\n",
320
+ def format_declarations_procedure(node)
321
+ indent_char = self.class.const_get(:INDENT_CHAR)
322
+ [
323
+ [
324
+ "PROCEDURE",
325
+ " ",
326
+ node.id,
327
+ *if node.parameters&.length&.positive?
328
+ parameter_indent = indent_char * "PROCEDURE #{node.id}(".length
329
+ [
330
+ "(",
331
+ node.parameters.map do |x|
332
+ format(x)
333
+ end.join(";\n#{parameter_indent}"),
334
+ ")",
335
+ ].join
336
+ end,
337
+ ";",
338
+ ].join,
339
+ *if node.types&.length&.positive?
340
+ indent(node.types.map { |x| format(x) }.join("\n"))
341
+ end,
342
+ *if node.entities&.length&.positive?
343
+ indent(node.entities.map { |x| format(x) }.join("\n"))
344
+ end,
345
+ *if node.subtype_constraints&.length&.positive?
346
+ indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
347
+ end,
348
+ *if node.functions&.length&.positive?
349
+ indent(node.functions.map { |x| format(x) }.join("\n"))
350
+ end,
351
+ *if node.procedures&.length&.positive?
352
+ indent(node.procedures.map { |x| format(x) }.join("\n"))
353
+ end,
354
+ *if node.constants&.length&.positive?
278
355
  indent([
279
- "(",
280
- node.items.map { |x| format(x) }.join(",\n#{item_indent}"),
281
- ")",
282
- ].join),
283
- ].join
284
- end,
285
- ";",
286
- ].join
287
- end
356
+ "CONSTANT",
357
+ indent(node.constants.map { |x| format(x) }.join("\n")),
358
+ [
359
+ "END_CONSTANT",
360
+ ";",
361
+ ].join,
362
+ ].join("\n"))
363
+ end,
364
+ *if node.variables&.length&.positive?
365
+ indent([
366
+ "LOCAL",
367
+ indent(node.variables.map { |x| format(x) }.join("\n")),
368
+ [
369
+ "END_LOCAL",
370
+ ";",
371
+ ].join,
372
+ ].join("\n"))
373
+ end,
374
+ *if node.statements&.length&.positive?
375
+ indent(node.statements.map { |x| format(x) }.join("\n"))
376
+ end,
377
+ [
378
+ "END_PROCEDURE",
379
+ ";",
380
+ ].join,
381
+ ].join("\n")
382
+ end
288
383
 
289
- def format_declarations_interface_item(node)
290
- [
291
- format(node.ref),
292
- *if node.id
293
- [
294
- " ",
295
- "AS",
296
- " ",
297
- node.id,
298
- ]
299
- end,
300
- ].join
301
- end
384
+ def format_declarations_rule(node)
385
+ node.applies_to ||= []
302
386
 
303
- def format_declarations_parameter(node)
304
- [
305
- *if node.var
306
- [
307
- "VAR",
308
- " ",
309
- ].join
310
- end,
311
- node.id,
312
- " ",
313
- ":",
314
- " ",
315
- format(node.type),
316
- ].join
317
- end
387
+ # Filter out statements that only exist to hold remarks in rules
388
+ # (ALIAS/REPEAT with only Null sub-statements, query assignments, or Null statements)
389
+ formatted_statements = []
390
+ if node.statements&.length&.positive?
391
+ formatted_statements = node.statements.reject do |stmt|
392
+ # Filter ALIAS/REPEAT with only Null statements
393
+ if stmt.is_a?(Model::Statements::Alias) || stmt.is_a?(Model::Statements::Repeat)
394
+ stmt.statements&.all?(Model::Statements::Null)
395
+ # Filter query assignments (assignments with QueryExpression that exist only for remarks)
396
+ elsif stmt.is_a?(Model::Statements::Assignment) &&
397
+ stmt.expression.is_a?(Model::Expressions::QueryExpression)
398
+ true
399
+ # Filter Null statements
400
+ elsif stmt.is_a?(Model::Statements::Null)
401
+ true
402
+ else
403
+ false
404
+ end
405
+ end
406
+ end
318
407
 
319
- def format_declarations_procedure(node)
320
- indent_char = self.class.const_get(:INDENT_CHAR)
321
- [
322
408
  [
323
- "PROCEDURE",
324
- " ",
325
- node.id,
326
- *if node.parameters&.length&.positive?
327
- parameter_indent = indent_char * "PROCEDURE #{node.id}(".length
328
- [
329
- "(",
330
- node.parameters.map do |x|
331
- format(x)
332
- end.join(";\n#{parameter_indent}"),
333
- ")",
334
- ].join
409
+ [
410
+ "RULE",
411
+ " ",
412
+ node.id,
413
+ " ",
414
+ "FOR",
415
+ " ",
416
+ "(",
417
+ node.applies_to.map { |x| format(x) }.join(", "),
418
+ ")",
419
+ ";",
420
+ ].join,
421
+ *if node.types&.length&.positive?
422
+ indent(node.types.map { |x| format(x) }.join("\n"))
335
423
  end,
336
- ";",
337
- ].join,
338
- *if node.types&.length&.positive?
339
- indent(node.types.map { |x| format(x) }.join("\n"))
340
- end,
341
- *if node.entities&.length&.positive?
342
- indent(node.entities.map { |x| format(x) }.join("\n"))
343
- end,
344
- *if node.subtype_constraints&.length&.positive?
345
- indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
346
- end,
347
- *if node.functions&.length&.positive?
348
- indent(node.functions.map { |x| format(x) }.join("\n"))
349
- end,
350
- *if node.procedures&.length&.positive?
351
- indent(node.procedures.map { |x| format(x) }.join("\n"))
352
- end,
353
- *if node.constants&.length&.positive?
354
- indent([
355
- "CONSTANT",
356
- indent(node.constants.map { |x| format(x) }.join("\n")),
357
- [
358
- "END_CONSTANT",
359
- ";",
360
- ].join,
361
- ].join("\n"))
362
- end,
363
- *if node.variables&.length&.positive?
364
- indent([
365
- "LOCAL",
366
- indent(node.variables.map { |x| format(x) }.join("\n")),
424
+ *if node.entities&.length&.positive?
425
+ indent(node.entities.map { |x| format(x) }.join("\n"))
426
+ end,
427
+ *if node.subtype_constraints&.length&.positive?
428
+ indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
429
+ end,
430
+ *if node.functions&.length&.positive?
431
+ indent(node.functions.map { |x| format(x) }.join("\n"))
432
+ end,
433
+ *if node.procedures&.length&.positive?
434
+ indent(node.procedures.map { |x| format(x) }.join("\n"))
435
+ end,
436
+ *if node.constants&.length&.positive?
437
+ indent([
438
+ "CONSTANT",
439
+ indent(node.constants.map { |x| format(x) }.join("\n")),
440
+ [
441
+ "END_CONSTANT",
442
+ ";",
443
+ ].join,
444
+ ].join("\n"))
445
+ end,
446
+ *if node.variables&.length&.positive?
447
+ indent([
448
+ "LOCAL",
449
+ indent(node.variables.map { |x| format(x) }.join("\n")),
450
+ [
451
+ "END_LOCAL",
452
+ ";",
453
+ ].join,
454
+ ].join("\n"))
455
+ end,
456
+ *if formatted_statements.length.positive?
457
+ indent(formatted_statements.map { |x| format(x) }.join("\n"))
458
+ end,
459
+ *if node.where_rules&.length&.positive?
367
460
  [
368
- "END_LOCAL",
369
- ";",
370
- ].join,
371
- ].join("\n"))
372
- end,
373
- *if node.statements&.length&.positive?
374
- indent(node.statements.map { |x| format(x) }.join("\n"))
375
- end,
461
+ "WHERE",
462
+ indent(node.where_rules.map { |x| format(x) }.join("\n")),
463
+ ]
464
+ end,
465
+ [
466
+ "END_RULE",
467
+ ";",
468
+ ].join,
469
+ ].join("\n")
470
+ end
471
+
472
+ def format_declarations_schema_head(node)
376
473
  [
377
- "END_PROCEDURE",
378
- ";",
379
- ].join,
380
- ].join("\n")
381
- end
474
+ [
475
+ "SCHEMA",
476
+ " ",
477
+ node.id,
478
+ *if node.version
479
+ [
480
+ " ",
481
+ format(node.version),
482
+ ].join
483
+ end,
484
+ ";",
485
+ ].join,
486
+ *if node.interfaces&.length&.positive?
487
+ [
488
+ "",
489
+ node.interfaces.map { |x| format(x) }.join("\n"),
490
+ ]
491
+ end,
492
+ ].join("\n")
493
+ end
382
494
 
383
- def format_declarations_rule(node)
384
- node.applies_to ||= []
495
+ def format_declarations_schema(node)
496
+ indent_const = self.class.const_get(:INDENT)
497
+ preamble = format_preamble_remarks(node, indent(indent_const))
385
498
 
386
- # Filter out statements that only exist to hold remarks in rules
387
- # (ALIAS/REPEAT with only Null sub-statements, query assignments, or Null statements)
388
- formatted_statements = []
389
- if node.statements&.length&.positive?
390
- formatted_statements = node.statements.reject do |stmt|
391
- # Filter ALIAS/REPEAT with only Null statements
392
- if stmt.is_a?(Model::Statements::Alias) || stmt.is_a?(Model::Statements::Repeat)
393
- stmt.statements&.all?(Model::Statements::Null)
394
- # Filter query assignments (assignments with QueryExpression that exist only for remarks)
395
- elsif stmt.is_a?(Model::Statements::Assignment) &&
396
- stmt.expression.is_a?(Model::Expressions::QueryExpression)
397
- true
398
- # Filter Null statements
399
- elsif stmt.is_a?(Model::Statements::Null)
400
- true
401
- else
402
- false
403
- end
404
- end
405
- end
499
+ schema_declarations = [
500
+ *if node.constants&.length&.positive?
501
+ [
502
+ "CONSTANT",
503
+ indent(node.constants.map { |x| format(x) }.join("\n")),
504
+ [
505
+ "END_CONSTANT",
506
+ ";",
507
+ ].join,
508
+ ].join("\n")
509
+ end,
510
+ *if node.types&.length&.positive?
511
+ node.types.map { |x| format(x) }
512
+ end,
513
+ *if node.entities&.length&.positive?
514
+ node.entities.map { |x| format(x) }
515
+ end,
516
+ *if node.subtype_constraints&.length&.positive?
517
+ node.subtype_constraints.map { |x| format(x) }
518
+ end,
519
+ *if node.functions&.length&.positive?
520
+ node.functions.map { |x| format(x) }
521
+ end,
522
+ *if node.rules&.length&.positive?
523
+ node.rules.map { |x| format(x) }
524
+ end,
525
+ *if node.procedures&.length&.positive?
526
+ node.procedures.map { |x| format(x) }
527
+ end,
528
+ ]
406
529
 
407
- [
408
530
  [
409
- "RULE",
410
- " ",
411
- node.id,
412
- " ",
413
- "FOR",
414
- " ",
415
- "(",
416
- node.applies_to.map { |x| format(x) }.join(", "),
417
- ")",
418
- ";",
419
- ].join,
420
- *if node.types&.length&.positive?
421
- indent(node.types.map { |x| format(x) }.join("\n"))
422
- end,
423
- *if node.entities&.length&.positive?
424
- indent(node.entities.map { |x| format(x) }.join("\n"))
425
- end,
426
- *if node.subtype_constraints&.length&.positive?
427
- indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
428
- end,
429
- *if node.functions&.length&.positive?
430
- indent(node.functions.map { |x| format(x) }.join("\n"))
431
- end,
432
- *if node.procedures&.length&.positive?
433
- indent(node.procedures.map { |x| format(x) }.join("\n"))
434
- end,
435
- *if node.constants&.length&.positive?
436
- indent([
437
- "CONSTANT",
438
- indent(node.constants.map { |x| format(x) }.join("\n")),
531
+ format_declarations_schema_head(node),
532
+ *if preamble && !preamble.empty?
439
533
  [
440
- "END_CONSTANT",
441
- ";",
442
- ].join,
443
- ].join("\n"))
444
- end,
445
- *if node.variables&.length&.positive?
446
- indent([
447
- "LOCAL",
448
- indent(node.variables.map { |x| format(x) }.join("\n")),
534
+ "",
535
+ preamble.rstrip,
536
+ "",
537
+ ]
538
+ end,
539
+ *if schema_declarations&.length&.positive?
449
540
  [
450
- "END_LOCAL",
451
- ";",
452
- ].join,
453
- ].join("\n"))
454
- end,
455
- *if formatted_statements.length.positive?
456
- indent(formatted_statements.map { |x| format(x) }.join("\n"))
457
- end,
458
- *if node.where_rules&.length&.positive?
459
- [
460
- "WHERE",
461
- indent(node.where_rules.map { |x| format(x) }.join("\n")),
462
- ]
463
- end,
541
+ "",
542
+ schema_declarations.join("\n\n"),
543
+ "",
544
+ ]
545
+ end,
546
+ [
547
+ "END_SCHEMA",
548
+ ";",
549
+ ].join,
550
+ ].join("\n")
551
+ end
552
+
553
+ def format_declarations_schema_version(node)
464
554
  [
465
- "END_RULE",
466
- ";",
467
- ].join,
468
- ].join("\n")
469
- end
555
+ "'",
556
+ node.value,
557
+ "'",
558
+ ].join
559
+ end
470
560
 
471
- def format_declarations_schema_head(node)
472
- [
561
+ def format_declarations_subtype_constraint(node)
473
562
  [
474
- "SCHEMA",
475
- " ",
476
- node.id,
477
- *if node.version
478
- [
563
+ [
564
+ "SUBTYPE_CONSTRAINT",
565
+ " ",
566
+ node.id,
567
+ " ",
568
+ "FOR",
569
+ " ",
570
+ format(node.applies_to),
571
+ ";",
572
+ ].join,
573
+ *if node.abstract
574
+ indent([
575
+ "ABSTRACT",
479
576
  " ",
480
- format(node.version),
481
- ].join
577
+ "SUPERTYPE",
578
+ ";",
579
+ ].join)
482
580
  end,
483
- ";",
484
- ].join,
485
- *if node.interfaces&.length&.positive?
486
- [
487
- "",
488
- node.interfaces.map { |x| format(x) }.join("\n"),
489
- ]
490
- end,
491
- ].join("\n")
492
- end
493
-
494
- def format_declarations_schema(node)
495
- indent_const = self.class.const_get(:INDENT)
496
- preamble = format_preamble_remarks(node, indent(indent_const))
497
-
498
- schema_declarations = [
499
- *if node.constants&.length&.positive?
500
- [
501
- "CONSTANT",
502
- indent(node.constants.map { |x| format(x) }.join("\n")),
503
- [
504
- "END_CONSTANT",
581
+ *if node.total_over&.length&.positive?
582
+ indent([
583
+ "TOTAL_OVER",
584
+ "(",
585
+ node.total_over.map { |x| format(x) }.join(", "),
586
+ ")",
587
+ ";",
588
+ ].join)
589
+ end,
590
+ *if node.supertype_expression
591
+ indent([
592
+ format(node.supertype_expression),
505
593
  ";",
506
- ].join,
507
- ].join("\n")
508
- end,
509
- *if node.types&.length&.positive?
510
- node.types.map { |x| format(x) }
511
- end,
512
- *if node.entities&.length&.positive?
513
- node.entities.map { |x| format(x) }
514
- end,
515
- *if node.subtype_constraints&.length&.positive?
516
- node.subtype_constraints.map { |x| format(x) }
517
- end,
518
- *if node.functions&.length&.positive?
519
- node.functions.map { |x| format(x) }
520
- end,
521
- *if node.rules&.length&.positive?
522
- node.rules.map { |x| format(x) }
523
- end,
524
- *if node.procedures&.length&.positive?
525
- node.procedures.map { |x| format(x) }
526
- end,
527
- ]
594
+ ].join)
595
+ end,
596
+ [
597
+ "END_SUBTYPE_CONSTRAINT",
598
+ ";",
599
+ ].join,
600
+ ].join("\n")
601
+ end
528
602
 
529
- [
530
- format_declarations_schema_head(node),
531
- *if preamble && !preamble.empty?
532
- [
533
- "",
534
- preamble.rstrip,
535
- "",
536
- ]
537
- end,
538
- *if schema_declarations&.length&.positive?
539
- [
540
- "",
541
- schema_declarations.join("\n\n"),
542
- "",
543
- ]
544
- end,
603
+ def format_declarations_type(node)
545
604
  [
546
- "END_SCHEMA",
547
- ";",
548
- ].join,
549
- ].join("\n")
550
- end
551
-
552
- def format_declarations_schema_version(node)
553
- [
554
- "'",
555
- node.value,
556
- "'",
557
- ].join
558
- end
605
+ [
606
+ "TYPE",
607
+ " ",
608
+ node.id,
609
+ " ",
610
+ "=",
611
+ " ",
612
+ format(node.underlying_type),
613
+ ";",
614
+ ].join,
615
+ *if node.where_rules&.length&.positive?
616
+ [
617
+ "WHERE",
618
+ indent(node.where_rules.map { |x| format(x) }.join("\n")),
619
+ ]
620
+ end,
621
+ [
622
+ "END_TYPE",
623
+ ";",
624
+ format_end_scope_remark(node),
625
+ ].join,
626
+ ].join("\n")
627
+ end
559
628
 
560
- def format_declarations_subtype_constraint(node)
561
- [
562
- [
563
- "SUBTYPE_CONSTRAINT",
564
- " ",
565
- node.id,
566
- " ",
567
- "FOR",
568
- " ",
569
- format(node.applies_to),
570
- ";",
571
- ].join,
572
- *if node.abstract
573
- indent([
574
- "ABSTRACT",
575
- " ",
576
- "SUPERTYPE",
577
- ";",
578
- ].join)
579
- end,
580
- *if node.total_over&.length&.positive?
581
- indent([
582
- "TOTAL_OVER",
583
- "(",
584
- node.total_over.map { |x| format(x) }.join(", "),
585
- ")",
586
- ";",
587
- ].join)
588
- end,
589
- *if node.supertype_expression
590
- indent([
591
- format(node.supertype_expression),
592
- ";",
593
- ].join)
594
- end,
629
+ def format_declarations_unique_rule(node)
630
+ node.attributes ||= []
595
631
  [
596
- "END_SUBTYPE_CONSTRAINT",
632
+ *if node.id
633
+ [
634
+ node.id,
635
+ ":",
636
+ " ",
637
+ ].join
638
+ end,
639
+ node.attributes.map { |x| format(x) }.join(", "),
597
640
  ";",
598
- ].join,
599
- ].join("\n")
600
- end
641
+ ].join
642
+ end
601
643
 
602
- def format_declarations_type(node)
603
- [
644
+ def format_declarations_variable(node)
604
645
  [
605
- "TYPE",
606
- " ",
607
646
  node.id,
608
647
  " ",
609
- "=",
648
+ ":",
610
649
  " ",
611
- format(node.underlying_type),
650
+ format(node.type),
651
+ *if node.expression
652
+ [
653
+ " ",
654
+ ":=",
655
+ " ",
656
+ format(node.expression),
657
+ ].join
658
+ end,
612
659
  ";",
613
- ].join,
614
- *if node.where_rules&.length&.positive?
615
- [
616
- "WHERE",
617
- indent(node.where_rules.map { |x| format(x) }.join("\n")),
618
- ]
619
- end,
660
+ ].join
661
+ end
662
+
663
+ def format_declarations_where_rule(node)
620
664
  [
621
- "END_TYPE",
665
+ *if node.id
666
+ [
667
+ node.id,
668
+ ":",
669
+ " ",
670
+ ].join
671
+ end,
672
+ format(node.expression),
622
673
  ";",
623
- format_end_scope_remark(node),
624
- ].join,
625
- ].join("\n")
626
- end
627
-
628
- def format_declarations_unique_rule(node)
629
- node.attributes ||= []
630
- [
631
- *if node.id
632
- [
633
- node.id,
634
- ":",
635
- " ",
636
- ].join
637
- end,
638
- node.attributes.map { |x| format(x) }.join(", "),
639
- ";",
640
- ].join
641
- end
642
-
643
- def format_declarations_variable(node)
644
- [
645
- node.id,
646
- " ",
647
- ":",
648
- " ",
649
- format(node.type),
650
- *if node.expression
651
- [
652
- " ",
653
- ":=",
654
- " ",
655
- format(node.expression),
656
- ].join
657
- end,
658
- ";",
659
- ].join
660
- end
661
-
662
- def format_declarations_where_rule(node)
663
- [
664
- *if node.id
665
- [
666
- node.id,
667
- ":",
668
- " ",
669
- ].join
670
- end,
671
- format(node.expression),
672
- ";",
673
- ].join
674
- end
674
+ ].join
675
+ end
675
676
 
676
- def format_declarations_informal_proposition_rule(node)
677
- [
678
- *if node.id
679
- [
680
- node.id,
681
- ":",
682
- " ",
683
- ].join
684
- end,
685
- ].join
677
+ def format_declarations_informal_proposition_rule(node)
678
+ [
679
+ *if node.id
680
+ [
681
+ node.id,
682
+ ":",
683
+ " ",
684
+ ].join
685
+ end,
686
+ ].join
687
+ end
686
688
  end
687
689
  end
688
690
  end