class RuboCop::AST::NodePattern::Compiler
The top-level compiler holding the global state Defers work to its subcompilers
Doc on how this fits in the compiling process:
/docs/modules/ROOT/pages/node_pattern.adoc
Attributes
binding[R]
captures[R]
named_parameters[R]
positional_parameters[R]
Public Class Methods
new()
click to toggle source
# File lib/rubocop/ast/node_pattern/compiler.rb, line 15 def initialize @temp_depth = 0 # avoid name clashes between temp variables @captures = 0 # number of captures seen @positional_parameters = 0 # highest % (param) number seen @named_parameters = Set[] # keyword parameters @binding = Binding.new # bound variables @atom_subcompiler = self.class::AtomSubcompiler.new(self) end
Public Instance Methods
compile_as_atom(node)
click to toggle source
# File lib/rubocop/ast/node_pattern/compiler.rb, line 42 def compile_as_atom(node) @atom_subcompiler.compile(node) end
compile_as_node_pattern(node, **options)
click to toggle source
# File lib/rubocop/ast/node_pattern/compiler.rb, line 46 def compile_as_node_pattern(node, **options) self.class::NodePatternSubcompiler.new(self, **options).compile(node) end
compile_sequence(sequence, var:)
click to toggle source
# File lib/rubocop/ast/node_pattern/compiler.rb, line 50 def compile_sequence(sequence, var:) self.class::SequenceSubcompiler.new(self, sequence: sequence, var: var).compile_sequence end
each_union(enum, &block)
click to toggle source
Enumerates `enum` while keeping track of state across union branches (captures and unification).
# File lib/rubocop/ast/node_pattern/compiler.rb, line 38 def each_union(enum, &block) enforce_same_captures(binding.union_bind(enum), &block) end
freeze()
click to toggle source
Calls superclass method
# File lib/rubocop/ast/node_pattern/compiler.rb, line 74 def freeze @named_parameters.freeze super end
named_parameter(name)
click to toggle source
# File lib/rubocop/ast/node_pattern/compiler.rb, line 31 def named_parameter(name) @named_parameters << name name end
next_capture()
click to toggle source
# File lib/rubocop/ast/node_pattern/compiler.rb, line 70 def next_capture "captures[#{new_capture}]" end
parser()
click to toggle source
# File lib/rubocop/ast/node_pattern/compiler.rb, line 54 def parser @parser ||= Parser.new end
positional_parameter(number)
click to toggle source
# File lib/rubocop/ast/node_pattern/compiler.rb, line 26 def positional_parameter(number) @positional_parameters = number if number > @positional_parameters "param#{number}" end
with_temp_variables(*names) { |*names| ... }
click to toggle source
Utilities
# File lib/rubocop/ast/node_pattern/compiler.rb, line 60 def with_temp_variables(*names, &block) @temp_depth += 1 suffix = @temp_depth if @temp_depth > 1 names = block.parameters.map(&:last) if names.empty? names.map! { |name| "#{name}#{suffix}" } yield(*names) ensure @temp_depth -= 1 end
Private Instance Methods
enforce_same_captures(enum) { |node| ... }
click to toggle source
# File lib/rubocop/ast/node_pattern/compiler.rb, line 81 def enforce_same_captures(enum) return to_enum __method__, enum unless block_given? captures_before = captures_after = nil enum.each do |node| captures_before ||= @captures @captures = captures_before yield node captures_after ||= @captures if captures_after != @captures raise Invalid, 'each branch must have same number of captures' end end end
new_capture()
click to toggle source
# File lib/rubocop/ast/node_pattern/compiler.rb, line 96 def new_capture @captures ensure @captures += 1 end