@@ -1089,7 +1089,7 @@ def test_parse__class_with_super_class_and_members
10891089 result = parse ( <<~RUBY )
10901090 class Person < ActiveRecord::Base #[Person]
10911091 attr_reader :name #: String
1092-
1092+
10931093 def age
10941094 25
10951095 end
@@ -1107,7 +1107,7 @@ def age
11071107 assert_equal "Person" , decl . super_class . args [ 0 ] . to_s
11081108
11091109 assert_equal 2 , decl . members . size
1110-
1110+
11111111 decl . members [ 0 ] . tap do |member |
11121112 assert_instance_of RBS ::AST ::Ruby ::Members ::AttrReaderMember , member
11131113 assert_equal [ :name ] , member . names
@@ -1120,4 +1120,87 @@ def age
11201120 end
11211121 end
11221122 end
1123+
1124+ def test_parse__instance_variable
1125+ result = parse ( <<~RUBY )
1126+ class Person
1127+ # @rbs @name: String
1128+ # @rbs @age: Integer?
1129+
1130+ def initialize(name, age)
1131+ @name = name
1132+ @age = age
1133+ end
1134+ end
1135+ RUBY
1136+
1137+ assert_empty result . diagnostics
1138+
1139+ result . declarations [ 0 ] . tap do |decl |
1140+ assert_instance_of RBS ::AST ::Ruby ::Declarations ::ClassDecl , decl
1141+ assert_equal RBS ::TypeName . parse ( "Person" ) , decl . class_name
1142+
1143+ # Should have 3 members: 2 instance variable members + 1 def member
1144+ assert_equal 3 , decl . members . size
1145+
1146+ decl . members [ 0 ] . tap do |member |
1147+ assert_instance_of RBS ::AST ::Ruby ::Members ::InstanceVariableMember , member
1148+ assert_equal :@name , member . name
1149+ assert_equal "String" , member . type . to_s
1150+ assert_instance_of RBS ::AST ::Ruby ::Annotations ::InstanceVariableAnnotation , member . annotation
1151+ end
1152+
1153+ decl . members [ 1 ] . tap do |member |
1154+ assert_instance_of RBS ::AST ::Ruby ::Members ::InstanceVariableMember , member
1155+ assert_equal :@age , member . name
1156+ assert_equal "Integer?" , member . type . to_s
1157+ assert_instance_of RBS ::AST ::Ruby ::Annotations ::InstanceVariableAnnotation , member . annotation
1158+ end
1159+
1160+ decl . members [ 2 ] . tap do |member |
1161+ assert_instance_of RBS ::AST ::Ruby ::Members ::DefMember , member
1162+ assert_equal :initialize , member . name
1163+ end
1164+ end
1165+ end
1166+
1167+ def test_error__instance_variable_ignored
1168+ result = parse ( <<~RUBY )
1169+ # @rbs @global_decl: String
1170+
1171+ class Foo
1172+ def initialize
1173+ # @rbs @method_decl: Integer
1174+ end
1175+
1176+ tap do
1177+ # @rbs @block_decl: String
1178+ end
1179+
1180+ # @rbs @method_decl2: untyped
1181+ def foo
1182+ end
1183+ end
1184+ RUBY
1185+
1186+ assert_any! ( result . diagnostics ) do |diagnostic |
1187+ assert_instance_of RBS ::InlineParser ::Diagnostic ::UnusedInlineAnnotation , diagnostic
1188+ assert_equal "@rbs @global_decl: String" , diagnostic . location . source
1189+ end
1190+
1191+ assert_any! ( result . diagnostics ) do |diagnostic |
1192+ assert_instance_of RBS ::InlineParser ::Diagnostic ::UnusedInlineAnnotation , diagnostic
1193+ assert_equal "@rbs @method_decl: Integer" , diagnostic . location . source
1194+ end
1195+
1196+ assert_any! ( result . diagnostics ) do |diagnostic |
1197+ assert_instance_of RBS ::InlineParser ::Diagnostic ::UnusedInlineAnnotation , diagnostic
1198+ assert_equal "@rbs @method_decl2: untyped" , diagnostic . location . source
1199+ end
1200+
1201+ assert_any! ( result . diagnostics ) do |diagnostic |
1202+ assert_instance_of RBS ::InlineParser ::Diagnostic ::UnusedInlineAnnotation , diagnostic
1203+ assert_equal "@rbs @block_decl: String" , diagnostic . location . source
1204+ end
1205+ end
11231206end
0 commit comments