Class: Tapioca::Compilers::Args

Inherits:
Dsl::Compiler
  • Object
show all
Defined in:
sorbet/tapioca/compilers/args.rb

Constant Summary collapse

GLOBAL_OPTIONS =
T.let(
  Homebrew::CLI::Parser.global_options.map do |short_option, long_option, _|
    [short_option, long_option].map { "#{Homebrew::CLI::Parser.option_to_name(_1)}?" }
  end.flatten.freeze, T::Array[String]
)
Parsable =
T.type_alias { T.any(T.class_of(Homebrew::CLI::Args), T.class_of(Homebrew::AbstractCommand)) }
ConstantType =
type_member { { fixed: Parsable } }

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.gather_constantsEnumerable<Parsable>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



19
20
21
22
23
24
25
# File 'sorbet/tapioca/compilers/args.rb', line 19

def self.gather_constants
  # require all the commands to ensure the command subclasses are defined
  ["cmd", "dev-cmd"].each do |dir|
    Dir[File.join(__dir__, "../../../#{dir}", "*.rb")].each { require(_1) }
  end
  Homebrew::AbstractCommand.subclasses
end

Instance Method Details

#args_table(parser) ⇒ Hash{Symbol => T.untyped}

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



43
44
45
46
# File 'sorbet/tapioca/compilers/args.rb', line 43

def args_table(parser)
  # we exclude non-args from the table, such as :named and :remaining
  parser.instance_variable_get(:@args).instance_variable_get(:@table).except(:named, :remaining)
end

#comma_arrays(parser) ⇒ Array<Symbol>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



49
50
51
52
# File 'sorbet/tapioca/compilers/args.rb', line 49

def comma_arrays(parser)
  parser.instance_variable_get(:@non_global_processed_options)
        .filter_map { |k, v| parser.option_to_name(k).to_sym if v == :comma_array }
end

#decoratevoid

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This method returns an undefined value.



28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'sorbet/tapioca/compilers/args.rb', line 28

def decorate
  cmd = T.cast(constant, T.class_of(Homebrew::AbstractCommand))
  # This is a dummy class to make the `brew` command parsable
  return if cmd == Homebrew::Cmd::Brew

  args_class_name = T.must(T.must(cmd.args_class).name)
  root.create_class(args_class_name, superclass_name: "Homebrew::CLI::Args") do |klass|
    create_args_methods(klass, cmd.parser)
  end
  root.create_path(constant) do |klass|
    klass.create_method("args", return_type: args_class_name)
  end
end

#get_return_type(method_name, value, comma_array_methods) ⇒ String

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



55
56
57
58
59
60
61
62
63
# File 'sorbet/tapioca/compilers/args.rb', line 55

def get_return_type(method_name, value, comma_array_methods)
  if comma_array_methods.include?(method_name)
    "T.nilable(T::Array[String])"
  elsif [true, false].include?(value)
    "T::Boolean"
  else
    "T.nilable(String)"
  end
end