Module: Ibex::NormalizeNamedReferences

Included in:
Normalizer
Defined in:
lib/ibex/normalize/named_references.rb,
sig/ibex/normalize/named_references.rbs

Overview

Named-reference collection and validation shared by ordinary and parameterized items.

Instance Method Summary collapse

Instance Method Details

#add_named_reference(item, refs, index) ⇒ void

This method returns an undefined value.

RBS:

  • (Frontend::AST::item item, Array[IR::named_ref] refs, Integer index) -> void

Parameters:

  • item (Frontend::AST::item)
  • refs (Array[IR::named_ref])
  • index (Integer)


34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/ibex/normalize/named_references.rb', line 34

def add_named_reference(item, refs, index)
  # @type self: Normalizer
  reference = unwrap_reference(item)
  return unless reference

  name = reference.named_reference
  return unless name

  fail_at(reference.loc, "reserved named reference #{name}") if Normalizer::RESERVED_NAMES.include?(name)
  fail_at(reference.loc, "duplicate named reference #{name}") if refs.any? { |entry| entry[:name] == name }
  refs << { name: name, index: index }
end

#named_reference_in(item) ⇒ Frontend::AST::SymbolReference, ...

RBS:

  • (Frontend::AST::item item) -> (Frontend::AST::SymbolReference | Frontend::AST::ParameterizedReference)?

Parameters:

  • item (Frontend::AST::item)

Returns:



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/ibex/normalize/named_references.rb', line 16

def named_reference_in(item)
  # @type self: Normalizer
  if (item.is_a?(Frontend::AST::SymbolReference) ||
      item.is_a?(Frontend::AST::ParameterizedReference)) && item.named_reference
    return item
  end
  if item.is_a?(Frontend::AST::Group)
    return item.alternatives.flatten.filter_map { |child| named_reference_in(child) }.first
  end
  if item.is_a?(Frontend::AST::Optional) || item.is_a?(Frontend::AST::Star) ||
     item.is_a?(Frontend::AST::Plus) || item.is_a?(Frontend::AST::SeparatedList)
    return named_reference_in(item.item)
  end

  nil
end

#reject_group_named_references(group) ⇒ void

This method returns an undefined value.

RBS:

  • (Frontend::AST::Group group) -> void

Parameters:



9
10
11
12
13
# File 'lib/ibex/normalize/named_references.rb', line 9

def reject_group_named_references(group)
  # @type self: Normalizer
  reference = group.alternatives.flatten.filter_map { |item| named_reference_in(item) }.first
  fail_at(reference.loc, "named references inside EBNF groups are not supported") if reference
end

#unwrap_reference(item) ⇒ Frontend::AST::SymbolReference, ...

RBS:

  • (Frontend::AST::item item) -> (Frontend::AST::SymbolReference | Frontend::AST::ParameterizedReference)?

Parameters:

  • item (Frontend::AST::item)

Returns:



48
49
50
51
52
53
54
55
56
57
58
# File 'lib/ibex/normalize/named_references.rb', line 48

def unwrap_reference(item)
  # @type self: Normalizer
  return item if item.is_a?(Frontend::AST::SymbolReference) ||
                 item.is_a?(Frontend::AST::ParameterizedReference)
  if item.is_a?(Frontend::AST::Optional) || item.is_a?(Frontend::AST::Star) ||
     item.is_a?(Frontend::AST::Plus) || item.is_a?(Frontend::AST::SeparatedList)
    return unwrap_reference(item.item)
  end

  nil
end