class Tapioca::Dsl::Compilers::ActiveJob

~~~
end
def self.perform_now(user); end
sig { params(user: User).returns(Mail) }
def self.perform_later(user, &block); end
end
).returns(T.any(NotifyUserJob, FalseClass))
block: T.nilable(T.proc.params(job: NotifyUserJob).void),
user: User,
params(
sig do
class NotifyUserJob
# typed: true
# notify_user_job.rbi
~~~rbi
this compiler will produce the RBI file ‘notify_user_job.rbi` with the following content:
~~~
end
end
# …
def perform(user)
sig { params(user: User).returns(Mail) }
class NotifyUserJob < ActiveJob::Base
~~~rb
For example, with the following `ActiveJob` subclass:<br><br>(api.rubyonrails.org/classes/ActiveJob/Base.html).
`Tapioca::Dsl::Compilers::ActiveJob` generates RBI files for subclasses of

def decorate

def decorate
  return unless constant.instance_methods(false).include?(:perform)
  root.create_path(constant) do |job|
    method = constant.instance_method(:perform)
    constant_name = name_of(constant)
    parameters = compile_method_parameters_to_rbi(method)
    return_type = compile_method_return_type_to_rbi(method)
    job.create_method(
      "perform_later",
      parameters: perform_later_parameters(parameters, constant_name),
      return_type: "T.any(#{constant_name}, FalseClass)",
      class_method: true,
    )
    job.create_method(
      "perform_now",
      parameters: parameters,
      return_type: return_type,
      class_method: true,
    )
  end
end

def gather_constants

def gather_constants
  descendants_of(::ActiveJob::Base)
end

def perform_later_parameters(parameters, constant_name)

def perform_later_parameters(parameters, constant_name)
  if ::Gem::Requirement.new(">= 7.0").satisfied_by?(::ActiveJob.gem_version)
    parameters.reject! { |typed_param| RBI::BlockParam === typed_param.param }
    parameters + [create_block_param(
      "block",
      type: "T.nilable(T.proc.params(job: #{constant_name}).void)",
    )]
  else
    parameters
  end
end