diff --git a/lib/tapioca/dsl/pipeline.rb b/lib/tapioca/dsl/pipeline.rb index efe210c9f..502528e08 100644 --- a/lib/tapioca/dsl/pipeline.rb +++ b/lib/tapioca/dsl/pipeline.rb @@ -152,6 +152,9 @@ def rbi_for_constant(constant) compiler = compiler_class.new(self, file.root, constant) compiler.decorate + rescue + $stderr.puts("Error: `#{compiler_class.name}` failed to generate RBI for `#{constant}`") + raise # This is an unexpected error, so re-raise it end return if file.root.empty? diff --git a/spec/tapioca/cli/dsl_spec.rb b/spec/tapioca/cli/dsl_spec.rb index 966237282..0032d19a5 100644 --- a/spec/tapioca/cli/dsl_spec.rb +++ b/spec/tapioca/cli/dsl_spec.rb @@ -1148,6 +1148,42 @@ class Image assert_project_file_exist("sorbet/rbi/dsl/job.rbi") assert_project_file_exist("sorbet/rbi/dsl/image.rbi") end + + it "shows a helpful error message when unexpected errors occur" do + @project.write("lib/post.rb", <<~RB) + class Post + end + RB + + @project.write("lib/compilers/post_compiler_that_raises.rb", <<~RB) + require "post" + + class PostCompilerThatRaises < Tapioca::Dsl::Compiler + def decorate + raise "Some unexpected error happened" + end + + def self.gather_constants + [::Post] + end + end + RB + + result = @project.tapioca("dsl") + + assert_equal(<<~OUT, result.out) + Loading Rails application... Done + Loading DSL compiler classes... Done + Compiling DSL RBI files... + + OUT + + assert_includes(result.err, "Error: `PostCompilerThatRaises` failed to generate RBI for `Post`") + assert_includes(result.err, "Some unexpected error happened") + + refute_project_file_exist("sorbet/rbi/dsl/post.rbi") + refute_success_status(result) + end end describe "verify" do