expressir 2.2.1 → 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 (190) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.rubocop_todo.yml +253 -81
  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 +3 -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/changes.rb +0 -2
  18. data/lib/expressir/commands/changes_import_eengine.rb +0 -3
  19. data/lib/expressir/commands/changes_validate.rb +0 -2
  20. data/lib/expressir/commands/format.rb +1 -1
  21. data/lib/expressir/commands/manifest.rb +0 -7
  22. data/lib/expressir/commands/package.rb +16 -29
  23. data/lib/expressir/commands/validate.rb +0 -2
  24. data/lib/expressir/commands/validate_load.rb +1 -1
  25. data/lib/expressir/commands.rb +20 -0
  26. data/lib/expressir/config.rb +0 -2
  27. data/lib/expressir/coverage.rb +11 -4
  28. data/lib/expressir/eengine/arm_compare_report.rb +1 -4
  29. data/lib/expressir/eengine/changes_section.rb +1 -3
  30. data/lib/expressir/eengine/compare_report.rb +1 -13
  31. data/lib/expressir/eengine/mim_compare_report.rb +1 -4
  32. data/lib/expressir/eengine/modified_object.rb +1 -2
  33. data/lib/expressir/eengine.rb +9 -0
  34. data/lib/expressir/errors.rb +3 -5
  35. data/lib/expressir/express/builder.rb +22 -7
  36. data/lib/expressir/express/builder_registry.rb +411 -0
  37. data/lib/expressir/express/builders/attribute_decl_builder.rb +0 -6
  38. data/lib/expressir/express/builders/built_in_builder.rb +1 -16
  39. data/lib/expressir/express/builders/constant_builder.rb +4 -19
  40. data/lib/expressir/express/builders/declaration_builder.rb +0 -4
  41. data/lib/expressir/express/builders/derive_clause_builder.rb +0 -2
  42. data/lib/expressir/express/builders/derived_attr_builder.rb +0 -2
  43. data/lib/expressir/express/builders/domain_rule_builder.rb +0 -2
  44. data/lib/expressir/express/builders/entity_decl_builder.rb +7 -13
  45. data/lib/expressir/express/builders/explicit_attr_builder.rb +5 -8
  46. data/lib/expressir/express/builders/expression_builder.rb +31 -67
  47. data/lib/expressir/express/builders/function_decl_builder.rb +20 -18
  48. data/lib/expressir/express/builders/interface_builder.rb +0 -20
  49. data/lib/expressir/express/builders/inverse_attr_builder.rb +0 -2
  50. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +0 -6
  51. data/lib/expressir/express/builders/inverse_clause_builder.rb +0 -2
  52. data/lib/expressir/express/builders/literal_builder.rb +1 -15
  53. data/lib/expressir/express/builders/procedure_decl_builder.rb +20 -19
  54. data/lib/expressir/express/builders/qualifier_builder.rb +0 -27
  55. data/lib/expressir/express/builders/reference_builder.rb +1 -10
  56. data/lib/expressir/express/builders/rule_decl_builder.rb +21 -19
  57. data/lib/expressir/express/builders/schema_body_decl_builder.rb +0 -4
  58. data/lib/expressir/express/builders/schema_decl_builder.rb +7 -13
  59. data/lib/expressir/express/builders/schema_version_builder.rb +0 -6
  60. data/lib/expressir/express/builders/simple_id_builder.rb +1 -10
  61. data/lib/expressir/express/builders/statement_builder.rb +4 -32
  62. data/lib/expressir/express/builders/subtype_constraint_builder.rb +6 -30
  63. data/lib/expressir/express/builders/syntax_builder.rb +60 -7
  64. data/lib/expressir/express/builders/type_builder.rb +3 -45
  65. data/lib/expressir/express/builders/type_decl_builder.rb +1 -7
  66. data/lib/expressir/express/builders/unique_clause_builder.rb +1 -3
  67. data/lib/expressir/express/builders/unique_rule_builder.rb +0 -2
  68. data/lib/expressir/express/builders/where_clause_builder.rb +1 -3
  69. data/lib/expressir/express/builders.rb +47 -35
  70. data/lib/expressir/express/error.rb +0 -3
  71. data/lib/expressir/express/formatter.rb +17 -19
  72. data/lib/expressir/express/formatters/data_types_formatter.rb +295 -293
  73. data/lib/expressir/express/formatters/declarations_formatter.rb +617 -615
  74. data/lib/expressir/express/formatters/expressions_formatter.rb +146 -144
  75. data/lib/expressir/express/formatters/literals_formatter.rb +35 -33
  76. data/lib/expressir/express/formatters/references_formatter.rb +34 -32
  77. data/lib/expressir/express/formatters/remark_formatter.rb +176 -209
  78. data/lib/expressir/express/formatters/remark_item_formatter.rb +18 -16
  79. data/lib/expressir/express/formatters/statements_formatter.rb +190 -188
  80. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +41 -39
  81. data/lib/expressir/express/formatters.rb +22 -0
  82. data/lib/expressir/express/parser.rb +40 -41
  83. data/lib/expressir/express/pretty_formatter.rb +68 -47
  84. data/lib/expressir/express/remark_attacher.rb +210 -147
  85. data/lib/expressir/express/streaming_builder.rb +0 -3
  86. data/lib/expressir/express/transformer/remark_handling.rb +1 -2
  87. data/lib/expressir/express.rb +29 -0
  88. data/lib/expressir/manifest/resolver.rb +0 -3
  89. data/lib/expressir/manifest/validator.rb +0 -3
  90. data/lib/expressir/manifest.rb +6 -0
  91. data/lib/expressir/model/cache.rb +1 -1
  92. data/lib/expressir/model/concerns.rb +19 -0
  93. data/lib/expressir/model/data_types/aggregate.rb +1 -1
  94. data/lib/expressir/model/data_types/array.rb +1 -1
  95. data/lib/expressir/model/data_types/bag.rb +1 -1
  96. data/lib/expressir/model/data_types/binary.rb +1 -1
  97. data/lib/expressir/model/data_types/boolean.rb +1 -1
  98. data/lib/expressir/model/data_types/enumeration.rb +1 -1
  99. data/lib/expressir/model/data_types/enumeration_item.rb +1 -1
  100. data/lib/expressir/model/data_types/generic.rb +1 -1
  101. data/lib/expressir/model/data_types/generic_entity.rb +1 -1
  102. data/lib/expressir/model/data_types/integer.rb +1 -1
  103. data/lib/expressir/model/data_types/list.rb +1 -1
  104. data/lib/expressir/model/data_types/logical.rb +1 -1
  105. data/lib/expressir/model/data_types/number.rb +1 -1
  106. data/lib/expressir/model/data_types/real.rb +1 -1
  107. data/lib/expressir/model/data_types/select.rb +1 -1
  108. data/lib/expressir/model/data_types/set.rb +1 -1
  109. data/lib/expressir/model/data_types/string.rb +1 -1
  110. data/lib/expressir/model/data_types.rb +25 -0
  111. data/lib/expressir/model/declarations/attribute.rb +1 -1
  112. data/lib/expressir/model/declarations/constant.rb +1 -1
  113. data/lib/expressir/model/declarations/derived_attribute.rb +1 -1
  114. data/lib/expressir/model/declarations/entity.rb +4 -1
  115. data/lib/expressir/model/declarations/function.rb +3 -1
  116. data/lib/expressir/model/declarations/informal_proposition_rule.rb +2 -1
  117. data/lib/expressir/model/declarations/interface.rb +1 -1
  118. data/lib/expressir/model/declarations/interface_item.rb +1 -1
  119. data/lib/expressir/model/declarations/interfaced_item.rb +1 -1
  120. data/lib/expressir/model/declarations/inverse_attribute.rb +1 -1
  121. data/lib/expressir/model/declarations/parameter.rb +1 -1
  122. data/lib/expressir/model/declarations/procedure.rb +3 -1
  123. data/lib/expressir/model/declarations/remark_item.rb +1 -1
  124. data/lib/expressir/model/declarations/rule.rb +4 -1
  125. data/lib/expressir/model/declarations/schema.rb +2 -1
  126. data/lib/expressir/model/declarations/schema_version.rb +1 -1
  127. data/lib/expressir/model/declarations/schema_version_item.rb +1 -1
  128. data/lib/expressir/model/declarations/subtype_constraint.rb +1 -1
  129. data/lib/expressir/model/declarations/type.rb +4 -1
  130. data/lib/expressir/model/declarations/unique_rule.rb +1 -1
  131. data/lib/expressir/model/declarations/variable.rb +1 -1
  132. data/lib/expressir/model/declarations/where_rule.rb +1 -1
  133. data/lib/expressir/model/declarations.rb +31 -0
  134. data/lib/expressir/model/dependency_resolver.rb +0 -2
  135. data/lib/expressir/model/exp_file.rb +38 -0
  136. data/lib/expressir/model/expressions/aggregate_initializer.rb +1 -1
  137. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +1 -1
  138. data/lib/expressir/model/expressions/binary_expression.rb +1 -1
  139. data/lib/expressir/model/expressions/entity_constructor.rb +1 -1
  140. data/lib/expressir/model/expressions/function_call.rb +1 -1
  141. data/lib/expressir/model/expressions/interval.rb +1 -1
  142. data/lib/expressir/model/expressions/query_expression.rb +1 -1
  143. data/lib/expressir/model/expressions/unary_expression.rb +1 -1
  144. data/lib/expressir/model/expressions.rb +18 -0
  145. data/lib/expressir/model/identifier.rb +5 -1
  146. data/lib/expressir/model/indexes.rb +11 -0
  147. data/lib/expressir/model/literals/binary.rb +1 -1
  148. data/lib/expressir/model/literals/integer.rb +1 -1
  149. data/lib/expressir/model/literals/logical.rb +1 -1
  150. data/lib/expressir/model/literals/real.rb +1 -1
  151. data/lib/expressir/model/literals/string.rb +1 -1
  152. data/lib/expressir/model/literals.rb +13 -0
  153. data/lib/expressir/model/model_element.rb +7 -15
  154. data/lib/expressir/model/references/attribute_reference.rb +1 -1
  155. data/lib/expressir/model/references/group_reference.rb +1 -1
  156. data/lib/expressir/model/references/index_reference.rb +1 -1
  157. data/lib/expressir/model/references/simple_reference.rb +1 -1
  158. data/lib/expressir/model/references.rb +12 -0
  159. data/lib/expressir/model/remark_info.rb +1 -7
  160. data/lib/expressir/model/repository.rb +72 -36
  161. data/lib/expressir/model/repository_validator.rb +0 -2
  162. data/lib/expressir/model/search_engine.rb +6 -30
  163. data/lib/expressir/model/statements/alias.rb +1 -1
  164. data/lib/expressir/model/statements/assignment.rb +1 -1
  165. data/lib/expressir/model/statements/case.rb +1 -1
  166. data/lib/expressir/model/statements/case_action.rb +1 -1
  167. data/lib/expressir/model/statements/compound.rb +1 -1
  168. data/lib/expressir/model/statements/escape.rb +1 -1
  169. data/lib/expressir/model/statements/if.rb +1 -1
  170. data/lib/expressir/model/statements/null.rb +1 -1
  171. data/lib/expressir/model/statements/procedure_call.rb +1 -1
  172. data/lib/expressir/model/statements/repeat.rb +1 -1
  173. data/lib/expressir/model/statements/return.rb +1 -1
  174. data/lib/expressir/model/statements/skip.rb +1 -1
  175. data/lib/expressir/model/statements.rb +20 -0
  176. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +1 -1
  177. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +1 -1
  178. data/lib/expressir/model/supertype_expressions.rb +12 -0
  179. data/lib/expressir/model.rb +28 -4
  180. data/lib/expressir/package/builder.rb +33 -4
  181. data/lib/expressir/package/metadata.rb +0 -1
  182. data/lib/expressir/package/reader.rb +0 -1
  183. data/lib/expressir/package.rb +8 -0
  184. data/lib/expressir/schema_manifest.rb +5 -6
  185. data/lib/expressir/schema_manifest_entry.rb +3 -4
  186. data/lib/expressir/transformer.rb +7 -0
  187. data/lib/expressir/version.rb +1 -1
  188. data/lib/expressir.rb +23 -171
  189. metadata +49 -9
  190. data/lib/expressir/express/builders/token_builder.rb +0 -15
