Class: Opal::Nodes::MlhsArgNode
- Defined in:
- opal/lib/opal/nodes/args/mlhsarg.rb
Overview
A node responsible for extracting a single MLHS argument
MLHS argument is the left hand side of a multiple assignment (Multiple Left Hand Side)
def m((a, b)) def m((a, *b))
MLHS can include simple arguments (see NormargNode) and rest arguments (see RestargNode)
Instance Attribute Summary
Attributes inherited from Base
Instance Method Summary collapse
Methods inherited from Base
#add_gvar, #add_ivar, #add_local, #add_temp, #children, children, #class_variable_owner, #closest_module_node, #comments, #compile_to_fragments, #error, #expr, #expr?, #expr_or_nil, #fragment, handle, handlers, #has_rescue_else?, #helper, #in_ensure, #in_ensure?, #in_while?, #initialize, #process, #push, #recv, #recv?, #s, #scope, #stmt, #stmt?, truthy_optimize?, #unshift, #while_loop, #with_temp, #wrap
Methods included from Helpers
#conditional_send, #current_indent, #empty_line, #indent, #js_falsy, #js_truthy, #js_truthy_optimize, #line, #mid_to_jsid, #property, #valid_name?
Constructor Details
This class inherits a constructor from Opal::Nodes::Base
Instance Method Details
#compile ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'opal/lib/opal/nodes/args/mlhsarg.rb', line 21 def compile args_sexp = s(:post_args, *children) if @sexp.[:post] # In this case source is an item in the current scope.working_arguments # First we should extract mlhs as a simple argument mlhs_sexp = s(:arg, mlhs_name) mlhs_sexp.[:post] = true scope.with_inline_args([]) do push process(mlhs_sexp) end var_name = args_sexp.[:js_source] = mlhs_name else # Otherwise we already have it in our scope.working_arguments # (of course, in this case scope.working_arguments = 'arguments') var_name = args_sexp.[:js_source] = scope.mlhs_mapping[@sexp] end line "if (#{var_name} == null) {" line " #{var_name} = nil;" line "}" line "#{var_name} = Opal.to_ary(#{var_name});" scope.with_inline_args([]) do scope.in_mlhs do push process(args_sexp) end end end |
#inline_args ⇒ Object
73 74 75 |
# File 'opal/lib/opal/nodes/args/mlhsarg.rb', line 73 def inline_args @inline_args ||= children.take_while { |arg| arg.type != :restarg && arg.type != :optarg } end |
#mlhs_name ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'opal/lib/opal/nodes/args/mlhsarg.rb', line 52 def mlhs_name @mlhs_name ||= begin if @sexp.[:post] result = ["$mlhs_of"] children.each do |child| case child.type when :arg result << child.children[0] when :mlhs result << 'mlhs' end end result.join("_") else @sexp.children[0].to_s end end end |