Class: Opal::Rewriters::DeduplicateArgName
- Inherits:
-
Base
- Object
- Parser::AST::Processor
- Base
- Opal::Rewriters::DeduplicateArgName
show all
- Defined in:
- lib/opal/rewriters/deduplicate_arg_name.rb
Overview
Ruby allows for args with the same name, if the arg starts with a '', like:
def funny_method_name(, )
puts _
end
but JavaScript in strict mode does not allow for args with the same name
Ruby assigns the value of the first arg given
funny_method_name(1, 2) => 1
leave the first appearance as it is and rename the other ones
compiler result:
function $$funny_method_name(, __$2)
Constant Summary
Constants inherited
from Base
Base::DUMMY_LOCATION
Instance Attribute Summary
Attributes inherited from Base
#current_node
Instance Method Summary
collapse
Methods inherited from Base
#append_to_body, #begin_with_stmts, #dynamic!, #error, #on_top, #prepend_to_body, #process, s, #s, #stmts_of
Instance Method Details
#on_args(node) ⇒ Object
16
17
18
19
20
21
22
23
24
|
# File 'lib/opal/rewriters/deduplicate_arg_name.rb', line 16
def on_args(node)
@arg_name_count = Hash.new(0)
children = node.children.map do |arg|
rename_arg(arg)
end
super(node.updated(nil, children))
end
|
#rename_arg(arg) ⇒ Object
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
# File 'lib/opal/rewriters/deduplicate_arg_name.rb', line 26
def rename_arg(arg)
case arg.type
when :arg, :restarg, :kwarg, :kwrestarg, :blockarg
name = arg.children[0]
name ? arg.updated(nil, [unique_name(name)]) : arg
when :optarg, :kwoptarg
name, value = arg.children
arg.updated(nil, [unique_name(name), value])
when :mlhs
new_children = arg.children.map { |child| rename_arg(child) }
arg.updated(nil, new_children)
else
arg
end
end
|
#unique_name(name) ⇒ Object
42
43
44
45
|
# File 'lib/opal/rewriters/deduplicate_arg_name.rb', line 42
def unique_name(name)
count = (@arg_name_count[name] += 1)
count > 1 ? :"#{name}_$#{count}" : name
end
|