@@ -1,41 +1,43 @@
1
1
  module Expressir
2
2
  module Express
3
- module RemarkFormatter
4
- private
3
+ module Formatters
4
+ module RemarkFormatter
5
+ private
5
6
 
6
- def format_remark(node, remark)
7
- # Handle embedded remarks
8
- if remark.include?("\n")
9
- [
7
+ def format_remark(node, remark)
8
+ # Handle embedded remarks
9
+ if remark.include?("\n")
10
+ [
11
+ [
12
+ "(*\"",
13
+ node.path || node.id,
14
+ "\"",
15
+ ].join,
16
+ remark,
17
+ "*)",
18
+ ].join("\n")
19
+ elsif node.path.nil? && node.id.include?("IP")
20
+ # Handle immediate informal propositions
10
21
  [
11
- "(*\"",
22
+ "--",
23
+ node.id,
24
+ " ",
25
+ remark,
26
+ ].join
27
+ else
28
+ # Handle tail remarks
29
+ [
30
+ "--\"",
12
31
  node.path || node.id,
13
- "\"",
14
- ].join,
15
- remark,
16
- "*)",
17
- ].join("\n")
18
- elsif node.path.nil? && node.id.include?("IP")
19
- # Handle immediate informal propositions
20
- [
21
- "--",
22
- node.id,
23
- " ",
24
- remark,
25
- ].join
26
- else
27
- # Handle tail remarks
28
- [
29
- "--\"",
30
- node.path || node.id,
31
- "\" ",
32
- remark,
33
- ].join
32
+ "\" ",
33
+ remark,
34
+ ].join
35
+ end
34
36
  end
