Class: Tapioca::Compilers::DslCompiler

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/tapioca/compilers/dsl_compiler.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(requested_constants:, requested_generators: [], excluded_generators: [], error_handler: nil) ⇒ DslCompiler

Returns a new instance of DslCompiler.



28
29
30
31
32
33
34
35
# File 'lib/tapioca/compilers/dsl_compiler.rb', line 28

def initialize(requested_constants:, requested_generators: [], excluded_generators: [], error_handler: nil)
  @generators = T.let(
    gather_generators(requested_generators, excluded_generators),
    T::Enumerable[Dsl::Base]
  )
  @requested_constants = requested_constants
  @error_handler = T.let(error_handler || $stderr.method(:puts), T.proc.params(error: String).void)
end

Instance Attribute Details

#error_handlerObject (readonly)

Returns the value of attribute error_handler.



18
19
20
# File 'lib/tapioca/compilers/dsl_compiler.rb', line 18

def error_handler
  @error_handler
end

#generatorsObject (readonly)

Returns the value of attribute generators.



12
13
14
# File 'lib/tapioca/compilers/dsl_compiler.rb', line 12

def generators
  @generators
end

#requested_constantsObject (readonly)

Returns the value of attribute requested_constants.



15
16
17
# File 'lib/tapioca/compilers/dsl_compiler.rb', line 15

def requested_constants
  @requested_constants
end

Instance Method Details

#run(&blk) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/tapioca/compilers/dsl_compiler.rb', line 38

def run(&blk)
  constants_to_process = gather_constants(requested_constants)

  if constants_to_process.empty?
    report_error(<<~ERROR)
      No classes/modules can be matched for RBI generation.
      Please check that the requested classes/modules include processable DSL methods.
    ERROR
  end

  constants_to_process.sort_by { |c| c.name.to_s }.each do |constant|
    rbi = rbi_for_constant(constant)
    next if rbi.nil?

    blk.call(constant, rbi)
  end

  generators.flat_map(&:errors).each do |msg|
    report_error(msg)
  end
end