Class: DynamicLocals::RewriteTranslator

Inherits:
BaseTranslator show all
Defined in:
lib/dynamic_locals/rewrite_translator.rb

Instance Attribute Summary collapse

Attributes inherited from BaseTranslator

#known_locals, #locals_hash, #lookup_strategy, #original_src

Instance Method Summary collapse

Methods inherited from BaseTranslator

#to_s

Constructor Details

#initializeRewriteTranslator

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_localsObject (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

#parametersObject

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

#translateObject



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