Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add tapioca/dsl entrypoint for custom DSL compilers #844

Merged
merged 2 commits into from Mar 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions lib/tapioca/dsl.rb
@@ -0,0 +1,6 @@
# typed: true
# frozen_string_literal: true

require "tapioca"
require "tapioca/runtime/reflection"
require "tapioca/dsl/compiler"
59 changes: 59 additions & 0 deletions spec/tapioca/cli/dsl_spec.rb
Expand Up @@ -1279,6 +1279,65 @@ class Post
@project.remove("sorbet/rbi/dsl")
end
end

describe "custom compilers" do
it "must be able to load custom compilers without a full require" do
@project.bundle_install

@project.write("lib/post.rb", <<~RB)
class Post
end
RB

@project.write("lib/compilers/post_compiler.rb", <<~RB)
require "post"
require "tapioca/dsl"

class PostCompiler < Tapioca::Dsl::Compiler
extend T::Sig

ConstantType = type_member(fixed: T.class_of(::Post))

sig { override.void }
def decorate
root.create_path(constant) do |klass|
klass.create_module("GeneratedBar")
klass.create_include("GeneratedBar")
end
end

sig { override.returns(T::Enumerable[Module]) }
def self.gather_constants
[::Post]
end
end
RB

@project.write("bin/generate", <<~RB)
require_relative "../config/environment"

file = RBI::File.new(strictness: "strong")
pipeline = Tapioca::Dsl::Pipeline.new(requested_constants: [])
PostCompiler.new(pipeline, file.root, Post).decorate
puts Tapioca::DEFAULT_RBI_FORMATTER.print_file(file)
RB

result = @project.bundle_exec("ruby bin/generate")

assert_equal(<<~OUT, result.out)
# typed: strong

class Post
include GeneratedBar

module GeneratedBar; end
end
OUT

assert_empty_stderr(result)
assert_success_status(result)
end
end
end
end
end