@@ -793,4 +793,135 @@ class Object
793793 # Verify that Object class is created
794794 assert_operator resolved_env . class_decls , :key? , type_name ( "::Object" )
795795 end
796+
797+ def test__ruby__class_alias_declarations
798+ result = parse_inline ( <<~RUBY )
799+ class String
800+ end
801+ class Object
802+ end
803+ class Array
804+ end
805+
806+ # Basic class alias without explicit type name
807+ MyString = String #: class-alias
808+
809+ # Class alias with explicit type name
810+ MyObject = some_object_factory #: class-alias Object
811+
812+ # Class alias with namespace
813+ MyArray = Array #: class-alias
814+
815+ # Nested class alias
816+ module Container
817+ InnerString = String #: class-alias
818+ end
819+ RUBY
820+
821+ env = Environment . new
822+ env . add_source ( RBS ::Source ::Ruby . new ( result . buffer , result . prism_result , result . declarations , result . diagnostics ) )
823+ resolved_env = env . resolve_type_names
824+
825+ # Check basic class alias without explicit type name
826+ assert_operator resolved_env . class_alias_decls , :key? , type_name ( "::MyString" )
827+ resolved_env . class_alias_decls [ type_name ( "::MyString" ) ] . tap do |entry |
828+ assert_instance_of Environment ::ClassAliasEntry , entry
829+ assert_equal type_name ( "::MyString" ) , entry . name
830+ assert_equal type_name ( "::String" ) , entry . decl . old_name
831+ end
832+
833+ # Check class alias with explicit type name
834+ assert_operator resolved_env . class_alias_decls , :key? , type_name ( "::MyObject" )
835+ resolved_env . class_alias_decls [ type_name ( "::MyObject" ) ] . tap do |entry |
836+ assert_instance_of Environment ::ClassAliasEntry , entry
837+ assert_equal type_name ( "::MyObject" ) , entry . name
838+ assert_equal type_name ( "::Object" ) , entry . decl . old_name
839+ end
840+
841+ # Check class alias with Array
842+ assert_operator resolved_env . class_alias_decls , :key? , type_name ( "::MyArray" )
843+ resolved_env . class_alias_decls [ type_name ( "::MyArray" ) ] . tap do |entry |
844+ assert_instance_of Environment ::ClassAliasEntry , entry
845+ assert_equal type_name ( "::MyArray" ) , entry . name
846+ assert_equal type_name ( "::Array" ) , entry . decl . old_name
847+ end
848+
849+ # Check nested class alias
850+ assert_operator resolved_env . class_alias_decls , :key? , type_name ( "::Container::InnerString" )
851+ resolved_env . class_alias_decls [ type_name ( "::Container::InnerString" ) ] . tap do |entry |
852+ assert_instance_of Environment ::ClassAliasEntry , entry
853+ assert_equal type_name ( "::Container::InnerString" ) , entry . name
854+ assert_equal type_name ( "::String" ) , entry . decl . old_name
855+ end
856+
857+ # Verify Container module is created
858+ assert_operator resolved_env . class_decls , :key? , type_name ( "::Container" )
859+ end
860+
861+ def test__ruby__module_alias_declarations
862+ result = parse_inline ( <<~RUBY )
863+ module Kernel
864+ end
865+
866+ module Enumerable
867+ end
868+
869+ # Basic module alias without explicit type name
870+ MyKernel = Kernel #: module-alias
871+
872+ # Module alias with explicit type name
873+ MyEnum = some_enumerable_factory #: module-alias Enumerable
874+ RUBY
875+
876+ env = Environment . new
877+ env . add_source ( RBS ::Source ::Ruby . new ( result . buffer , result . prism_result , result . declarations , result . diagnostics ) )
878+ resolved_env = env . resolve_type_names
879+
880+ # Check basic module alias without explicit type name
881+ assert_operator resolved_env . class_alias_decls , :key? , type_name ( "::MyKernel" )
882+ resolved_env . class_alias_decls [ type_name ( "::MyKernel" ) ] . tap do |entry |
883+ assert_instance_of Environment ::ModuleAliasEntry , entry
884+ assert_equal type_name ( "::MyKernel" ) , entry . name
885+ assert_equal type_name ( "::Kernel" ) , entry . decl . old_name
886+ end
887+
888+ # Check module alias with explicit type name
889+ assert_operator resolved_env . class_alias_decls , :key? , type_name ( "::MyEnum" )
890+ resolved_env . class_alias_decls [ type_name ( "::MyEnum" ) ] . tap do |entry |
891+ assert_instance_of Environment ::ModuleAliasEntry , entry
892+ assert_equal type_name ( "::MyEnum" ) , entry . name
893+ assert_equal type_name ( "::Enumerable" ) , entry . decl . old_name
894+ end
895+ end
896+
897+ def test__ruby__class_module_alias_with_skip_annotation
898+ result = parse_inline ( <<~RUBY )
899+ # @rbs skip
900+ SkippedString = String #: class-alias
901+
902+ # This should be processed
903+ ProcessedString = String #: class-alias
904+
905+ # @rbs skip
906+ SkippedKernel = Kernel #: module-alias
907+
908+ # This should be processed
909+ ProcessedKernel = Kernel #: module-alias
910+ RUBY
911+
912+ env = Environment . new
913+ env . add_source ( RBS ::Source ::Ruby . new ( result . buffer , result . prism_result , result . declarations , result . diagnostics ) )
914+ resolved_env = env . resolve_type_names
915+
916+ # Check that skipped aliases are not present
917+ refute_operator resolved_env . class_alias_decls , :key? , type_name ( "::SkippedString" )
918+ refute_operator resolved_env . class_alias_decls , :key? , type_name ( "::SkippedKernel" )
919+
920+ # Check that non-skipped aliases are present
921+ assert_operator resolved_env . class_alias_decls , :key? , type_name ( "::ProcessedString" )
922+ assert_instance_of Environment ::ClassAliasEntry , resolved_env . class_alias_decls [ type_name ( "::ProcessedString" ) ]
923+
924+ assert_operator resolved_env . class_alias_decls , :key? , type_name ( "::ProcessedKernel" )
925+ assert_instance_of Environment ::ModuleAliasEntry , resolved_env . class_alias_decls [ type_name ( "::ProcessedKernel" ) ]
926+ end
796927end
0 commit comments