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