From aba325853fd85dcf7f09f2ab7645fc6827bc9a0c Mon Sep 17 00:00:00 2001 From: S-H-GAMELINKS Date: Thu, 1 May 2025 22:36:44 +0900 Subject: [PATCH 1/2] Support RBS::AST::Members::InstanceVariable --- lib/typeprof/core/ast.rb | 2 + lib/typeprof/core/ast/sig_decl.rb | 39 +++++++++++++++++++ .../my_dummy_gem/lib/my_dummy_gem.rb | 3 +- .../my_dummy_gem/1.0/my_dummy_gem.rbs | 3 +- 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/lib/typeprof/core/ast.rb b/lib/typeprof/core/ast.rb index 760d74115..e3bbd4a62 100644 --- a/lib/typeprof/core/ast.rb +++ b/lib/typeprof/core/ast.rb @@ -413,6 +413,8 @@ def self.create_rbs_member(raw_decl, lenv) SigAttrAccessorNode.new(raw_decl, lenv) when RBS::AST::Declarations::Base self.create_rbs_decl(raw_decl, lenv) + when RBS::AST::Members::InstanceVariable + SigInstanceVariableNode.new(raw_decl, lenv) else raise "unsupported: #{ raw_decl.class }" end diff --git a/lib/typeprof/core/ast/sig_decl.rb b/lib/typeprof/core/ast/sig_decl.rb index 30d96d721..f2eea1a79 100644 --- a/lib/typeprof/core/ast/sig_decl.rb +++ b/lib/typeprof/core/ast/sig_decl.rb @@ -434,6 +434,45 @@ def install0(genv) end end + class SigInstanceVariableNode < Node + def initialize(raw_decl, lenv) + super(raw_decl, lenv) + @var = raw_decl.name + @cpath = lenv.cref.cpath + @scope_level = lenv.cref.scope_level + @type = AST.create_rbs_type(raw_decl.type, lenv) + end + + attr_reader :cpath, :scope_level, :type + def subnodes = { type: } + def attrs = { cpath: } + + def define0(genv) + @type.define(genv) + mod = genv.resolve_ivar(cpath, scope_level == :class, @var) + mod.add_decl(self) + mod + end + + def define_copy(genv) + mod = genv.resolve_ivar(cpath, scope_level == :class, @var) + mod.add_decl(self) + mod.remove_decl(@prev_node) + super(genv) + end + + def undefine0(genv) + genv.resolve_ivar(cpath, scope_level == :class, @var).remove_decl(self) + @type.undefine(genv) + end + + def install0(genv) + box = @changes.add_type_read_box(genv, @type) + @changes.add_edge(genv, box.ret, @static_ret.vtx) + box.ret + end + end + class SigGlobalVariableNode < Node def initialize(raw_decl, lenv) super(raw_decl, lenv) diff --git a/test/fixtures/rbs_collection_test/dummy_gem_source/my_dummy_gem/lib/my_dummy_gem.rb b/test/fixtures/rbs_collection_test/dummy_gem_source/my_dummy_gem/lib/my_dummy_gem.rb index 0b0c851d5..99769903e 100644 --- a/test/fixtures/rbs_collection_test/dummy_gem_source/my_dummy_gem/lib/my_dummy_gem.rb +++ b/test/fixtures/rbs_collection_test/dummy_gem_source/my_dummy_gem/lib/my_dummy_gem.rb @@ -1,4 +1,5 @@ def hello(name) - "Hello, #{ name }" + @name = name + "Hello, #{ @name }" raise end diff --git a/test/fixtures/rbs_collection_test/dummy_rbs_collection/my_dummy_gem/1.0/my_dummy_gem.rbs b/test/fixtures/rbs_collection_test/dummy_rbs_collection/my_dummy_gem/1.0/my_dummy_gem.rbs index a081deb01..abb99cb6d 100644 --- a/test/fixtures/rbs_collection_test/dummy_rbs_collection/my_dummy_gem/1.0/my_dummy_gem.rbs +++ b/test/fixtures/rbs_collection_test/dummy_rbs_collection/my_dummy_gem/1.0/my_dummy_gem.rbs @@ -1,3 +1,4 @@ class MyDummyGem + @name: String def hello: (String) -> :ok -end \ No newline at end of file +end From 0cbe1492733d3e94cef532d3bb09edf02bdbeafe Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Fri, 20 Jun 2025 19:16:50 +0900 Subject: [PATCH 2/2] RBS ivar decl. should be an ivar of an instance, not a class object Co-Authored-By: Takumi Shotoku --- lib/typeprof/core/ast/sig_decl.rb | 9 ++++----- scenario/rbs/ivar.rb | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 scenario/rbs/ivar.rb diff --git a/lib/typeprof/core/ast/sig_decl.rb b/lib/typeprof/core/ast/sig_decl.rb index f2eea1a79..e186e6368 100644 --- a/lib/typeprof/core/ast/sig_decl.rb +++ b/lib/typeprof/core/ast/sig_decl.rb @@ -439,30 +439,29 @@ def initialize(raw_decl, lenv) super(raw_decl, lenv) @var = raw_decl.name @cpath = lenv.cref.cpath - @scope_level = lenv.cref.scope_level @type = AST.create_rbs_type(raw_decl.type, lenv) end - attr_reader :cpath, :scope_level, :type + attr_reader :cpath, :type def subnodes = { type: } def attrs = { cpath: } def define0(genv) @type.define(genv) - mod = genv.resolve_ivar(cpath, scope_level == :class, @var) + mod = genv.resolve_ivar(cpath, false, @var) mod.add_decl(self) mod end def define_copy(genv) - mod = genv.resolve_ivar(cpath, scope_level == :class, @var) + mod = genv.resolve_ivar(cpath, false, @var) mod.add_decl(self) mod.remove_decl(@prev_node) super(genv) end def undefine0(genv) - genv.resolve_ivar(cpath, scope_level == :class, @var).remove_decl(self) + genv.resolve_ivar(cpath, false, @var).remove_decl(self) @type.undefine(genv) end diff --git a/scenario/rbs/ivar.rb b/scenario/rbs/ivar.rb new file mode 100644 index 000000000..3d300fb76 --- /dev/null +++ b/scenario/rbs/ivar.rb @@ -0,0 +1,16 @@ +## update: test.rbs +class Foo + @foo: String +end + +## update: test.rb +class Foo + def check + @foo + end +end + +## assert +class Foo + def check: -> String +end