35
- end
36
37
 
37
- def format_untagged_remark(remark)
38
- if remark.is_a?(Model::RemarkInfo)
38
+ def format_untagged_remark(remark)
39
+ return "" unless remark.is_a?(Model::RemarkInfo)
40
+
39
41
  text = remark.text
40
42
  return "" if text.nil? || text.empty?
41
43
 
@@ -48,47 +50,31 @@ module Expressir
48
50
  else
49
51
  "(* #{formatted_text} *)"
50
52
  end
51
- else
52
- return "" if remark.nil? || remark.empty?
53
-
54
- if remark.include?("\n")
55
- ["(*", remark, "*)"].join("\n")
56
- else
57
- "-- #{remark}"
58
- end
59
53
  end
60
- end
61
54
 
62
- def format_inline_tail_remark(node)
63
- return "" if @no_remarks
64
- return "" unless node.is_a?(Model::ModelElement)
65
- return "" if node.untagged_remarks.nil? || node.untagged_remarks.empty?
55
+ def format_inline_tail_remark(node)
56
+ return "" if @no_remarks
57
+ return "" unless node.is_a?(Model::ModelElement)
58
+ return "" if node.untagged_remarks.nil? || node.untagged_remarks.empty?
66
59
 
67
- remark = node.untagged_remarks.first
68
- return "" if remark.nil?
60
+ remark = node.untagged_remarks.first
61
+ return "" unless remark.is_a?(Model::RemarkInfo)
69
62
 
