Class: Expressir::Express::Builders::ExplicitAttrBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/expressir/express/builders/explicit_attr_builder.rb

Overview

Builds explicit_attr nodes.

Instance Method Summary collapse

Instance Method Details

#call(ast_data) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/expressir/express/builders/explicit_attr_builder.rb', line 8

def call(ast_data)
  list_data = ast_data[:list_of_attribute_decl]
  attr_decl_data = if list_data.is_a?(Hash)
                     list_data[:attribute_decl]
                   elsif list_data.is_a?(Array)
                     list_data.filter_map do |item|
                       item[:attribute_decl] if item.is_a?(Hash)
                     end
                   else
                     ast_data[:attribute_decl]
                   end
  attr_decls = Builder.ensure_array(attr_decl_data)
  optional = !ast_data[:t_optional].nil?
  type = Builder.build_optional(ast_data[:parameter_type])

  attrs = attr_decls.map do |attr_data|
    Builder.build({ attribute_decl: attr_data })
  end

  attrs.map do |attr|
    next attr unless attr.is_a?(Expressir::Model::Declarations::Attribute)

    attr_params = {
      id: attr.id,
      kind: Expressir::Model::Declarations::Attribute::EXPLICIT,
      supertype_attribute: attr.supertype_attribute,
      type: type,
    }
    attr_params[:optional] = true if optional
    # Preserve source information from the intermediate object
    attr_params[:source] = attr.source if attr.source
    if attr.source_offset
      attr_params[:source_offset] =
        attr.source_offset
    end
    Expressir::Model::Declarations::Attribute.new(**attr_params)
  end
end