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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +1 -1
  3. data/.gitignore +2 -0
  4. data/.rubocop_todo.yml +17 -12
  5. data/CHANGELOG.md +159 -0
  6. data/docs/_guides/ler/step-packages.adoc +385 -0
  7. data/lib/expressir/coverage.rb +4 -4
  8. data/lib/expressir/express/builder_registry.rb +3 -1
  9. data/lib/expressir/express/builders/expression_builder.rb +2 -2
  10. data/lib/expressir/express/builders/helpers.rb +2 -8
  11. data/lib/expressir/express/builders/qualifier_builder.rb +2 -1
  12. data/lib/expressir/express/formatter.rb +32 -164
  13. data/lib/expressir/express/formatters/data_types_formatter.rb +39 -6
  14. data/lib/expressir/express/formatters/declarations_formatter.rb +47 -8
  15. data/lib/expressir/express/formatters/expressions_formatter.rb +20 -5
  16. data/lib/expressir/express/formatters/literals_formatter.rb +11 -1
  17. data/lib/expressir/express/formatters/references_formatter.rb +10 -1
  18. data/lib/expressir/express/formatters/remark_formatter.rb +1 -89
  19. data/lib/expressir/express/formatters/remark_item_formatter.rb +5 -4
  20. data/lib/expressir/express/formatters/statements_formatter.rb +32 -9
  21. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +7 -3
  22. data/lib/expressir/express/hyperlink_formatter.rb +1 -3
  23. data/lib/expressir/express/model_visitor.rb +1 -1
  24. data/lib/expressir/express/pretty_formatter.rb +31 -108
  25. data/lib/expressir/express/remark_attacher.rb +118 -88
  26. data/lib/expressir/express/schema_head_formatter.rb +1 -3
  27. data/lib/expressir/model/concerns.rb +6 -0
  28. data/lib/expressir/model/declarations/interface_item.rb +2 -0
  29. data/lib/expressir/model/declarations/interfaced_item.rb +3 -0
  30. data/lib/expressir/model/declarations/remark_item.rb +3 -0
  31. data/lib/expressir/model/declarations/schema.rb +7 -5
  32. data/lib/expressir/model/exp_file.rb +1 -0
  33. data/lib/expressir/model/identifier.rb +3 -1
  34. data/lib/expressir/model/model_element.rb +3 -3
  35. data/lib/expressir/model/repository.rb +8 -0
  36. data/lib/expressir/model/search_engine.rb +1 -1
  37. data/lib/expressir/package/reader.rb +9 -24
  38. data/lib/expressir/version.rb +1 -1
  39. metadata +4 -2
@@ -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::ModelElement) && entity.class.method_defined?(:remarks) && entity.remarks && !entity.remarks.empty?
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::ModelElement) && entity.class.method_defined?(:remark_items) && entity.remark_items && !entity.remark_items.empty?
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::ModelElement) && parent.class.method_defined?(:remark_items) && parent.remark_items
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::ModelElement) && e.class.method_defined?(:id) && e.id
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) { |d| type_builder.build_aggregate_type(d) }
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.respond_to?(:empty?) && rhs.empty?)
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.respond_to?(:empty?) && rhs.empty?)
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
- # Handle Parsanol Slice objects - they respond to to_s but not to_str
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
- # Handle Parsanol Slice objects
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
- { index1: index1, index2: index2 }
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
- formatter = new
62
- formatter.format(node)
78
+ new.format(node)
63
79
  end
64
80
 
65
- # Formats Express model into an Express code
66
- # @param [Model::ModelElement] node
67
- # @return [String]
68
- def format(node) # rubocop:disable Metrics/MethodLength
69
- case node
70
- when Model::Repository
71
- format_repository(node)
72
- when Model::ExpFile
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
- private
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
- private
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 node.items&.length&.positive?
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
- node.items.map do |x|
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 node.items&.length&.positive?
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
- node.items.map do |x|
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
- private
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
- # Only show end_scope_remark if entity has explicit attributes
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
- private
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
- private
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
- private
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
  [