70
- if remark.is_a?(Model::RemarkInfo)
71
63
  text = remark.text
72
64
  return "" if text.nil? || text.empty?
73
65
 
74
66
  formatted_text = remark.tagged? ? "\"#{remark.tag}\" #{text}" : text
75
67
  remark.tail? ? " -- #{formatted_text}" : " (* #{formatted_text} *)"
76
- else
77
- return "" if remark.empty?
78
-
79
- " -- #{remark}"
80
68
  end
81
- end
82
69
 
83
- def format_end_scope_remark(node)
84
- return "" if @no_remarks
85
- return "" unless node.is_a?(Model::ModelElement)
86
- return "" if node.untagged_remarks.nil? || node.untagged_remarks.empty?
70
+ def format_end_scope_remark(node)
71
+ return "" if @no_remarks
72
+ return "" unless node.is_a?(Model::ModelElement)
73
+ return "" if node.untagged_remarks.nil? || node.untagged_remarks.empty?
87
74
 
88
- remark = node.untagged_remarks.last
89
- return "" if remark.nil?
75
+ remark = node.untagged_remarks.last
76
+ return "" unless remark.is_a?(Model::RemarkInfo)
90
77
 
91
- if remark.is_a?(Model::RemarkInfo)
92
78
  text = remark.text
