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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/.rubocop_todo.yml +254 -77
- data/Gemfile +4 -1
- data/README.adoc +63 -26
- data/benchmark/srl_benchmark.rb +386 -0
- data/benchmark/srl_native_benchmark.rb +142 -0
- data/benchmark/srl_ruby_benchmark.rb +130 -0
- data/expressir.gemspec +4 -2
- data/lib/expressir/benchmark.rb +1 -1
- data/lib/expressir/changes/item_change.rb +0 -1
- data/lib/expressir/changes/mapping_change.rb +0 -1
- data/lib/expressir/changes/schema_change.rb +0 -2
- data/lib/expressir/changes/version_change.rb +0 -3
- data/lib/expressir/changes.rb +5 -6
- data/lib/expressir/cli.rb +10 -24
- data/lib/expressir/commands/base.rb +2 -9
- data/lib/expressir/commands/changes.rb +0 -2
- data/lib/expressir/commands/changes_import_eengine.rb +0 -3
- data/lib/expressir/commands/changes_validate.rb +0 -2
- data/lib/expressir/commands/format.rb +5 -3
- data/lib/expressir/commands/manifest.rb +0 -7
- data/lib/expressir/commands/package.rb +93 -101
- data/lib/expressir/commands/validate.rb +0 -2
- data/lib/expressir/commands/validate_ascii.rb +2 -4
- data/lib/expressir/commands/validate_load.rb +8 -5
- data/lib/expressir/commands.rb +20 -0
- data/lib/expressir/config.rb +0 -2
- data/lib/expressir/coverage.rb +11 -4
- data/lib/expressir/eengine/arm_compare_report.rb +1 -4
- data/lib/expressir/eengine/changes_section.rb +1 -3
- data/lib/expressir/eengine/compare_report.rb +1 -13
- data/lib/expressir/eengine/mim_compare_report.rb +1 -4
- data/lib/expressir/eengine/modified_object.rb +1 -2
- data/lib/expressir/eengine.rb +9 -0
- data/lib/expressir/errors.rb +113 -0
- data/lib/expressir/express/builder.rb +22 -7
- data/lib/expressir/express/builder_registry.rb +411 -0
- data/lib/expressir/express/builders/attribute_decl_builder.rb +0 -6
- data/lib/expressir/express/builders/built_in_builder.rb +1 -16
- data/lib/expressir/express/builders/constant_builder.rb +4 -19
- data/lib/expressir/express/builders/declaration_builder.rb +0 -4
- data/lib/expressir/express/builders/derive_clause_builder.rb +0 -2
- data/lib/expressir/express/builders/derived_attr_builder.rb +0 -2
- data/lib/expressir/express/builders/domain_rule_builder.rb +0 -2
- data/lib/expressir/express/builders/entity_decl_builder.rb +7 -13
- data/lib/expressir/express/builders/explicit_attr_builder.rb +5 -8
- data/lib/expressir/express/builders/expression_builder.rb +31 -67
- data/lib/expressir/express/builders/function_decl_builder.rb +20 -18
- data/lib/expressir/express/builders/interface_builder.rb +0 -20
- data/lib/expressir/express/builders/inverse_attr_builder.rb +0 -2
- data/lib/expressir/express/builders/inverse_attr_type_builder.rb +0 -6
- data/lib/expressir/express/builders/inverse_clause_builder.rb +0 -2
- data/lib/expressir/express/builders/literal_builder.rb +1 -15
- data/lib/expressir/express/builders/procedure_decl_builder.rb +20 -19
- data/lib/expressir/express/builders/qualifier_builder.rb +0 -27
- data/lib/expressir/express/builders/reference_builder.rb +1 -10
- data/lib/expressir/express/builders/rule_decl_builder.rb +21 -19
- data/lib/expressir/express/builders/schema_body_decl_builder.rb +0 -4
- data/lib/expressir/express/builders/schema_decl_builder.rb +7 -13
- data/lib/expressir/express/builders/schema_version_builder.rb +0 -6
- data/lib/expressir/express/builders/simple_id_builder.rb +1 -10
- data/lib/expressir/express/builders/statement_builder.rb +4 -32
- data/lib/expressir/express/builders/subtype_constraint_builder.rb +6 -30
- data/lib/expressir/express/builders/syntax_builder.rb +60 -7
- data/lib/expressir/express/builders/type_builder.rb +3 -45
- data/lib/expressir/express/builders/type_decl_builder.rb +1 -7
- data/lib/expressir/express/builders/unique_clause_builder.rb +1 -3
- data/lib/expressir/express/builders/unique_rule_builder.rb +0 -2
- data/lib/expressir/express/builders/where_clause_builder.rb +1 -3
- data/lib/expressir/express/builders.rb +47 -35
- data/lib/expressir/express/error.rb +0 -3
- data/lib/expressir/express/formatter.rb +17 -19
- data/lib/expressir/express/formatters/data_types_formatter.rb +295 -293
- data/lib/expressir/express/formatters/declarations_formatter.rb +617 -615
- data/lib/expressir/express/formatters/expressions_formatter.rb +146 -144
- data/lib/expressir/express/formatters/literals_formatter.rb +35 -33
- data/lib/expressir/express/formatters/references_formatter.rb +34 -32
- data/lib/expressir/express/formatters/remark_formatter.rb +176 -209
- data/lib/expressir/express/formatters/remark_item_formatter.rb +18 -16
- data/lib/expressir/express/formatters/statements_formatter.rb +190 -188
- data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +41 -39
- data/lib/expressir/express/formatters.rb +22 -0
- data/lib/expressir/express/parser.rb +40 -41
- data/lib/expressir/express/pretty_formatter.rb +68 -47
- data/lib/expressir/express/remark_attacher.rb +210 -147
- data/lib/expressir/express/streaming_builder.rb +0 -3
- data/lib/expressir/express/transformer/remark_handling.rb +1 -2
- data/lib/expressir/express.rb +29 -0
- data/lib/expressir/manifest/resolver.rb +0 -3
- data/lib/expressir/manifest/validator.rb +0 -3
- data/lib/expressir/manifest.rb +6 -0
- data/lib/expressir/model/cache.rb +1 -1
- data/lib/expressir/model/concerns.rb +19 -0
- data/lib/expressir/model/data_types/aggregate.rb +1 -1
- data/lib/expressir/model/data_types/array.rb +1 -1
- data/lib/expressir/model/data_types/bag.rb +1 -1
- data/lib/expressir/model/data_types/binary.rb +1 -1
- data/lib/expressir/model/data_types/boolean.rb +1 -1
- data/lib/expressir/model/data_types/enumeration.rb +1 -1
- data/lib/expressir/model/data_types/enumeration_item.rb +1 -1
- data/lib/expressir/model/data_types/generic.rb +1 -1
- data/lib/expressir/model/data_types/generic_entity.rb +1 -1
- data/lib/expressir/model/data_types/integer.rb +1 -1
- data/lib/expressir/model/data_types/list.rb +1 -1
- data/lib/expressir/model/data_types/logical.rb +1 -1
- data/lib/expressir/model/data_types/number.rb +1 -1
- data/lib/expressir/model/data_types/real.rb +1 -1
- data/lib/expressir/model/data_types/select.rb +1 -1
- data/lib/expressir/model/data_types/set.rb +1 -1
- data/lib/expressir/model/data_types/string.rb +1 -1
- data/lib/expressir/model/data_types.rb +25 -0
- data/lib/expressir/model/declarations/attribute.rb +1 -1
- data/lib/expressir/model/declarations/constant.rb +1 -1
- data/lib/expressir/model/declarations/derived_attribute.rb +1 -1
- data/lib/expressir/model/declarations/entity.rb +4 -1
- data/lib/expressir/model/declarations/function.rb +3 -1
- data/lib/expressir/model/declarations/informal_proposition_rule.rb +2 -1
- data/lib/expressir/model/declarations/interface.rb +1 -1
- data/lib/expressir/model/declarations/interface_item.rb +1 -1
- data/lib/expressir/model/declarations/interfaced_item.rb +1 -1
- data/lib/expressir/model/declarations/inverse_attribute.rb +1 -1
- data/lib/expressir/model/declarations/parameter.rb +1 -1
- data/lib/expressir/model/declarations/procedure.rb +3 -1
- data/lib/expressir/model/declarations/remark_item.rb +1 -1
- data/lib/expressir/model/declarations/rule.rb +4 -1
- data/lib/expressir/model/declarations/schema.rb +2 -1
- data/lib/expressir/model/declarations/schema_version.rb +1 -1
- data/lib/expressir/model/declarations/schema_version_item.rb +1 -1
- data/lib/expressir/model/declarations/subtype_constraint.rb +1 -1
- data/lib/expressir/model/declarations/type.rb +4 -1
- data/lib/expressir/model/declarations/unique_rule.rb +1 -1
- data/lib/expressir/model/declarations/variable.rb +1 -1
- data/lib/expressir/model/declarations/where_rule.rb +1 -1
- data/lib/expressir/model/declarations.rb +31 -0
- data/lib/expressir/model/dependency_resolver.rb +0 -2
- data/lib/expressir/model/exp_file.rb +38 -0
- data/lib/expressir/model/expressions/aggregate_initializer.rb +1 -1
- data/lib/expressir/model/expressions/aggregate_initializer_item.rb +1 -1
- data/lib/expressir/model/expressions/binary_expression.rb +1 -1
- data/lib/expressir/model/expressions/entity_constructor.rb +1 -1
- data/lib/expressir/model/expressions/function_call.rb +1 -1
- data/lib/expressir/model/expressions/interval.rb +1 -1
- data/lib/expressir/model/expressions/query_expression.rb +1 -1
- data/lib/expressir/model/expressions/unary_expression.rb +1 -1
- data/lib/expressir/model/expressions.rb +18 -0
- data/lib/expressir/model/identifier.rb +5 -1
- data/lib/expressir/model/indexes.rb +11 -0
- data/lib/expressir/model/literals/binary.rb +1 -1
- data/lib/expressir/model/literals/integer.rb +1 -1
- data/lib/expressir/model/literals/logical.rb +1 -1
- data/lib/expressir/model/literals/real.rb +1 -1
- data/lib/expressir/model/literals/string.rb +1 -1
- data/lib/expressir/model/literals.rb +13 -0
- data/lib/expressir/model/model_element.rb +7 -15
- data/lib/expressir/model/references/attribute_reference.rb +1 -1
- data/lib/expressir/model/references/group_reference.rb +1 -1
- data/lib/expressir/model/references/index_reference.rb +1 -1
- data/lib/expressir/model/references/simple_reference.rb +1 -1
- data/lib/expressir/model/references.rb +12 -0
- data/lib/expressir/model/remark_info.rb +1 -7
- data/lib/expressir/model/repository.rb +72 -36
- data/lib/expressir/model/repository_validator.rb +0 -2
- data/lib/expressir/model/search_engine.rb +6 -30
- data/lib/expressir/model/statements/alias.rb +1 -1
- data/lib/expressir/model/statements/assignment.rb +1 -1
- data/lib/expressir/model/statements/case.rb +1 -1
- data/lib/expressir/model/statements/case_action.rb +1 -1
- data/lib/expressir/model/statements/compound.rb +1 -1
- data/lib/expressir/model/statements/escape.rb +1 -1
- data/lib/expressir/model/statements/if.rb +1 -1
- data/lib/expressir/model/statements/null.rb +1 -1
- data/lib/expressir/model/statements/procedure_call.rb +1 -1
- data/lib/expressir/model/statements/repeat.rb +1 -1
- data/lib/expressir/model/statements/return.rb +1 -1
- data/lib/expressir/model/statements/skip.rb +1 -1
- data/lib/expressir/model/statements.rb +20 -0
- data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +1 -1
- data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +1 -1
- data/lib/expressir/model/supertype_expressions.rb +12 -0
- data/lib/expressir/model.rb +28 -4
- data/lib/expressir/package/builder.rb +33 -4
- data/lib/expressir/package/metadata.rb +0 -1
- data/lib/expressir/package/reader.rb +0 -1
- data/lib/expressir/package.rb +8 -0
- data/lib/expressir/schema_manifest.rb +5 -6
- data/lib/expressir/schema_manifest_entry.rb +3 -4
- data/lib/expressir/transformer.rb +7 -0
- data/lib/expressir/version.rb +1 -1
- data/lib/expressir.rb +23 -173
- metadata +64 -9
- data/lib/expressir/express/builders/token_builder.rb +0 -15
|
@@ -1,41 +1,43 @@
|
|
|
1
1
|
module Expressir
|
|
2
2
|
module Express
|
|
3
|
-
module
|
|
4
|
-
|
|
3
|
+
module Formatters
|
|
4
|
+
module RemarkFormatter
|
|
5
|
+
private
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
38
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
89
|
-
|
|
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
|
-
|
|
109
|
-
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
134
|
+
return nil if preamble_remarks.empty?
|
|
173
135
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
136
|
+
preamble_remarks.map do |remark|
|
|
137
|
+
format_preamble_remark(remark, indent_str)
|
|
138
|
+
end.join("\n")
|
|
139
|
+
end
|
|
178
140
|
|
|
179
|
-
|
|
180
|
-
|
|
141
|
+
def format_remarks(node)
|
|
142
|
+
remarks = []
|
|
181
143
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
209
|
-
|
|
170
|
+
remarks
|
|
171
|
+
end
|
|
210
172
|
|
|
211
|
-
|
|
212
|
-
|
|
173
|
+
def format_scope_remarks(node)
|
|
174
|
+
remarks = []
|
|
213
175
|
|
|
214
|
-
|
|
215
|
-
|
|
176
|
+
# Collect tagged remarks using the standard format_remarks
|
|
177
|
+
remarks.concat(format_remarks(node))
|
|
216
178
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
-
|
|
229
|
-
|
|
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
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
12
|
-
|
|
12
|
+
# Check if any remark contains newlines
|
|
13
|
+
has_newlines = node.remarks.any? { |r| r.to_s.include?("\n") }
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|