Skip to content

Commit d3b2c51

Browse files
committed
Update DefinitionBuilder
1 parent dcbb520 commit d3b2c51

File tree

4 files changed

+98
-0
lines changed

4 files changed

+98
-0
lines changed

lib/rbs/definition_builder.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,15 @@ def define_instance(definition, type_name, subst, define_class_vars:)
165165
)
166166
end
167167

168+
when AST::Ruby::Members::InstanceVariableMember
169+
insert_variable(
170+
type_name,
171+
definition.instance_variables,
172+
name: member.name,
173+
type: member.type,
174+
source: member
175+
)
176+
168177
when AST::Members::InstanceVariable
169178
insert_variable(
170179
type_name,

lib/rbs/environment.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,12 @@ def resolve_ruby_member(resolver, member, context:)
785785
member.leading_comment,
786786
resolved_type_annotation
787787
)
788+
when AST::Ruby::Members::InstanceVariableMember
789+
resolved_annotation = member.annotation.map_type_name {|name| absolute_type_name(resolver, nil, name, context: context) }
790+
AST::Ruby::Members::InstanceVariableMember.new(
791+
member.buffer,
792+
resolved_annotation
793+
)
788794
else
789795
raise "Unknown member type: #{member.class}"
790796
end

sig/definition.rbs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ module RBS
1515
| AST::Ruby::Members::AttrReaderMember
1616
| AST::Ruby::Members::AttrWriterMember
1717
| AST::Ruby::Members::AttrAccessorMember
18+
| AST::Ruby::Members::InstanceVariableMember
1819
attr_reader source: source
1920

2021
def initialize: (parent_variable: Variable?, type: Types::t, declared_in: TypeName, source: source) -> void

test/rbs/definition_builder_test.rb

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3563,4 +3563,86 @@ def baz = nil
35633563
end
35643564
end
35653565
end
3566+
3567+
def test_inline_instance_variable_declarations
3568+
SignatureManager.new do |manager|
3569+
manager.add_ruby_file("person.rb", <<~RUBY)
3570+
class Person
3571+
# @rbs @name: String
3572+
# @rbs @age: Integer?
3573+
3574+
def initialize(name, age)
3575+
@name = name
3576+
@age = age
3577+
end
3578+
end
3579+
RUBY
3580+
3581+
manager.build do |env|
3582+
builder = DefinitionBuilder.new(env: env)
3583+
3584+
builder.build_instance(type_name("::Person")).tap do |definition|
3585+
assert_instance_of Definition, definition
3586+
3587+
# Verify instance variables are present
3588+
assert_equal [:@name, :@age].sort, definition.instance_variables.keys.sort
3589+
3590+
# Check @name type
3591+
definition.instance_variables[:@name].tap do |variable|
3592+
assert_instance_of Definition::Variable, variable
3593+
assert_equal parse_type("::String"), variable.type
3594+
assert_equal type_name("::Person"), variable.declared_in
3595+
end
3596+
3597+
# Check @age type
3598+
definition.instance_variables[:@age].tap do |variable|
3599+
assert_instance_of Definition::Variable, variable
3600+
assert_equal parse_type("::Integer?"), variable.type
3601+
assert_equal type_name("::Person"), variable.declared_in
3602+
end
3603+
end
3604+
end
3605+
end
3606+
end
3607+
3608+
def test_inline_instance_variable_with_complex_types
3609+
SignatureManager.new do |manager|
3610+
manager.add_ruby_file("container.rb", <<~RUBY)
3611+
class Container
3612+
# @rbs @items: Array[String]
3613+
# @rbs @metadata: Integer
3614+
3615+
def initialize
3616+
@items = ""
3617+
@metadata = 42
3618+
end
3619+
end
3620+
RUBY
3621+
3622+
manager.build do |env|
3623+
builder = DefinitionBuilder.new(env: env)
3624+
3625+
builder.build_instance(type_name("::Container")).tap do |definition|
3626+
assert_instance_of Definition, definition
3627+
3628+
# Verify instance variables are present
3629+
assert_equal [:@items, :@metadata].sort, definition.instance_variables.keys.sort
3630+
3631+
# Check @items type
3632+
definition.instance_variables[:@items].tap do |variable|
3633+
assert_instance_of Definition::Variable, variable
3634+
assert_equal "Array[::String]", variable.type.to_s
3635+
assert_equal type_name("::Container"), variable.declared_in
3636+
end
3637+
3638+
# Check @metadata type
3639+
definition.instance_variables[:@metadata].tap do |variable|
3640+
assert_instance_of Definition::Variable, variable
3641+
assert_equal parse_type("::Integer"), variable.type
3642+
assert_equal type_name("::Container"), variable.declared_in
3643+
end
3644+
end
3645+
end
3646+
end
3647+
end
35663648
end

0 commit comments

Comments
 (0)