93
79
  return "" if text.nil? || text.empty?
94
80
 
@@ -97,16 +83,11 @@ module Expressir
97
83
 
98
84
  formatted_text = remark.tagged? ? "\"#{remark.tag}\" #{text}" : text
99
85
  " -- #{formatted_text}"
100
- else
101
- return "" if remark.empty?
102
-
103
- # Legacy string format - assume it's a tail remark
104
- " -- #{remark}"
105
86
  end
106
- end
107
87
 
108
- def format_preamble_remark(remark, indent_str = "")
109
- if remark.is_a?(Model::RemarkInfo)
88
+ def format_preamble_remark(remark, indent_str = "")
89
+ return "" unless remark.is_a?(Model::RemarkInfo)
90
+
110
91
  text = remark.text
111
92
  text = "\"#{remark.tag}\" #{text}" if remark.tagged?
112
93
 
@@ -122,174 +103,160 @@ module Expressir
122
103
  else
123
104
  "#{indent_str}(* #{text} *)"
124
105
  end
125
- elsif remark.include?("\n")
126
- lines = remark.split("\n")
127
- [
128
- "#{indent_str}(*",
129
- *lines.map { |line| "#{indent_str} #{line.strip}" },
130
- "#{indent_str}*)",
131
- ].join("\n")
132
- else
133
- "#{indent_str}-- #{remark}"
134
106
  end
135
- end
136
107
 
137
- def format_preamble_remarks(node, indent_str = "")
138
- return nil if @no_remarks
139
- return nil unless node.is_a?(Model::ModelElement)
140
- return nil if node.untagged_remarks.nil? || node.untagged_remarks.empty?
141
-
142
- # For scope containers, exclude the last tail remark as it's the END_* remark
143
- # but keep all embedded remarks
144
- is_scope_container = node.is_a?(Model::Declarations::Schema) ||
145
- node.is_a?(Model::Declarations::Entity) ||
146
- node.is_a?(Model::Declarations::Type) ||
147
- node.is_a?(Model::Declarations::Function) ||
148
- node.is_a?(Model::Declarations::Procedure) ||
149
- node.is_a?(Model::Declarations::Rule)
150
-
151
- preamble_remarks = node.untagged_remarks.select do |remark|
152
- if remark.is_a?(Model::RemarkInfo)
153
- !remark.text.nil? && !remark.text.empty?
154
- else
155
- !remark.nil? && !remark.empty?
108
+ def format_preamble_remarks(node, indent_str = "")
109
+ return nil if @no_remarks
110
+ return nil unless node.is_a?(Model::ModelElement)
111
+ return nil if node.untagged_remarks.nil? || node.untagged_remarks.empty?
112
+
113
+ # For scope containers, exclude the last tail remark as it's the END_* remark
114
+ # but keep all embedded remarks
115
+ is_scope_container = node.is_a?(Model::Declarations::Schema) ||
116
+ node.is_a?(Model::Declarations::Entity) ||
117
+ node.is_a?(Model::Declarations::Type) ||
118
+ node.is_a?(Model::Declarations::Function) ||
119
+ node.is_a?(Model::Declarations::Procedure) ||
120
+ node.is_a?(Model::Declarations::Rule)
121
+
122
+ preamble_remarks = node.untagged_remarks.select do |remark|
123
+ remark.is_a?(Model::RemarkInfo) && !remark.text.nil? && !remark.text.empty?
156
124
  end
157
- end
158
125
 
159
- # For scope containers: exclude last remark ONLY if it's a tail remark (END_* remark)
160
- # Keep all embedded remarks
161
- if is_scope_container && preamble_remarks.length > 1
162
- last_remark = preamble_remarks.last
163
- if last_remark.is_a?(Model::RemarkInfo)
126
+ # For scope containers: exclude last remark ONLY if it's a tail remark (END_* remark)
127
+ # Keep all embedded remarks
128
+ if is_scope_container && preamble_remarks.length > 1
129
+ last_remark = preamble_remarks.last
164
130
  # Only exclude if it's a tail remark
