class Opal::Nodes::ArityCheckNode

def all_args

def all_args
  @all_args ||= [*@args, *@optargs, @restarg, *@postargs, *kwargs].compact
end

def arity

def arity
  if @restarg || @optargs.any? || has_only_optional_kwargs?
    negative_arity
  else
    positive_arity
  end
end

def arity_checks

error caused by arity check
Returns an array of JS conditions for raising and argument
def arity_checks
  return @arity_checks if defined?(@arity_checks)
  arity = all_args.size
  arity -= @optargs.size
  arity -= 1 if @restarg
  arity -= kwargs.size
  arity = -arity - 1 if !@optargs.empty? || !kwargs.empty? || @restarg
  @arity_checks = []
  if arity < 0 # splat or opt args
    min_arity = -(arity + 1)
    max_arity = all_args.size
    @arity_checks << "$arity < #{min_arity}" if min_arity > 0
    @arity_checks << "$arity > #{max_arity}" unless @restarg
  else
    @arity_checks << "$arity !== #{arity}"
  end
  @arity_checks
end

def compile

def compile
  scope.arity = arity
  return unless compiler.arity_check?
  unless arity_checks.empty?
    helper :ac
    meth = scope.mid.to_s.inspect
    line 'var $arity = arguments.length;'
    push " if (#{arity_checks.join(' || ')}) { $ac($arity, #{arity}, this, #{meth}); }"
  end
end

def has_only_optional_kwargs?

def has_only_optional_kwargs?
  kwargs.any? && kwargs.all? { |arg| %i[kwoptarg kwrestarg].include?(arg.type) }
end

def has_required_kwargs?

def has_required_kwargs?
  kwargs.any? { |arg| arg.type == :kwarg }
end

def initialize(*)

def initialize(*)
  super
  arguments = Rewriters::Arguments.new(args_node.children)
  @args      = arguments.args
  @optargs   = arguments.optargs
  @restarg   = arguments.restarg
  @postargs  = arguments.postargs
  @kwargs    = arguments.kwargs
  @kwoptargs = arguments.kwoptargs
  @kwrestarg = arguments.kwrestarg
  @kwnilarg  = arguments.kwnilarg
end

def kwargs

def kwargs
  [*@kwargs, *@kwoptargs, @kwrestarg].compact
end

def negative_arity

def negative_arity
  required_plain_args = all_args.select do |arg|
    %i[arg mlhs].include?(arg.type)
  end
  result = required_plain_args.size
  if has_required_kwargs?
    result += 1
  end
  result = -result - 1
  result
end

def positive_arity

def positive_arity
  result = all_args.size
  result -= kwargs.size
  result += 1 if kwargs.any?
  result
end