lib/sord/rbi_generator.rb in sord-0.2.1 vs lib/sord/rbi_generator.rb in sord-0.3.0

- old
+ new

@@ -57,11 +57,21 @@ item.meths.each do |meth| count_object parameter_list = meth.parameters.map do |name, default| - "#{name}#{default && " = #{default}"}" + # Handle these three main cases: + # - def method(param) or def method(param:) + # - def method(param: 'default') + # - def method(param = 'default') + if default.nil? + "#{name}" + elsif !default.nil? && name.end_with?(':') + "#{name} #{default}" + else + "#{name} = #{default}" + end end.join(", ") # This is better than iterating over YARD's "@param" tags directly # because it includes parameters without documentation parameter_names_to_tags = meth.parameters.map do |name, _| @@ -86,13 +96,17 @@ inferred_type = TypeConverter.yard_to_sorbet( getter.tags('return').flat_map(&:types), meth) Logging.infer("inferred type of parameter #{name.inspect} as #{inferred_type} using getter's return type", meth) + # Get rid of : on keyword arguments. + name = name.chop if name.end_with?(':') "#{name}: #{inferred_type}" else Logging.omit("no YARD type given for #{name.inspect}, using T.untyped", meth) + # Get rid of : on keyword arguments. + name = name.chop if name.end_with?(':') "#{name}: T.untyped" end end.join(", ") return_tags = meth.tags('return') @@ -104,13 +118,14 @@ "returns(#{TypeConverter.yard_to_sorbet(meth.tag('return').types, meth)})" end prefix = meth.scope == :class ? 'self.' : '' - rbi_contents << " sig { params(#{sig_params_list}).#{returns} }" + sig = sig_params_list.empty? ? " sig { #{returns} }" : " sig { params(#{sig_params_list}).#{returns} }" + rbi_contents << sig - rbi_contents << " def #{prefix}#{meth.name}(#{parameter_list}) end" + rbi_contents << " def #{prefix}#{meth.name}(#{parameter_list}); end" end end # Generates the RBI file and writes it to the given file path. # @param [String] filename @@ -152,6 +167,6 @@ $@.each do |line| puts " #{line}".light_white end end end -end \ No newline at end of file +end