diff --git a/lib/solargraph/pin/method.rb b/lib/solargraph/pin/method.rb index 14517af55..c39ea1974 100644 --- a/lib/solargraph/pin/method.rb +++ b/lib/solargraph/pin/method.rb @@ -124,13 +124,14 @@ def overloads closure: self, # args: tag.parameters.map(&:first), parameters: tag.parameters.map do |src| + name, decl = parse_overload_param(src.first) Pin::Parameter.new( location: location, closure: self, comments: tag.docstring.all.to_s, - name: src.first, + name: name, presence: location ? location.range : nil, - decl: :arg + decl: decl ) end, comments: tag.docstring.all.to_s @@ -240,6 +241,21 @@ def infer_from_iv api_map return ComplexType::UNDEFINED if types.empty? ComplexType.try_parse(*types.map(&:tag).uniq) end + + # When YARD parses an overload tag, it includes rest modifiers in the parameters names. + # + # @param arg [String] + # @return [Array(String, Symbol)] + def parse_overload_param(name) + if name.start_with?('**') + [name[2..-1], :kwrestarg] + elsif name.start_with?('*') + [name[1..-1], :restarg] + else + [name, :arg] + end + end + end end end diff --git a/spec/pin/method_spec.rb b/spec/pin/method_spec.rb index d6d72a49e..4e2bd6e91 100644 --- a/spec/pin/method_spec.rb +++ b/spec/pin/method_spec.rb @@ -177,6 +177,18 @@ def bar expect(overload.docstring.tag(:param).types).to eq(['Integer']) end + it 'processes overload tags with restargs' do + pin = Solargraph::Pin::Method.new(name: 'foo', comments: %< +@overload foo(*bar) +@overload foo(**bar) + >) + expect(pin.overloads.length).to eq(2) + restarg_overload = pin.overloads.first + kwrestarg_overload = pin.overloads.last + expect(restarg_overload.parameters.first.decl).to eq(:restarg) + expect(kwrestarg_overload.parameters.first.decl).to eq(:kwrestarg) + end + it 'infers from nil return nodes' do source = Solargraph::Source.load_string(%( class Foo