165
131
  preamble_remarks = preamble_remarks[0..-2] if last_remark.tail?
166
- else
167
- # Legacy string format - assume it's a tail remark
168
- preamble_remarks = preamble_remarks[0..-2]
169
132
  end
170
- end
171
133
 
172
- return nil if preamble_remarks.empty?
134
+ return nil if preamble_remarks.empty?
173
135
 
174
- preamble_remarks.map do |remark|
175
- format_preamble_remark(remark, indent_str)
176
- end.join("\n")
177
- end
136
+ preamble_remarks.map do |remark|
137
+ format_preamble_remark(remark, indent_str)
138
+ end.join("\n")
139
+ end
178
140
 
179
- def format_remarks(node)
180
- remarks = []
141
+ def format_remarks(node)
142
+ remarks = []
181
143
 
182
- # Add tagged remarks
183
- if node.class.method_defined?(:remarks) && !@no_remarks &&
184
- !node.remarks.nil?
185
- remarks.concat(node.remarks.compact.map do |remark|
186
- format_remark(node, remark)
187
- end)
188
- end
144
+ # Add tagged remarks
145
+ if node.class.method_defined?(:remarks) && !@no_remarks &&
146
+ !node.remarks.nil?
147
+ remarks.concat(node.remarks.compact.map do |remark|
148
+ format_remark(node, remark)
149
+ end)
150
+ end
189
151
 
190
- # Skip untagged remarks for nodes that handle them separately
191
- skip_untagged = node.is_a?(Model::Declarations::Attribute) ||
192
- node.is_a?(Model::DataTypes::EnumerationItem) ||
193
- node.is_a?(Model::Declarations::Schema) ||
194
- node.is_a?(Model::Declarations::Entity) ||
195
- node.is_a?(Model::Declarations::Type) ||
196
- node.is_a?(Model::Declarations::Function) ||
197
- node.is_a?(Model::Declarations::Procedure) ||
198
- node.is_a?(Model::Declarations::Rule)
199
-
200
- # Add untagged remarks only for nodes that don't handle them specially
201
- if !skip_untagged && node.is_a?(Model::ModelElement) && !@no_remarks &&
202
- !node.untagged_remarks.nil?
203
- remarks.concat(node.untagged_remarks.map do |remark|
204
- format_untagged_remark(remark)
205
- end)
206
- end
152
+ # Skip untagged remarks for nodes that handle them separately
153
+ skip_untagged = node.is_a?(Model::Declarations::Attribute) ||
154
+ node.is_a?(Model::DataTypes::EnumerationItem) ||
155
+ node.is_a?(Model::Declarations::Schema) ||
156
+ node.is_a?(Model::Declarations::Entity) ||
157
+ node.is_a?(Model::Declarations::Type) ||
158
+ node.is_a?(Model::Declarations::Function) ||
159
+ node.is_a?(Model::Declarations::Procedure) ||
160
+ node.is_a?(Model::Declarations::Rule)
161
+
162
+ # Add untagged remarks only for nodes that don't handle them specially
163
+ if !skip_untagged && node.is_a?(Model::ModelElement) && !@no_remarks &&
164
+ !node.untagged_remarks.nil?
165
+ remarks.concat(node.untagged_remarks.map do |remark|
166
+ format_untagged_remark(remark)
167
+ end)
168
+ end
207
169
 
208
- remarks
209
- end
170
+ remarks
171
+ end
210
172
 
211
- def format_scope_remarks(node)
212
- remarks = []
173
+ def format_scope_remarks(node)
174
+ remarks = []
213
175
 
214
- # Collect tagged remarks using the standard format_remarks
215
- remarks.concat(format_remarks(node))
176
+ # Collect tagged remarks using the standard format_remarks
177
+ remarks.concat(format_remarks(node))
216
178
 
