Class: DynamicLocals::RewriteTranslator
- Inherits:
-
BaseTranslator
- Object
- BaseTranslator
- DynamicLocals::RewriteTranslator
- Defined in:
- lib/dynamic_locals/rewrite_translator.rb
Instance Attribute Summary collapse
-
#dynamic_locals ⇒ Object
readonly
Returns the value of attribute dynamic_locals.
Attributes inherited from BaseTranslator
#known_locals, #locals_hash, #lookup_strategy, #original_src
Instance Method Summary collapse
-
#initialize ⇒ RewriteTranslator
constructor
A new instance of RewriteTranslator.
- #keyword_parameters(rest: nil) ⇒ Object
-
#parameters ⇒ Object
In the keyword strategy the locals are real parameters; absorb any unsupplied-but-passed keys so callers can splat an arbitrary hash.
- #translate ⇒ Object
Methods inherited from BaseTranslator
Constructor Details
#initialize ⇒ RewriteTranslator
Returns a new instance of RewriteTranslator.
6 7 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 |
# File 'lib/dynamic_locals/rewrite_translator.rb', line 6 def initialize(...) super unless [:hash, :keywords].include?(lookup_strategy) raise ArgumentError, "unknown lookup strategy: #{lookup_strategy.inspect}" end @rewriter = ASTRewriter.new(original_src) root = @rewriter.ast # Names assigned anywhere in this method body. Earlier occurrences of # these names can still be CallNodes, e.g. `foo; foo = 123`. @local_table = @rewriter.locals @dynamic_locals = @local_table.dup @keyword_unset_flags = {} @shadowed_locals = [] @shadow_names = {} @generated_names = [] @scope_parameter_names = {} collect_dynamic_locals(root) # Known locals are real variables that already exist (e.g. method # parameters); they are never looked up dynamically, made into kwargs, # or initialized from the locals hash. @dynamic_locals = @dynamic_locals.sort.uniq - known_locals dynamic_locals.each { |local| keyword_unset_flag(local) } if keywords? find_replacements(root, [:root]) end |
Instance Attribute Details
#dynamic_locals ⇒ Object (readonly)
Returns the value of attribute dynamic_locals.
34 35 36 |
# File 'lib/dynamic_locals/rewrite_translator.rb', line 34 def dynamic_locals @dynamic_locals end |
Instance Method Details
#keyword_parameters(rest: nil) ⇒ Object
36 37 38 39 40 41 42 43 |
# File 'lib/dynamic_locals/rewrite_translator.rb', line 36 def keyword_parameters(rest: nil) return "#{locals_hash} = {}" unless keywords? params = dynamic_locals.map do |local| "#{local}: (#{keyword_unset_flag(local)} = true; nil)" end params << "**#{rest}" if rest params.join(", ") end |
#parameters ⇒ Object
In the keyword strategy the locals are real parameters; absorb any unsupplied-but-passed keys so callers can splat an arbitrary hash.
55 56 57 |
# File 'lib/dynamic_locals/rewrite_translator.rb', line 55 def parameters keyword_parameters(rest: :__dynamic_locals_unused_keywords) end |
#translate ⇒ Object
45 46 47 48 49 50 51 |
# File 'lib/dynamic_locals/rewrite_translator.rb', line 45 def translate src = @rewriter.modified_src initialize = initialize_local_table "#{initialize}#{src}" end |