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