Class: RuboCop::AST::NodePattern::Builder
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Subclasses:
|
|
Inherits: | Object |
Defined in: | lib/rubocop/ast/node_pattern/builder.rb |
Overview
Responsible to build the AST nodes for ::RuboCop::AST::NodePattern
Doc on how this fits in the compiling process: /docs/modules/ROOT/pages/node_pattern.adoc
Instance Method Summary
- #emit_atom(type, value)
- #emit_call(type, selector, args = nil)
- #emit_capture(capture_token, node)
- #emit_list(type, _begin, children, _end)
- #emit_subsequence(node_list)
- #emit_unary_op(type, _operator = nil, *children)
- #emit_union(begin_t, pattern_lists, end_t)
- #n(type, *args) private
- #optimizable_as_set?(children) ⇒ Boolean private
- #union_children(pattern_lists) private
Instance Method Details
#emit_atom(type, value)
[ GitHub ]# File 'lib/rubocop/ast/node_pattern/builder.rb', line 17
def emit_atom(type, value) n(type, [value]) end
#emit_call(type, selector, args = nil)
[ GitHub ]# File 'lib/rubocop/ast/node_pattern/builder.rb', line 29
def emit_call(type, selector, args = nil) _begin_t, arg_nodes, _end_t = args n(type, [selector, *arg_nodes]) end
#emit_capture(capture_token, node)
[ GitHub ]# File 'lib/rubocop/ast/node_pattern/builder.rb', line 11
def emit_capture(capture_token, node) return node if capture_token.nil? emit_unary_op(:capture, capture_token, node) end
#emit_list(type, _begin, children, _end)
[ GitHub ]# File 'lib/rubocop/ast/node_pattern/builder.rb', line 25
def emit_list(type, _begin, children, _end) n(type, children) end
#emit_subsequence(node_list)
[ GitHub ]# File 'lib/rubocop/ast/node_pattern/builder.rb', line 41
def emit_subsequence(node_list) return node_list.first if node_list.size == 1 # Don't put a single child in a subsequence emit_list(:subsequence, nil, node_list, nil) end
#emit_unary_op(type, _operator = nil, *children)
[ GitHub ]# File 'lib/rubocop/ast/node_pattern/builder.rb', line 21
def emit_unary_op(type, _operator = nil, *children) n(type, children) end
#emit_union(begin_t, pattern_lists, end_t)
[ GitHub ]# File 'lib/rubocop/ast/node_pattern/builder.rb', line 34
def emit_union(begin_t, pattern_lists, end_t) children = union_children(pattern_lists) type = optimizable_as_set?(children) ? :set : :union emit_list(type, begin_t, children, end_t) end
#n(type, *args) (private)
[ GitHub ]
#optimizable_as_set?(children) ⇒ Boolean
(private)
# File 'lib/rubocop/ast/node_pattern/builder.rb', line 49
def optimizable_as_set?(children) children.all?(&:matches_within_set?) end
#union_children(pattern_lists) (private)
[ GitHub ]# File 'lib/rubocop/ast/node_pattern/builder.rb', line 57
def union_children(pattern_lists) if pattern_lists.size == 1 # {a b c} => [[a, b, c]] => [a, b, c] children = pattern_lists.first raise NodePattern::Invalid, 'A union can not be empty' if children.empty? children else # { a b | c } => [[a, b], [c]] => [s(:subsequence, a, b), c] pattern_lists.map do |list| emit_subsequence(list) end end end