@@ -428,6 +428,72 @@ def `: () -> void
428428 end
429429 end
430430
431+ def test_data_class_decl
432+ RBS ::Parser . parse_signature ( buffer ( <<-RBS ) ) . tap do |_ , _ , decls |
433+ class Foo < Data(a: Integer)
434+ end
435+ RBS
436+ decls [ 0 ] . tap do |decl |
437+ assert_instance_of RBS ::AST ::Declarations ::Class , decl
438+ assert_equal TypeName ( "Foo" ) , decl . name
439+ assert_predicate decl . type_params , :empty?
440+ assert_nil decl . super_class . name
441+ assert_equal TypeName ( "Data" ) , decl . super_class . superclass . name
442+
443+ assert_equal 8 , decl . members . size
444+
445+ decl . members [ 0 ] . tap do |member |
446+ assert_instance_of RBS ::AST ::Members ::AttrReader , member
447+ assert_equal :instance , member . kind
448+ assert_equal :a , member . name
449+ assert_equal "Integer" , member . type . to_s
450+ end
451+
452+ decl . members [ 1 ] . tap do |member |
453+ assert_instance_of RBS ::AST ::Members ::MethodDefinition , member
454+ assert_equal :method , member . kind
455+ assert_equal :initialize , member . name
456+ assert_equal [ "(::Integer) -> void | (id: ::Integer) -> void" ] , member . method_types . map ( &:to_s )
457+ end
458+
459+ decl . members [ 2 ] . tap do |member |
460+ assert_instance_of RBS ::AST ::Members ::MethodDefinition , member
461+ assert_equal :method , member . kind
462+ assert_equal :members , member . name
463+ assert_equal [ "() -> Array[Symbol]" ] , member . method_types . map ( &:to_s )
464+ end
465+
466+ decl . members [ 3 ] . tap do |member |
467+ assert_instance_of RBS ::AST ::Members ::MethodDefinition , member
468+ assert_equal :method , member . kind
469+ assert_equal :deconstruct , member . name
470+ assert_equal [ "() -> [Integer]" ] , member . method_types . map ( &:to_s )
471+ end
472+
473+ decl . members [ 4 ] . tap do |member |
474+ assert_instance_of RBS ::AST ::Members ::MethodDefinition , member
475+ assert_equal :method , member . kind
476+ assert_equal :deconstruct_keys , member . name
477+ assert_equal [ "(nil) -> {a: Integer} | (Array(Symbol)) -> Hash[untyped]" ] , member . method_types . map ( &:to_s )
478+ end
479+
480+ decl . members [ 5 ] . tap do |member |
481+ assert_instance_of RBS ::AST ::Members ::MethodDefinition , member
482+ assert_equal :method , member . kind
483+ assert_equal :with , member . name
484+ assert_equal [ "(?a: Integer) -> Foo" ] , member . method_types . map ( &:to_s )
485+ end
486+ end
487+
488+ decls [ 1 ] . tap do |decl |
489+ # as funcall: Foo[1]
490+ assert_instance_of RBS ::Types ::UntypedFunction , decl . block . type
491+ assert_equal TypeName ( "Foo" ) , decl . name
492+ assert_equal [ "(::Integer a) -> Foo |(a: ::Integer) -> Foo" ] , member . method_types . map ( &:to_s )
493+ end
494+ end
495+ end
496+
431497 def test_parse_type
432498 assert_equal "hello" , RBS ::Parser . parse_type ( buffer ( '"hello"' ) ) . literal
433499 assert_equal "hello" , RBS ::Parser . parse_type ( buffer ( "'hello'" ) ) . literal
0 commit comments