From bbc34e7952f291ced695c1acb7f0ef739557fe1d Mon Sep 17 00:00:00 2001 From: Kaan Ozkan Date: Thu, 23 Nov 2023 15:43:54 -0500 Subject: [PATCH 1/3] Skip child nodes if parent node is tagged as a shim --- gem/lib/rbi-central/runtime/visitor.rb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/gem/lib/rbi-central/runtime/visitor.rb b/gem/lib/rbi-central/runtime/visitor.rb index 9c792b0..a74562a 100644 --- a/gem/lib/rbi-central/runtime/visitor.rb +++ b/gem/lib/rbi-central/runtime/visitor.rb @@ -20,16 +20,19 @@ def initialize(context) def visit(node) return unless node - validate_node!(node) - visit_all(node.nodes) if node.is_a?(RBI::Tree) + skip = validate_node!(node) + visit_all(node.nodes) if node.is_a?(RBI::Tree) && !skip end - sig { params(node: RBI::Node).void } + sig { params(node: RBI::Node).returns(T.nilable(T.any(T::Boolean, Module))) } def validate_node!(node) annotations = validate_annotations!(node) # Do not test definitions tagged `@shim` - return if annotations.include?("shim") + if annotations.include?("shim") + return true if node.is_a?(RBI::Class) || node.is_a?(RBI::Module) + return false + end loc = T.must(node.loc) From f859d64d36f26a07079756ccd6694ec0f8537329 Mon Sep 17 00:00:00 2001 From: Kaan Ozkan Date: Fri, 24 Nov 2023 12:02:25 -0500 Subject: [PATCH 2/3] Refactor --- gem/lib/rbi-central/runtime/visitor.rb | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/gem/lib/rbi-central/runtime/visitor.rb b/gem/lib/rbi-central/runtime/visitor.rb index a74562a..2a1ee18 100644 --- a/gem/lib/rbi-central/runtime/visitor.rb +++ b/gem/lib/rbi-central/runtime/visitor.rb @@ -20,20 +20,22 @@ def initialize(context) def visit(node) return unless node - skip = validate_node!(node) - visit_all(node.nodes) if node.is_a?(RBI::Tree) && !skip + annotations = validate_annotations!(node) + return if shim?(annotations) + + validate_definition!(node, annotations) + visit_all(node.nodes) if node.is_a?(RBI::Tree) end - sig { params(node: RBI::Node).returns(T.nilable(T.any(T::Boolean, Module))) } - def validate_node!(node) - annotations = validate_annotations!(node) + private - # Do not test definitions tagged `@shim` - if annotations.include?("shim") - return true if node.is_a?(RBI::Class) || node.is_a?(RBI::Module) - return false - end + sig { params(annotations: T::Array[String]).returns(T::Boolean) } + def shim?(annotations) + annotations.include?("shim") + end + sig { params(node: RBI::Node, annotations: T::Array[String]).void } + def validate_definition!(node, annotations) loc = T.must(node.loc) case node From 05d91e95414c31ead932ab1f7c1ad4496580896c Mon Sep 17 00:00:00 2001 From: Kaan Ozkan Date: Fri, 24 Nov 2023 14:08:02 -0500 Subject: [PATCH 3/3] Test shim annotation --- gem/test/rbi-central/runtime/context_test.rb | 30 ++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/gem/test/rbi-central/runtime/context_test.rb b/gem/test/rbi-central/runtime/context_test.rb index 9d53733..030a3cc 100644 --- a/gem/test/rbi-central/runtime/context_test.rb +++ b/gem/test/rbi-central/runtime/context_test.rb @@ -88,6 +88,36 @@ def baz; end ], context.run!) end + def test_shim_annotation + mock = MockGem.new(Dir.mktmpdir, "foo") + mock.gemspec!(mock.default_gemspec) + mock.write!("lib/foo.rb", <<~RB) + class Foo + def foo(*); end + end + RB + context = Context.new(mock.gem, "gem.rbi") + visitor = Runtime::Visitor.new(context) + rbi_tree = RBI::Parser.parse_string(<<~RBI) + class Foo + # @shim: some description + def foo; end + end + + # @shim: some description + class Bar + def bar; end + end + + class Baz + def baz; end + end + RBI + visitor.visit(rbi_tree) + assert_messages(["Missing runtime constant `::Baz` (defined at `-:11:0-13:3`)", + "Missing runtime constant `::Baz` (defined at `-:12:2-12:14`)",], context.run!) + end + def test_annotated_singleton_method_missing mock = MockGem.new(Dir.mktmpdir, "foo") mock.gemspec!(mock.default_gemspec)