217
- # Special handling for Schema to get proper remark ordering
218
- if node.is_a?(Model::Declarations::Schema)
219
- # Schema's own remarks that need to be in specific positions
220
- schema_remarks = {}
221
- if !@no_remarks && node.is_a?(Model::ModelElement) && !node.untagged_remarks.nil?
222
- node.untagged_remarks.compact.each do |remark|
223
- text = remark.is_a?(Model::RemarkInfo) ? remark.text : remark
224
- schema_remarks[text] = remark unless text == "interfaces" # Skip "interfaces"
225
- end
226
- end
179
+ # Special handling for Schema to get proper remark ordering
180
+ if node.is_a?(Model::Declarations::Schema)
181
+ # Schema's own remarks that need to be in specific positions
182
+ schema_remarks = {}
183
+ if !@no_remarks && node.is_a?(Model::ModelElement) && !node.untagged_remarks.nil?
184
+ node.untagged_remarks.compact.each do |remark|
185
+ next unless remark.is_a?(Model::RemarkInfo)
227
186
 
228
- # Add Schema remarks in the proper order relative to children
229
- # Declaration order: constants, types, entities, subtype_constraints, functions, rules, procedures
230
- remarks.concat(schema_remarks["constants"] ? [format_untagged_remark(schema_remarks["constants"])] : [])
231
-
232
- # Collect from children grouped by type
233
- if node.is_a?(Model::ModelElement) && node.children
234
- types_done = false
235
- entities_done = false
236
-
237
- node.children.select do |child|
238
- !child.is_a?(Model::DataTypes::EnumerationItem) || node.is_a?(Model::Declarations::Type)
239
- end.each do |child|
240
- # Add types section remarks
241
- if !types_done && child.is_a?(Model::Declarations::Type)
242
- types_done = true
187
+ text = remark.text
188
+ schema_remarks[text] = remark unless text == "interfaces" # Skip "interfaces"
243
189
  end
190
+ end
244
191
 
245
- # Add entities section remarks
246
- if !entities_done && child.is_a?(Model::Declarations::Entity)
247
- entities_done = true
192
+ # Add Schema remarks in the proper order relative to children
193
+ # Declaration order: constants, types, entities, subtype_constraints, functions, rules, procedures
194
+ remarks.concat(schema_remarks["constants"] ? [format_untagged_remark(schema_remarks["constants"])] : [])
195
+
196
+ # Collect from children grouped by type
197
+ if node.is_a?(Model::ModelElement) && node.children
198
+ types_done = false
199
+ entities_done = false
200
+
201
+ node.children.select do |child|
202
+ !child.is_a?(Model::DataTypes::EnumerationItem) || node.is_a?(Model::Declarations::Type)
203
+ end.each do |child|
204
+ # Add types section remarks
205
+ if !types_done && child.is_a?(Model::Declarations::Type)
206
+ types_done = true
207
+ end
208
+
209
+ # Add entities section remarks
210
+ if !entities_done && child.is_a?(Model::Declarations::Entity)
211
+ entities_done = true
212
+ end
213
+
214
+ # Add subtype constraints Schema remark after last entity, before first subtype constraint
215
+ if entities_done && child.is_a?(Model::Declarations::SubtypeConstraint) && schema_remarks["subtype constraints"]
216
+ remarks.push(format_untagged_remark(schema_remarks["subtype constraints"]))
217
+ schema_remarks.delete("subtype constraints") # Only add once
218
+ end
219
+
220
+ # Recursively collect from child
221
+ remarks.concat(format_scope_remarks(child))
248
222
  end
223
+ end
224
+ else
225
+ # For non-Schema nodes, use standard logic
226
+ skip_untagged_types = [
227
+ Model::Declarations::Entity,
228
+ Model::Declarations::Type,
229
+ Model::Declarations::Function,
230
+ Model::Declarations::Procedure,
231
+ Model::Declarations::Rule,
232
+ Model::Declarations::SubtypeConstraint,
233
+ ]
234
+
235
+ if !@no_remarks &&
236
+ node.is_a?(Model::ModelElement) &&
237
+ !node.untagged_remarks.nil? &&
238
+ skip_untagged_types.any? { |type| node.is_a?(type) }
239
+
240
+ remarks.concat(node.untagged_remarks.compact.select do |remark|
241
+ remark.is_a?(Model::RemarkInfo)
242
+ end.map do |remark|
243
+ format_untagged_remark(remark)
244
+ end)
245
+ end
249
246
 
