diff --git a/lib/steep/source.rb b/lib/steep/source.rb index 40a0a95b9..a77a1da45 100644 --- a/lib/steep/source.rb +++ b/lib/steep/source.rb @@ -475,6 +475,15 @@ def self.insert_type_node(node, comments) return assertion_node(node, last_comment) end else + if (receiver, name, * = deconstruct_send_node(node)) + if receiver.nil? + if name == :attr_reader || name == :attr_writer || name == :attr_accessor + child_assertions = comments.except(last_line) + node = map_child_node(node) {|child| insert_type_node(child, child_assertions) } + return adjust_location(node) + end + end + end child_assertions = comments.except(last_line) node = map_child_node(node) {|child| insert_type_node(child, child_assertions) } node = adjust_location(node) diff --git a/test/source_test.rb b/test/source_test.rb index e1191fa00..6c0d782f6 100644 --- a/test/source_test.rb +++ b/test/source_test.rb @@ -574,25 +574,25 @@ def foo end def test_assertion_class_module_names - with_factory do |factory| - source = Steep::Source.parse(<<~RUBY, path: Pathname("foo.rb"), factory: factory) - class Foo # : Integer - end - module Bar # : nil - end - RUBY - - source.node.children[0].tap do |node| - assert_equal :class, node.type - assert_equal :const, node.children[0].type + with_factory do |factory| + source = Steep::Source.parse(<<~RUBY, path: Pathname("foo.rb"), factory: factory) + class Foo # : Integer end - - source.node.children[1].tap do |node| - assert_equal :module, node.type - assert_equal :const, node.children[0].type + module Bar # : nil end + RUBY + + source.node.children[0].tap do |node| + assert_equal :class, node.type + assert_equal :const, node.children[0].type + end + + source.node.children[1].tap do |node| + assert_equal :module, node.type + assert_equal :const, node.children[0].type end end + end def test_assertion_assignment with_factory do |factory| @@ -672,6 +672,46 @@ def test_assertion_voids end end + def test_assertion__skip + with_factory do |factory| + source = Steep::Source.parse(<<~RUBY, path: Pathname("foo.rb"), factory: factory) + attr_reader :foo #: String + attr_accessor :bar #: String + attr_writer :baz #: String + RUBY + + source.node.children[0].tap do |node| + assert_equal :send, node.type + end + source.node.children[1].tap do |node| + assert_equal :send, node.type + end + source.node.children[2].tap do |node| + assert_equal :send, node.type + end + end + end + + def test_assertion__no_skip + with_factory do |factory| + source = Steep::Source.parse(<<~RUBY, path: Pathname("foo.rb"), factory: factory) + (attr_reader :foo) #: String + (attr_accessor :bar) #: String + (attr_writer :baz) #: String + RUBY + + source.node.children[0].tap do |node| + assert_equal :assertion, node.type + end + source.node.children[1].tap do |node| + assert_equal :assertion, node.type + end + source.node.children[2].tap do |node| + assert_equal :assertion, node.type + end + end + end + def test_tapp_send with_factory({ Pathname("foo.rbs") => <<-RBS }) do |factory| class Tapp