expressir 2.3.6 → 2.3.7
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/.github/workflows/rake.yml +1 -1
- data/.gitignore +2 -0
- data/.rubocop_todo.yml +17 -12
- data/CHANGELOG.md +159 -0
- data/docs/_guides/ler/step-packages.adoc +385 -0
- data/lib/expressir/coverage.rb +4 -4
- data/lib/expressir/express/builder_registry.rb +3 -1
- data/lib/expressir/express/builders/expression_builder.rb +2 -2
- data/lib/expressir/express/builders/helpers.rb +2 -8
- data/lib/expressir/express/builders/qualifier_builder.rb +2 -1
- data/lib/expressir/express/formatter.rb +32 -164
- data/lib/expressir/express/formatters/data_types_formatter.rb +39 -6
- data/lib/expressir/express/formatters/declarations_formatter.rb +47 -8
- data/lib/expressir/express/formatters/expressions_formatter.rb +20 -5
- data/lib/expressir/express/formatters/literals_formatter.rb +11 -1
- data/lib/expressir/express/formatters/references_formatter.rb +10 -1
- data/lib/expressir/express/formatters/remark_formatter.rb +1 -89
- data/lib/expressir/express/formatters/remark_item_formatter.rb +5 -4
- data/lib/expressir/express/formatters/statements_formatter.rb +32 -9
- data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +7 -3
- data/lib/expressir/express/hyperlink_formatter.rb +1 -3
- data/lib/expressir/express/model_visitor.rb +1 -1
- data/lib/expressir/express/pretty_formatter.rb +31 -108
- data/lib/expressir/express/remark_attacher.rb +118 -88
- data/lib/expressir/express/schema_head_formatter.rb +1 -3
- data/lib/expressir/model/concerns.rb +6 -0
- data/lib/expressir/model/declarations/interface_item.rb +2 -0
- data/lib/expressir/model/declarations/interfaced_item.rb +3 -0
- data/lib/expressir/model/declarations/remark_item.rb +3 -0
- data/lib/expressir/model/declarations/schema.rb +7 -5
- data/lib/expressir/model/exp_file.rb +1 -0
- data/lib/expressir/model/identifier.rb +3 -1
- data/lib/expressir/model/model_element.rb +3 -3
- data/lib/expressir/model/repository.rb +8 -0
- data/lib/expressir/model/search_engine.rb +1 -1
- data/lib/expressir/package/reader.rb +9 -24
- data/lib/expressir/version.rb +1 -1
- metadata +4 -2
data/lib/expressir/coverage.rb
CHANGED
|
@@ -282,18 +282,18 @@ module Expressir
|
|
|
282
282
|
# @return [Boolean] True if the entity has documentation
|
|
283
283
|
def self.entity_documented?(entity)
|
|
284
284
|
# Check for direct remarks (types with Identifier module have remarks)
|
|
285
|
-
if entity.is_a?(Model::
|
|
285
|
+
if entity.is_a?(Model::HasRemarks) && entity.remarks && !entity.remarks.empty?
|
|
286
286
|
return true
|
|
287
287
|
end
|
|
288
288
|
|
|
289
289
|
# Check for remark_items (types with Identifier module have remark_items)
|
|
290
|
-
if entity.is_a?(Model::
|
|
290
|
+
if entity.is_a?(Model::HasRemarkItems) && entity.remark_items && !entity.remark_items.empty?
|
|
291
291
|
return true
|
|
292
292
|
end
|
|
293
293
|
|
|
294
294
|
# For schema entities, check if there's a remark_item with their ID
|
|
295
295
|
parent = entity.parent
|
|
296
|
-
if parent.is_a?(Model::
|
|
296
|
+
if parent.is_a?(Model::HasRemarkItems) && parent.remark_items
|
|
297
297
|
entity_id = entity.id.to_s.downcase
|
|
298
298
|
parent.remark_items.any? do |item|
|
|
299
299
|
item.id.to_s.downcase == entity_id || item.id.to_s.downcase.include?("#{entity_id}.")
|
|
@@ -331,7 +331,7 @@ module Expressir
|
|
|
331
331
|
# Filter out nil elements and ensure all have IDs
|
|
332
332
|
# Note: Some ModelElement types (like Interface) don't have id
|
|
333
333
|
entities = entities.compact.select do |e|
|
|
334
|
-
e.is_a?(Model::
|
|
334
|
+
e.is_a?(Model::HasId) && e.id
|
|
335
335
|
end
|
|
336
336
|
|
|
337
337
|
# Filter out skipped entity types
|
|
@@ -332,7 +332,9 @@ module Expressir
|
|
|
332
332
|
# Type constructors
|
|
333
333
|
Builder.register(:generic_type) { |_d| Expressir::Model::DataTypes::Generic.new }
|
|
334
334
|
Builder.register(:generic_entity_type) { |_d| Expressir::Model::DataTypes::GenericEntity.new }
|
|
335
|
-
Builder.register(:aggregate_type)
|
|
335
|
+
Builder.register(:aggregate_type) do |d|
|
|
336
|
+
type_builder.build_aggregate_type(d)
|
|
337
|
+
end
|
|
336
338
|
Builder.register(:general_set_type) do |d|
|
|
337
339
|
type_builder.build_general_set_type(d)
|
|
338
340
|
end
|
|
@@ -43,7 +43,7 @@ module Expressir
|
|
|
43
43
|
term = Builder.build_term(ast_data[:term])
|
|
44
44
|
rhs = ast_data[:rhs]
|
|
45
45
|
|
|
46
|
-
return term if rhs.nil? || (rhs.
|
|
46
|
+
return term if rhs.nil? || (rhs.is_a?(Array) && rhs.empty?)
|
|
47
47
|
|
|
48
48
|
rhs_array = rhs.is_a?(Array) ? rhs : [rhs]
|
|
49
49
|
|
|
@@ -74,7 +74,7 @@ module Expressir
|
|
|
74
74
|
factor = Builder.build_factor(ast_data[:factor])
|
|
75
75
|
rhs = ast_data[:rhs]
|
|
76
76
|
|
|
77
|
-
return factor if rhs.nil? || (rhs.
|
|
77
|
+
return factor if rhs.nil? || (rhs.is_a?(Array) && rhs.empty?)
|
|
78
78
|
|
|
79
79
|
rhs_array = rhs.is_a?(Array) ? rhs : [rhs]
|
|
80
80
|
|
|
@@ -9,11 +9,9 @@ module Expressir
|
|
|
9
9
|
# Extract text from Parsanol::Slice or return as-is
|
|
10
10
|
def extract_text(val)
|
|
11
11
|
return nil unless val
|
|
12
|
-
# Handle String, Symbol, and objects with to_str (duck typing via class check)
|
|
13
12
|
return val.to_s if val.is_a?(String)
|
|
14
13
|
return val.to_s if val.is_a?(Symbol)
|
|
15
|
-
|
|
16
|
-
return val.to_s if val.class.name&.include?("Slice")
|
|
14
|
+
return val.to_s if val.is_a?(Parsanol::Slice)
|
|
17
15
|
|
|
18
16
|
if val.is_a?(Hash)
|
|
19
17
|
str = val[:str]
|
|
@@ -34,8 +32,7 @@ module Expressir
|
|
|
34
32
|
return nil unless data
|
|
35
33
|
return data.to_s if data.is_a?(String)
|
|
36
34
|
return data.to_s if data.is_a?(Symbol)
|
|
37
|
-
|
|
38
|
-
return data.to_s if data.class.name&.include?("Slice")
|
|
35
|
+
return data.to_s if data.is_a?(Parsanol::Slice)
|
|
39
36
|
|
|
40
37
|
if data.is_a?(Hash)
|
|
41
38
|
str = data[:str]
|
|
@@ -141,9 +138,6 @@ module Expressir
|
|
|
141
138
|
when Expressir::Model::References::SimpleReference
|
|
142
139
|
Expressir::Model::References::AttributeReference.new(ref: ref,
|
|
143
140
|
attribute: qualifier)
|
|
144
|
-
when Hash
|
|
145
|
-
Expressir::Model::References::IndexReference.new(ref: ref,
|
|
146
|
-
index1: qualifier[:index1], index2: qualifier[:index2])
|
|
147
141
|
else
|
|
148
142
|
ref
|
|
149
143
|
end
|
|
@@ -65,7 +65,8 @@ module Expressir
|
|
|
65
65
|
def build_index_qualifier(ast_data)
|
|
66
66
|
index1 = Builder.build_optional(ast_data[:index1])
|
|
67
67
|
index2 = Builder.build_optional(ast_data[:index2])
|
|
68
|
-
|
|
68
|
+
Expressir::Model::References::IndexReference.new(index1: index1,
|
|
69
|
+
index2: index2)
|
|
69
70
|
end
|
|
70
71
|
|
|
71
72
|
def build_index1(ast_data)
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
module Expressir
|
|
2
2
|
module Express
|
|
3
3
|
class Formatter
|
|
4
|
+
# Registry infrastructure — must precede includes so modules can register handlers
|
|
5
|
+
@format_registry = {}
|
|
6
|
+
|
|
7
|
+
def self.format_registry
|
|
8
|
+
@format_registry || superclass&.format_registry
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.register_formatter(model_class, method_name)
|
|
12
|
+
@format_registry[model_class] = method_name
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Include formatter modules — each registers its handlers via self.included
|
|
4
16
|
include Formatters::RemarkItemFormatter
|
|
5
17
|
include Formatters::RemarkFormatter
|
|
6
18
|
include Formatters::LiteralsFormatter
|
|
@@ -11,6 +23,14 @@ module Expressir
|
|
|
11
23
|
include Formatters::DataTypesFormatter
|
|
12
24
|
include Formatters::DeclarationsFormatter
|
|
13
25
|
|
|
26
|
+
# Handlers for types implemented directly in this class
|
|
27
|
+
register_formatter Model::Repository, :format_repository
|
|
28
|
+
register_formatter Model::ExpFile, :format_exp_file
|
|
29
|
+
register_formatter Model::Declarations::SchemaVersionItem, :format_noop
|
|
30
|
+
register_formatter Model::Declarations::InterfacedItem, :format_noop
|
|
31
|
+
register_formatter Model::Cache, :format_noop
|
|
32
|
+
register_formatter Model::ModelElement, :format_noop
|
|
33
|
+
|
|
14
34
|
INDENT_CHAR = " ".freeze
|
|
15
35
|
INDENT_WIDTH = 2
|
|
16
36
|
INDENT = INDENT_CHAR * INDENT_WIDTH
|
|
@@ -54,177 +74,25 @@ module Expressir
|
|
|
54
74
|
@no_remarks = no_remarks
|
|
55
75
|
end
|
|
56
76
|
|
|
57
|
-
# Formats Express model into an Express code
|
|
58
|
-
# @param [Model::ModelElement] node
|
|
59
|
-
# @return [String]
|
|
60
77
|
def self.format(node)
|
|
61
|
-
|
|
62
|
-
formatter.format(node)
|
|
78
|
+
new.format(node)
|
|
63
79
|
end
|
|
64
80
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
format_exp_file(node)
|
|
74
|
-
when Model::Declarations::Attribute
|
|
75
|
-
format_declarations_attribute(node)
|
|
76
|
-
when Model::Declarations::Constant
|
|
77
|
-
format_declarations_constant(node)
|
|
78
|
-
when Model::Declarations::Entity
|
|
79
|
-
format_declarations_entity(node)
|
|
80
|
-
when Model::Declarations::Function
|
|
81
|
-
format_declarations_function(node)
|
|
82
|
-
when Model::Declarations::Interface
|
|
83
|
-
format_declarations_interface(node)
|
|
84
|
-
when Model::Declarations::InterfaceItem
|
|
85
|
-
format_declarations_interface_item(node)
|
|
86
|
-
when Model::Declarations::Parameter
|
|
87
|
-
format_declarations_parameter(node)
|
|
88
|
-
when Model::Declarations::Procedure
|
|
89
|
-
format_declarations_procedure(node)
|
|
90
|
-
when Model::Declarations::Rule
|
|
91
|
-
format_declarations_rule(node)
|
|
92
|
-
when Model::Declarations::Schema
|
|
93
|
-
format_declarations_schema(node)
|
|
94
|
-
when Model::Declarations::SchemaVersion
|
|
95
|
-
format_declarations_schema_version(node)
|
|
96
|
-
when Model::Declarations::SubtypeConstraint
|
|
97
|
-
format_declarations_subtype_constraint(node)
|
|
98
|
-
when Model::Declarations::Type
|
|
99
|
-
format_declarations_type(node)
|
|
100
|
-
when Model::Declarations::UniqueRule
|
|
101
|
-
format_declarations_unique_rule(node)
|
|
102
|
-
when Model::Declarations::Variable
|
|
103
|
-
format_declarations_variable(node)
|
|
104
|
-
when Model::Declarations::WhereRule
|
|
105
|
-
format_declarations_where_rule(node)
|
|
106
|
-
when Model::Declarations::InformalPropositionRule
|
|
107
|
-
format_declarations_informal_proposition_rule(node)
|
|
108
|
-
when Model::DataTypes::Aggregate
|
|
109
|
-
format_data_types_aggregate(node)
|
|
110
|
-
when Model::DataTypes::Array
|
|
111
|
-
format_data_types_array(node)
|
|
112
|
-
when Model::DataTypes::Bag
|
|
113
|
-
format_data_types_bag(node)
|
|
114
|
-
when Model::DataTypes::Binary
|
|
115
|
-
format_data_types_binary(node)
|
|
116
|
-
when Model::DataTypes::Boolean
|
|
117
|
-
format_data_types_boolean(node)
|
|
118
|
-
when Model::DataTypes::Enumeration
|
|
119
|
-
format_data_types_enumeration(node)
|
|
120
|
-
when Model::DataTypes::EnumerationItem
|
|
121
|
-
format_data_types_enumeration_item(node)
|
|
122
|
-
when Model::DataTypes::GenericEntity
|
|
123
|
-
format_data_types_generic_entity(node)
|
|
124
|
-
when Model::DataTypes::Generic
|
|
125
|
-
format_data_types_generic(node)
|
|
126
|
-
when Model::DataTypes::Integer
|
|
127
|
-
format_data_types_integer(node)
|
|
128
|
-
when Model::DataTypes::List
|
|
129
|
-
format_data_types_list(node)
|
|
130
|
-
when Model::DataTypes::Logical
|
|
131
|
-
format_data_types_logical(node)
|
|
132
|
-
when Model::DataTypes::Number
|
|
133
|
-
format_data_types_number(node)
|
|
134
|
-
when Model::DataTypes::Real
|
|
135
|
-
format_data_types_real(node)
|
|
136
|
-
when Model::DataTypes::Select
|
|
137
|
-
format_data_types_select(node)
|
|
138
|
-
when Model::DataTypes::Set
|
|
139
|
-
format_data_types_set(node)
|
|
140
|
-
when Model::DataTypes::String
|
|
141
|
-
format_data_types_string(node)
|
|
142
|
-
when Model::Expressions::AggregateInitializer
|
|
143
|
-
format_expressions_aggregate_initializer(node)
|
|
144
|
-
when Model::Expressions::AggregateInitializerItem
|
|
145
|
-
format_expressions_aggregate_initializer_item(node)
|
|
146
|
-
when Model::Expressions::BinaryExpression
|
|
147
|
-
format_expressions_binary_expression(node)
|
|
148
|
-
when Model::Expressions::EntityConstructor
|
|
149
|
-
format_expressions_entity_constructor(node)
|
|
150
|
-
when Model::Expressions::FunctionCall
|
|
151
|
-
format_expressions_function_call(node)
|
|
152
|
-
when Model::Expressions::Interval
|
|
153
|
-
format_expressions_interval(node)
|
|
154
|
-
when Model::Expressions::QueryExpression
|
|
155
|
-
format_expressions_query_expression(node)
|
|
156
|
-
when Model::Expressions::UnaryExpression
|
|
157
|
-
format_expressions_unary_expression(node)
|
|
158
|
-
when Model::Literals::Binary
|
|
159
|
-
format_literals_binary(node)
|
|
160
|
-
when Model::Literals::Integer
|
|
161
|
-
format_literals_integer(node)
|
|
162
|
-
when Model::Literals::Logical
|
|
163
|
-
format_literals_logical(node)
|
|
164
|
-
when Model::Literals::Real
|
|
165
|
-
format_literals_real(node)
|
|
166
|
-
when Model::Literals::String
|
|
167
|
-
format_literals_string(node)
|
|
168
|
-
when Model::References::AttributeReference
|
|
169
|
-
format_references_attribute_reference(node)
|
|
170
|
-
when Model::References::GroupReference
|
|
171
|
-
format_references_group_reference(node)
|
|
172
|
-
when Model::References::IndexReference
|
|
173
|
-
format_references_index_reference(node)
|
|
174
|
-
when Model::References::SimpleReference
|
|
175
|
-
format_references_simple_reference(node)
|
|
176
|
-
when Model::Statements::Alias
|
|
177
|
-
format_statements_alias(node)
|
|
178
|
-
when Model::Statements::Assignment
|
|
179
|
-
format_statements_assignment(node)
|
|
180
|
-
when Model::Statements::Case
|
|
181
|
-
format_statements_case(node)
|
|
182
|
-
when Model::Statements::CaseAction
|
|
183
|
-
format_statements_case_action(node)
|
|
184
|
-
when Model::Statements::Compound
|
|
185
|
-
format_statements_compound(node)
|
|
186
|
-
when Model::Statements::Escape
|
|
187
|
-
format_statements_escape(node)
|
|
188
|
-
when Model::Statements::If
|
|
189
|
-
format_statements_if(node)
|
|
190
|
-
when Model::Statements::Null
|
|
191
|
-
format_statements_null(node)
|
|
192
|
-
when Model::Statements::ProcedureCall
|
|
193
|
-
format_statements_procedure_call(node)
|
|
194
|
-
when Model::Statements::Repeat
|
|
195
|
-
format_statements_repeat(node)
|
|
196
|
-
when Model::Statements::Return
|
|
197
|
-
format_statements_return(node)
|
|
198
|
-
when Model::Statements::Skip
|
|
199
|
-
format_statements_skip(node)
|
|
200
|
-
when Model::SupertypeExpressions::BinarySupertypeExpression
|
|
201
|
-
format_supertype_expressions_binary_supertype_expression(node)
|
|
202
|
-
when Model::SupertypeExpressions::OneofSupertypeExpression
|
|
203
|
-
format_supertype_expressions_oneof_supertype_expression(node)
|
|
204
|
-
when Model::Declarations::SchemaVersionItem
|
|
205
|
-
# not implemented yet
|
|
206
|
-
when Model::Declarations::InterfacedItem
|
|
207
|
-
# not implemented yet
|
|
208
|
-
when Model::Declarations::RemarkItem
|
|
209
|
-
format_remark_item(node)
|
|
210
|
-
when Model::Cache
|
|
211
|
-
# not implemented yet
|
|
212
|
-
when Model::ModelElement
|
|
213
|
-
# not implemented yet
|
|
214
|
-
when Model::Literals::Logical
|
|
215
|
-
node.value
|
|
216
|
-
when NilClass
|
|
217
|
-
# not implemented yet
|
|
218
|
-
else
|
|
219
|
-
warn "#{node.class.name} format not implemented"
|
|
220
|
-
""
|
|
221
|
-
end
|
|
81
|
+
def format(node)
|
|
82
|
+
return "" if node.nil?
|
|
83
|
+
|
|
84
|
+
handler = self.class.format_registry[node.class]
|
|
85
|
+
return public_send(handler, node) if handler
|
|
86
|
+
|
|
87
|
+
warn "#{node.class.name} format not implemented"
|
|
88
|
+
""
|
|
222
89
|
end
|
|
223
90
|
|
|
224
|
-
|
|
91
|
+
def format_noop(_node)
|
|
92
|
+
""
|
|
93
|
+
end
|
|
225
94
|
|
|
226
95
|
def format_repository(node)
|
|
227
|
-
# Format each file in the repository
|
|
228
96
|
result = node.files&.map { |f| format(f) }&.join("\n\n")
|
|
229
97
|
result ? "#{result}\n" : ""
|
|
230
98
|
end
|
|
@@ -2,7 +2,40 @@ module Expressir
|
|
|
2
2
|
module Express
|
|
3
3
|
module Formatters
|
|
4
4
|
module DataTypesFormatter
|
|
5
|
-
|
|
5
|
+
def self.included(base)
|
|
6
|
+
base.register_formatter Model::DataTypes::Aggregate,
|
|
7
|
+
:format_data_types_aggregate
|
|
8
|
+
base.register_formatter Model::DataTypes::Array,
|
|
9
|
+
:format_data_types_array
|
|
10
|
+
base.register_formatter Model::DataTypes::Bag, :format_data_types_bag
|
|
11
|
+
base.register_formatter Model::DataTypes::Binary,
|
|
12
|
+
:format_data_types_binary
|
|
13
|
+
base.register_formatter Model::DataTypes::Boolean,
|
|
14
|
+
:format_data_types_boolean
|
|
15
|
+
base.register_formatter Model::DataTypes::Enumeration,
|
|
16
|
+
:format_data_types_enumeration
|
|
17
|
+
base.register_formatter Model::DataTypes::EnumerationItem,
|
|
18
|
+
:format_data_types_enumeration_item
|
|
19
|
+
base.register_formatter Model::DataTypes::GenericEntity,
|
|
20
|
+
:format_data_types_generic_entity
|
|
21
|
+
base.register_formatter Model::DataTypes::Generic,
|
|
22
|
+
:format_data_types_generic
|
|
23
|
+
base.register_formatter Model::DataTypes::Integer,
|
|
24
|
+
:format_data_types_integer
|
|
25
|
+
base.register_formatter Model::DataTypes::List,
|
|
26
|
+
:format_data_types_list
|
|
27
|
+
base.register_formatter Model::DataTypes::Logical,
|
|
28
|
+
:format_data_types_logical
|
|
29
|
+
base.register_formatter Model::DataTypes::Number,
|
|
30
|
+
:format_data_types_number
|
|
31
|
+
base.register_formatter Model::DataTypes::Real,
|
|
32
|
+
:format_data_types_real
|
|
33
|
+
base.register_formatter Model::DataTypes::Select,
|
|
34
|
+
:format_data_types_select
|
|
35
|
+
base.register_formatter Model::DataTypes::Set, :format_data_types_set
|
|
36
|
+
base.register_formatter Model::DataTypes::String,
|
|
37
|
+
:format_data_types_string
|
|
38
|
+
end
|
|
6
39
|
|
|
7
40
|
def format_data_types_aggregate(node)
|
|
8
41
|
[
|
|
@@ -230,7 +263,7 @@ module Expressir
|
|
|
230
263
|
|
|
231
264
|
def format_data_types_select(node)
|
|
232
265
|
indent_char = self.class.const_get(:INDENT_CHAR)
|
|
233
|
-
node.items
|
|
266
|
+
items = Array(node.items)
|
|
234
267
|
[
|
|
235
268
|
*if node.extensible
|
|
236
269
|
[
|
|
@@ -251,7 +284,7 @@ module Expressir
|
|
|
251
284
|
"BASED_ON",
|
|
252
285
|
" ",
|
|
253
286
|
format(node.based_on),
|
|
254
|
-
*if
|
|
287
|
+
*if items.length.positive?
|
|
255
288
|
item_indent = indent_char * "(".length
|
|
256
289
|
[
|
|
257
290
|
" ",
|
|
@@ -259,7 +292,7 @@ module Expressir
|
|
|
259
292
|
"\n",
|
|
260
293
|
indent([
|
|
261
294
|
"(",
|
|
262
|
-
|
|
295
|
+
items.map do |x|
|
|
263
296
|
format(x)
|
|
264
297
|
end.join(",\n#{item_indent}"),
|
|
265
298
|
")",
|
|
@@ -267,14 +300,14 @@ module Expressir
|
|
|
267
300
|
].join
|
|
268
301
|
end,
|
|
269
302
|
].join
|
|
270
|
-
elsif
|
|
303
|
+
elsif items.length.positive?
|
|
271
304
|
indent_char = self.class.const_get(:INDENT_CHAR)
|
|
272
305
|
item_indent = indent_char * "(".length
|
|
273
306
|
[
|
|
274
307
|
"\n",
|
|
275
308
|
indent([
|
|
276
309
|
"(",
|
|
277
|
-
|
|
310
|
+
items.map do |x|
|
|
278
311
|
format(x)
|
|
279
312
|
end.join(",\n#{item_indent}"),
|
|
280
313
|
")",
|
|
@@ -2,7 +2,46 @@ module Expressir
|
|
|
2
2
|
module Express
|
|
3
3
|
module Formatters
|
|
4
4
|
module DeclarationsFormatter
|
|
5
|
-
|
|
5
|
+
def self.included(base)
|
|
6
|
+
base.register_formatter Model::Declarations::Attribute,
|
|
7
|
+
:format_declarations_attribute
|
|
8
|
+
base.register_formatter Model::Declarations::Constant,
|
|
9
|
+
:format_declarations_constant
|
|
10
|
+
base.register_formatter Model::Declarations::Entity,
|
|
11
|
+
:format_declarations_entity
|
|
12
|
+
base.register_formatter Model::Declarations::Function,
|
|
13
|
+
:format_declarations_function
|
|
14
|
+
base.register_formatter Model::Declarations::Interface,
|
|
15
|
+
:format_declarations_interface
|
|
16
|
+
base.register_formatter Model::Declarations::InterfaceItem,
|
|
17
|
+
:format_declarations_interface_item
|
|
18
|
+
base.register_formatter Model::Declarations::Parameter,
|
|
19
|
+
:format_declarations_parameter
|
|
20
|
+
base.register_formatter Model::Declarations::Procedure,
|
|
21
|
+
:format_declarations_procedure
|
|
22
|
+
base.register_formatter Model::Declarations::Rule,
|
|
23
|
+
:format_declarations_rule
|
|
24
|
+
base.register_formatter Model::Declarations::Schema,
|
|
25
|
+
:format_declarations_schema
|
|
26
|
+
base.register_formatter Model::Declarations::SchemaVersion,
|
|
27
|
+
:format_declarations_schema_version
|
|
28
|
+
base.register_formatter Model::Declarations::SubtypeConstraint,
|
|
29
|
+
:format_declarations_subtype_constraint
|
|
30
|
+
base.register_formatter Model::Declarations::Type,
|
|
31
|
+
:format_declarations_type
|
|
32
|
+
base.register_formatter Model::Declarations::UniqueRule,
|
|
33
|
+
:format_declarations_unique_rule
|
|
34
|
+
base.register_formatter Model::Declarations::Variable,
|
|
35
|
+
:format_declarations_variable
|
|
36
|
+
base.register_formatter Model::Declarations::WhereRule,
|
|
37
|
+
:format_declarations_where_rule
|
|
38
|
+
base.register_formatter Model::Declarations::InformalPropositionRule,
|
|
39
|
+
:format_declarations_informal_proposition_rule
|
|
40
|
+
base.register_formatter Model::Declarations::DerivedAttribute,
|
|
41
|
+
:format_declarations_attribute
|
|
42
|
+
base.register_formatter Model::Declarations::InverseAttribute,
|
|
43
|
+
:format_declarations_attribute
|
|
44
|
+
end
|
|
6
45
|
|
|
7
46
|
def format_declarations_attribute(node)
|
|
8
47
|
[
|
|
@@ -187,8 +226,7 @@ module Expressir
|
|
|
187
226
|
[
|
|
188
227
|
"END_ENTITY",
|
|
189
228
|
";",
|
|
190
|
-
|
|
191
|
-
explicit_attributes&.length&.positive? ? format_end_scope_remark(node) : "",
|
|
229
|
+
format_end_scope_remark(node),
|
|
192
230
|
].join,
|
|
193
231
|
].join("\n")
|
|
194
232
|
end
|
|
@@ -257,6 +295,7 @@ module Expressir
|
|
|
257
295
|
[
|
|
258
296
|
"END_FUNCTION",
|
|
259
297
|
";",
|
|
298
|
+
format_end_scope_remark(node),
|
|
260
299
|
].join,
|
|
261
300
|
].join("\n")
|
|
262
301
|
end
|
|
@@ -377,13 +416,12 @@ module Expressir
|
|
|
377
416
|
[
|
|
378
417
|
"END_PROCEDURE",
|
|
379
418
|
";",
|
|
419
|
+
format_end_scope_remark(node),
|
|
380
420
|
].join,
|
|
381
421
|
].join("\n")
|
|
382
422
|
end
|
|
383
423
|
|
|
384
424
|
def format_declarations_rule(node)
|
|
385
|
-
node.applies_to ||= []
|
|
386
|
-
|
|
387
425
|
# Filter out statements that only exist to hold remarks in rules
|
|
388
426
|
# (ALIAS/REPEAT with only Null sub-statements, query assignments, or Null statements)
|
|
389
427
|
formatted_statements = []
|
|
@@ -414,7 +452,7 @@ module Expressir
|
|
|
414
452
|
"FOR",
|
|
415
453
|
" ",
|
|
416
454
|
"(",
|
|
417
|
-
node.applies_to.map { |x| format(x) }.join(", "),
|
|
455
|
+
Array(node.applies_to).map { |x| format(x) }.join(", "),
|
|
418
456
|
")",
|
|
419
457
|
";",
|
|
420
458
|
].join,
|
|
@@ -465,6 +503,7 @@ module Expressir
|
|
|
465
503
|
[
|
|
466
504
|
"END_RULE",
|
|
467
505
|
";",
|
|
506
|
+
format_end_scope_remark(node),
|
|
468
507
|
].join,
|
|
469
508
|
].join("\n")
|
|
470
509
|
end
|
|
@@ -596,6 +635,7 @@ module Expressir
|
|
|
596
635
|
[
|
|
597
636
|
"END_SUBTYPE_CONSTRAINT",
|
|
598
637
|
";",
|
|
638
|
+
format_end_scope_remark(node),
|
|
599
639
|
].join,
|
|
600
640
|
].join("\n")
|
|
601
641
|
end
|
|
@@ -627,7 +667,6 @@ module Expressir
|
|
|
627
667
|
end
|
|
628
668
|
|
|
629
669
|
def format_declarations_unique_rule(node)
|
|
630
|
-
node.attributes ||= []
|
|
631
670
|
[
|
|
632
671
|
*if node.id
|
|
633
672
|
[
|
|
@@ -636,7 +675,7 @@ module Expressir
|
|
|
636
675
|
" ",
|
|
637
676
|
].join
|
|
638
677
|
end,
|
|
639
|
-
node.attributes.map { |x| format(x) }.join(", "),
|
|
678
|
+
Array(node.attributes).map { |x| format(x) }.join(", "),
|
|
640
679
|
";",
|
|
641
680
|
].join
|
|
642
681
|
end
|
|
@@ -2,13 +2,29 @@ module Expressir
|
|
|
2
2
|
module Express
|
|
3
3
|
module Formatters
|
|
4
4
|
module ExpressionsFormatter
|
|
5
|
-
|
|
5
|
+
def self.included(base)
|
|
6
|
+
base.register_formatter Model::Expressions::AggregateInitializer,
|
|
7
|
+
:format_expressions_aggregate_initializer
|
|
8
|
+
base.register_formatter Model::Expressions::AggregateInitializerItem,
|
|
9
|
+
:format_expressions_aggregate_initializer_item
|
|
10
|
+
base.register_formatter Model::Expressions::BinaryExpression,
|
|
11
|
+
:format_expressions_binary_expression
|
|
12
|
+
base.register_formatter Model::Expressions::EntityConstructor,
|
|
13
|
+
:format_expressions_entity_constructor
|
|
14
|
+
base.register_formatter Model::Expressions::FunctionCall,
|
|
15
|
+
:format_expressions_function_call
|
|
16
|
+
base.register_formatter Model::Expressions::Interval,
|
|
17
|
+
:format_expressions_interval
|
|
18
|
+
base.register_formatter Model::Expressions::QueryExpression,
|
|
19
|
+
:format_expressions_query_expression
|
|
20
|
+
base.register_formatter Model::Expressions::UnaryExpression,
|
|
21
|
+
:format_expressions_unary_expression
|
|
22
|
+
end
|
|
6
23
|
|
|
7
24
|
def format_expressions_aggregate_initializer(node)
|
|
8
|
-
node.items ||= []
|
|
9
25
|
[
|
|
10
26
|
"[",
|
|
11
|
-
node.items.map { |x| format(x) }.join(", "),
|
|
27
|
+
Array(node.items).map { |x| format(x) }.join(", "),
|
|
12
28
|
"]",
|
|
13
29
|
].join
|
|
14
30
|
end
|
|
@@ -72,11 +88,10 @@ module Expressir
|
|
|
72
88
|
end
|
|
73
89
|
|
|
74
90
|
def format_expressions_entity_constructor(node)
|
|
75
|
-
node.parameters ||= []
|
|
76
91
|
[
|
|
77
92
|
format(node.entity),
|
|
78
93
|
"(",
|
|
79
|
-
node.parameters.map { |x| format(x) }.join(", "),
|
|
94
|
+
Array(node.parameters).map { |x| format(x) }.join(", "),
|
|
80
95
|
")",
|
|
81
96
|
].join
|
|
82
97
|
end
|
|
@@ -2,7 +2,17 @@ module Expressir
|
|
|
2
2
|
module Express
|
|
3
3
|
module Formatters
|
|
4
4
|
module LiteralsFormatter
|
|
5
|
-
|
|
5
|
+
def self.included(base)
|
|
6
|
+
base.register_formatter Model::Literals::Binary,
|
|
7
|
+
:format_literals_binary
|
|
8
|
+
base.register_formatter Model::Literals::Integer,
|
|
9
|
+
:format_literals_integer
|
|
10
|
+
base.register_formatter Model::Literals::Logical,
|
|
11
|
+
:format_literals_logical
|
|
12
|
+
base.register_formatter Model::Literals::Real, :format_literals_real
|
|
13
|
+
base.register_formatter Model::Literals::String,
|
|
14
|
+
:format_literals_string
|
|
15
|
+
end
|
|
6
16
|
|
|
7
17
|
def format_literals_binary(node)
|
|
8
18
|
node.value
|
|
@@ -2,7 +2,16 @@ module Expressir
|
|
|
2
2
|
module Express
|
|
3
3
|
module Formatters
|
|
4
4
|
module ReferencesFormatter
|
|
5
|
-
|
|
5
|
+
def self.included(base)
|
|
6
|
+
base.register_formatter Model::References::AttributeReference,
|
|
7
|
+
:format_references_attribute_reference
|
|
8
|
+
base.register_formatter Model::References::GroupReference,
|
|
9
|
+
:format_references_group_reference
|
|
10
|
+
base.register_formatter Model::References::IndexReference,
|
|
11
|
+
:format_references_index_reference
|
|
12
|
+
base.register_formatter Model::References::SimpleReference,
|
|
13
|
+
:format_references_simple_reference
|
|
14
|
+
end
|
|
6
15
|
|
|
7
16
|
def format_references_attribute_reference(node)
|
|
8
17
|
[
|