Skip to content

Commit 583386b

Browse files
committed
Let def syntaxes have comments
1 parent abe6ef9 commit 583386b

6 files changed

Lines changed: 59 additions & 18 deletions

File tree

lib/rbs/ast/ruby/members.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,12 +183,14 @@ class DefMember < Base
183183
attr_reader :name
184184
attr_reader :node
185185
attr_reader :method_type
186+
attr_reader :leading_comment
186187

187-
def initialize(buffer, name, node, method_type)
188+
def initialize(buffer, name, node, method_type, leading_comment)
188189
super(buffer)
189190
@name = name
190191
@node = node
191192
@method_type = method_type
193+
@leading_comment = leading_comment
192194
end
193195

194196
def location

lib/rbs/definition.rb

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ def comment
6565
case member
6666
when AST::Members::Base
6767
member.comment
68-
when AST::Ruby::Members::AttributeMember
69-
# For Ruby attr_* members, extract comment from leading_comment
68+
when AST::Ruby::Members::Base
7069
if member.leading_comment
7170
lines = [] #: Array[String]
7271

@@ -77,19 +76,15 @@ def comment
7776
end
7877
end
7978

80-
AST::Comment.new(
81-
string: lines.join("\n"),
82-
location: member.leading_comment.location
83-
)
84-
else
85-
nil
79+
string = lines.join("\n")
80+
81+
unless string.strip.empty?
82+
AST::Comment.new(
83+
string: string,
84+
location: member.leading_comment.location
85+
)
86+
end
8687
end
87-
when AST::Ruby::Members::DefMember
88-
# DefMember doesn't currently store leading comments directly
89-
# The comments are processed for type annotations only
90-
nil
91-
when AST::Ruby::Members::Base
92-
nil
9388
end
9489
end
9590

lib/rbs/environment.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,8 @@ def resolve_ruby_member(resolver, member, context:)
722722
member.buffer,
723723
member.name,
724724
member.node,
725-
member.method_type.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
725+
member.method_type.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) },
726+
member.leading_comment
726727
)
727728
when AST::Ruby::Members::IncludeMember
728729
resolved_annotation = member.annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }

lib/rbs/inline_parser.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ def visit_def_node(node)
157157
method_type, leading_unuseds, trailing_unused = AST::Ruby::Members::MethodTypeAnnotation.build(leading_block, trailing_block, [])
158158
report_unused_annotation(trailing_unused, *leading_unuseds)
159159

160-
defn = AST::Ruby::Members::DefMember.new(buffer, node.name, node, method_type)
160+
defn = AST::Ruby::Members::DefMember.new(buffer, node.name, node, method_type, leading_block)
161161
current.members << defn
162162

163163
# Skip other comments in `def` node

sig/ast/ruby/members.rbs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ module RBS
5757
attr_reader name: Symbol
5858
attr_reader node: Prism::DefNode
5959
attr_reader method_type: MethodTypeAnnotation
60+
attr_reader leading_comment: CommentBlock?
6061

61-
def initialize: (Buffer, Symbol name, Prism::DefNode node, MethodTypeAnnotation) -> void
62+
def initialize: (Buffer, Symbol name, Prism::DefNode node, MethodTypeAnnotation, CommentBlock? leading_comment) -> void
6263

6364
def location: () -> Location
6465

test/rbs/definition_builder_test.rb

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3439,4 +3439,46 @@ class MultipleAttributeTest
34393439
end
34403440
end
34413441
end
3442+
3443+
def test_ruby_def_members_docs
3444+
SignatureManager.new do |manager|
3445+
manager.add_ruby_file("a.rb", <<~RUBY)
3446+
class MultipleAttributeTest
3447+
# This is a document for foo method
3448+
#
3449+
# @rbs return: String?
3450+
def foo = nil
3451+
3452+
# Line 1
3453+
#
3454+
# Line 2
3455+
# @rbs () -> Integer
3456+
#
3457+
# Line 3
3458+
def bar = 123
3459+
3460+
# @rbs return: untyped
3461+
def baz = nil
3462+
end
3463+
RUBY
3464+
3465+
manager.build do |env|
3466+
builder = DefinitionBuilder.new(env: env)
3467+
3468+
builder.build_instance(type_name("::MultipleAttributeTest")).tap do |definition|
3469+
definition.methods[:foo].tap do |method|
3470+
assert_equal ["This is a document for foo method\n"], method.comments.map(&:string)
3471+
end
3472+
3473+
definition.methods[:bar].tap do |method|
3474+
assert_equal ["Line 1\n\nLine 2\n\nLine 3"], method.comments.map(&:string)
3475+
end
3476+
3477+
definition.methods[:baz].tap do |method|
3478+
assert_equal [], method.comments
3479+
end
3480+
end
3481+
end
3482+
end
3483+
end
34423484
end

0 commit comments

Comments
 (0)