def screen_name(iseq, scratch)
fargs_str = "("
sig_help = {}
add_farg = -> farg, name, help: false, key: sig_help.size do
name = "`#{ name }`" if RBS::Parser::KEYWORDS.key?(name.to_s)
name = "noname" if name.is_a?(Integer) || name == :"*"
fargs_str << ", " if fargs_str != "("
i = fargs_str.size
fargs_str << (Config.current.options[:show_parameter_names] && name ? "#{ farg } #{ name }" : farg)
sig_help[key] = (i...fargs_str.size)
end
@lead_tys.zip(iseq ? iseq.locals : []) do |ty, name|
add_farg.call(ty.screen_name(scratch), name, help: true)
end
@opt_tys&.zip(iseq ? iseq.locals[@lead_tys.size, @opt_tys.size] : []) do |ty, name|
add_farg.call("?" + ty.screen_name(scratch), name, help: true)
end
if @rest_ty
if iseq
rest_index = iseq.fargs_format[:rest_start]
name = rest_index ? iseq.locals[rest_index] : nil
end
add_farg.call("*" + @rest_ty.screen_name(scratch), name)
end
if iseq
post_start = iseq.fargs_format[:post_start]
names = post_start ? iseq.locals[post_start, @post_tys.size] : []
end
@post_tys&.zip(names || []) do |ty, name|
add_farg.call(ty.screen_name(scratch), name)
end
@kw_tys&.each do |req, sym, ty|
opt = req ? "" : "?"
add_farg.call("#{ opt }#{ sym }: #{ ty.screen_name(scratch) }", nil, help: true, key: sym)
end
if @kw_rest_ty
all_val_ty = Type.bot
@kw_rest_ty.each_child_global do |ty|
if ty == Type.any
val_ty = ty
else
_key_ty, val_ty = ty.elems.squash
end
all_val_ty = all_val_ty.union(val_ty)
end
add_farg.call("**" + all_val_ty.screen_name(scratch), nil)
end
fargs_str << ")"
fargs_str = "" if fargs_str == "()"
return fargs_str, sig_help if caller_locations.any? {|frame| frame.label == "show_block_signature" }
optional = false
blks = []
@blk_ty.each_child_global do |ty|
if ty.is_a?(Type::Proc)
blks << ty
else
optional = true
end
end
if blks != []
fargs_str << " " if fargs_str != ""
fargs_str << "?" if optional
fargs_str << scratch.show_block_signature(blks)
end
return fargs_str, sig_help
end