Class: RuboCop::AST::NodePattern::Compiler
- Inherits:
-
Object
- Object
- RuboCop::AST::NodePattern::Compiler
- Extended by:
- SimpleForwardable
- Defined in:
- lib/rubocop/ast/node_pattern/compiler.rb,
lib/rubocop/ast/node_pattern/compiler/debug.rb,
lib/rubocop/ast/node_pattern/compiler/binding.rb,
lib/rubocop/ast/node_pattern/compiler/subcompiler.rb,
lib/rubocop/ast/node_pattern/compiler/atom_subcompiler.rb,
lib/rubocop/ast/node_pattern/compiler/sequence_subcompiler.rb,
lib/rubocop/ast/node_pattern/compiler/node_pattern_subcompiler.rb
Overview
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
Direct Known Subclasses
Defined Under Namespace
Classes: AtomSubcompiler, Binding, Debug, NodePatternSubcompiler, SequenceSubcompiler, Subcompiler
Instance Attribute Summary collapse
-
#binding ⇒ Object
readonly
Returns the value of attribute binding.
-
#captures ⇒ Object
readonly
Returns the value of attribute captures.
-
#named_parameters ⇒ Object
readonly
Returns the value of attribute named_parameters.
-
#positional_parameters ⇒ Object
readonly
Returns the value of attribute positional_parameters.
Instance Method Summary collapse
- #compile_as_atom(node) ⇒ Object
- #compile_as_node_pattern(node, **options) ⇒ Object
- #compile_sequence(sequence, var:) ⇒ Object
-
#each_union(enum, &block) ⇒ Object
Enumerates ‘enum` while keeping track of state across union branches (captures and unification).
- #freeze ⇒ Object
-
#initialize ⇒ Compiler
constructor
A new instance of Compiler.
- #named_parameter(name) ⇒ Object
- #next_capture ⇒ Object
- #parser ⇒ Object
- #positional_parameter(number) ⇒ Object
-
#with_temp_variables(*names, &block) ⇒ Object
Utilities.
Methods included from SimpleForwardable
Constructor Details
#initialize ⇒ Compiler
Returns a new instance of Compiler.
15 16 17 18 19 20 21 22 |
# 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 |
Instance Attribute Details
#binding ⇒ Object (readonly)
Returns the value of attribute binding.
13 14 15 |
# File 'lib/rubocop/ast/node_pattern/compiler.rb', line 13 def binding @binding end |
#captures ⇒ Object (readonly)
Returns the value of attribute captures.
13 14 15 |
# File 'lib/rubocop/ast/node_pattern/compiler.rb', line 13 def captures @captures end |
#named_parameters ⇒ Object (readonly)
Returns the value of attribute named_parameters.
13 14 15 |
# File 'lib/rubocop/ast/node_pattern/compiler.rb', line 13 def named_parameters @named_parameters end |
#positional_parameters ⇒ Object (readonly)
Returns the value of attribute positional_parameters.
13 14 15 |
# File 'lib/rubocop/ast/node_pattern/compiler.rb', line 13 def positional_parameters @positional_parameters end |
Instance Method Details
#compile_as_atom(node) ⇒ Object
42 43 44 |
# 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) ⇒ Object
46 47 48 |
# File 'lib/rubocop/ast/node_pattern/compiler.rb', line 46 def compile_as_node_pattern(node, **) self.class::NodePatternSubcompiler.new(self, **).compile(node) end |
#compile_sequence(sequence, var:) ⇒ Object
50 51 52 |
# 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) ⇒ Object
Enumerates ‘enum` while keeping track of state across union branches (captures and unification).
38 39 40 |
# 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 ⇒ Object
74 75 76 77 |
# File 'lib/rubocop/ast/node_pattern/compiler.rb', line 74 def freeze @named_parameters.freeze super end |
#named_parameter(name) ⇒ Object
31 32 33 34 |
# File 'lib/rubocop/ast/node_pattern/compiler.rb', line 31 def named_parameter(name) @named_parameters << name name end |
#next_capture ⇒ Object
70 71 72 |
# File 'lib/rubocop/ast/node_pattern/compiler.rb', line 70 def next_capture "captures[#{new_capture}]" end |
#parser ⇒ Object
54 55 56 |
# File 'lib/rubocop/ast/node_pattern/compiler.rb', line 54 def parser @parser ||= Parser.new end |
#positional_parameter(number) ⇒ Object
26 27 28 29 |
# 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, &block) ⇒ Object
Utilities
60 61 62 63 64 65 66 67 68 |
# 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 |