250
- # Add subtype constraints Schema remark after last entity, before first subtype constraint
251
- if entities_done && child.is_a?(Model::Declarations::SubtypeConstraint) && schema_remarks["subtype constraints"]
252
- remarks.push(format_untagged_remark(schema_remarks["subtype constraints"]))
253
- schema_remarks.delete("subtype constraints") # Only add once
247
+ # Then recursively collect from children
248
+ if node.is_a?(Model::ModelElement) && node.children
249
+ node.children.select do |child|
250
+ !child.is_a?(Model::DataTypes::EnumerationItem) || node.is_a?(Model::Declarations::Type)
251
+ end.each do |child|
252
+ # Recursively collect remarks from child and its descendants
253
+ remarks.concat(format_scope_remarks(child))
254
254
  end
255
-
256
- # Recursively collect from child
257
- remarks.concat(format_scope_remarks(child))
258
255
  end
259
256
  end
260
- else
261
- # For non-Schema nodes, use standard logic
262
- skip_untagged_types = [
263
- Model::Declarations::Entity,
264
- Model::Declarations::Type,
265
- Model::Declarations::Function,
266
- Model::Declarations::Procedure,
267
- Model::Declarations::Rule,
268
- Model::Declarations::SubtypeConstraint,
269
- ]
270
-
271
- if !@no_remarks &&
272
- node.is_a?(Model::ModelElement) &&
273
- !node.untagged_remarks.nil? &&
274
- skip_untagged_types.any? { |type| node.is_a?(type) }
275
-
276
- remarks.concat(node.untagged_remarks.compact.map do |remark|
277
- format_untagged_remark(remark)
278
- end)
279
- end
280
257
 
281
- # Then recursively collect from children
282
- if node.is_a?(Model::ModelElement) && node.children
283
- node.children.select do |child|
284
- !child.is_a?(Model::DataTypes::EnumerationItem) || node.is_a?(Model::Declarations::Type)
285
- end.each do |child|
286
- # Recursively collect remarks from child and its descendants
287
- remarks.concat(format_scope_remarks(child))
288
- end
289
- end
258
+ remarks
290
259
  end
291
-
292
- remarks
293
260
  end
294
261
  end
295
262
  end
@@ -1,23 +1,25 @@
1
1
  module Expressir
2
2
  module Express
3
- # Formatter for RemarkItem declarations
4
- module RemarkItemFormatter
5
- # Format a RemarkItem as an EXPRESS remark
6
- # @param node [Model::Declarations::RemarkItem] The remark item to format
7
- # @return [String] Formatted remark
8
- def format_remark_item(node)
9
- return "" unless node.remarks&.any?
3
+ module Formatters
4
+ # Formatter for RemarkItem declarations
5
+ module RemarkItemFormatter
6
+ # Format a RemarkItem as an EXPRESS remark
7
+ # @param node [Model::Declarations::RemarkItem] The remark item to format
8
+ # @return [String] Formatted remark
9
+ def format_remark_item(node)
10
+ return "" unless node.remarks&.any?
10
11
 
11
- # Check if any remark contains newlines
12
- has_newlines = node.remarks.any? { |r| r.to_s.include?("\n") }
12
+ # Check if any remark contains newlines
13
+ has_newlines = node.remarks.any? { |r| r.to_s.include?("\n") }
13
14
 
14
- if has_newlines
15
- # Multi-line format: (*"path" remarks *)
16
- remarks_text = node.remarks.join("\n")
17
- "(*\"#{node.path}\"\n#{remarks_text}\n*)"
18
- else
19
- # Single-line format: --"path"
20
- "--\"#{node.path}\""
15
+ if has_newlines
16
+ # Multi-line format: (*"path" remarks *)
17
+ remarks_text = node.remarks.join("\n")
18
+ "(*\"#{node.path}\"\n#{remarks_text}\n*)"
19
+ else
20
+ # Single-line format: --"path"
21
+ "--\"#{node.path}\""
22
+ end
21
23
  end
22
24
  end
23
25
  end