@@ -680,6 +680,65 @@ class Post
680680 assert_success_status ( result )
681681 end
682682
683+ it "preserves RBS comment rewriting when the host sets up Bootsnap without TAPIOCA_RBS_CACHE" do
684+ @project . write! ( "lib/00_bootsnap.rb" , <<~RB )
685+ require "bootsnap"
686+ Bootsnap.setup(cache_dir: File.join(Dir.pwd, "tmp/cache/host-bootsnap"))
687+ RB
688+
689+ @project . write! ( "lib/post.rb" , <<~RB )
690+ # typed: strict
691+
692+ class Post
693+ #: -> String
694+ def title
695+ "hello"
696+ end
697+ end
698+ RB
699+
700+ @project . write! ( "lib/compilers/rbs_comment_compiler.rb" , <<~RB )
701+ require "post"
702+
703+ class RbsCommentCompiler < Tapioca::Dsl::Compiler
704+ extend T::Sig
705+ extend T::Generic
706+
707+ ConstantType = type_member { { fixed: T.class_of(::Post) } }
708+
709+ sig { override.void }
710+ def decorate
711+ root.create_path(constant) do |klass|
712+ create_method_from_def(klass, constant.instance_method(:title))
713+ end
714+ end
715+
716+ sig { override.returns(T::Enumerable[T::Module[T.anything]]) }
717+ def self.gather_constants
718+ [::Post]
719+ end
720+ end
721+ RB
722+
723+ result = @project . tapioca ( "dsl Post --only RbsCommentCompiler" )
724+
725+ assert_empty_stderr ( result )
726+ assert_project_file_equal ( "sorbet/rbi/dsl/post.rbi" , <<~RBI )
727+ # typed: true
728+
729+ # DO NOT EDIT MANUALLY
730+ # This is an autogenerated file for dynamic methods in `Post`.
731+ # Please instead update this file by running `bin/tapioca dsl Post`.
732+
733+
734+ class Post
735+ sig { returns(::String) }
736+ def title; end
737+ end
738+ RBI
739+ assert_success_status ( result )
740+ end
741+
683742 it "raises when the host calls Bootsnap.setup under TAPIOCA_RBS_CACHE=1" do
684743 @project . write! ( "lib/post.rb" , <<~RB )
685744 require "bootsnap"
0 commit comments