class Tapioca::Helpers::Test::DslCompiler::CompilerContext

def activate_other_dsl_compilers(compiler_classes)

def activate_other_dsl_compilers(compiler_classes)
  @other_compiler_classes = compiler_classes
end

def activated_compiler_classes

def activated_compiler_classes
  [compiler_class, *other_compiler_classes]
end

def errors

def errors
  pipeline.errors
end

def gathered_constants

def gathered_constants
  compiler_class.processable_constants.filter_map(&:name).sort
end

def initialize(compiler_class)

def initialize(compiler_class)
  @compiler_class = compiler_class
  @other_compiler_classes = T.let([], T::Array[T.class_of(Tapioca::Dsl::Compiler)])
  @pipeline = T.let(nil, T.nilable(Tapioca::Dsl::Pipeline))
  @errors = T.let([], T::Array[String])
end

def pipeline

def pipeline
  @pipeline ||= Tapioca::Dsl::Pipeline.new(
    requested_constants: [],
    requested_compilers: activated_compiler_classes,
  )
end

def rbi_for(constant_name, compiler_options: {})

def rbi_for(constant_name, compiler_options: {})
  # Make sure this is a constant that we can handle.
  unless gathered_constants.include?(constant_name.to_s)
    raise "`#{constant_name}` is not processable by the `#{compiler_class}` compiler."
  end
  file = RBI::File.new(strictness: "strong")
  constant = Object.const_get(constant_name)
  compiler = compiler_class.new(pipeline, file.root, constant, compiler_options.transform_keys(&:to_s))
  compiler.decorate
  rbi = Tapioca::DEFAULT_RBI_FORMATTER.print_file(file)
  result = sorbet(
    "--no-config",
    "--stop-after",
    "parser",
    "-e",
    "\"#{rbi}\"",
  )
  unless result.status
    raise(SyntaxError, <<~MSG)
      Expected generated RBI file for `#{constant_name}` to not have any parsing errors.
      Got these parsing errors:
      #{result.err}
    MSG
  end
  rbi
end