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 =

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

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_constantsObject

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.



23
24
25
26
27
28
29
# File 'sorbet/tapioca/compilers/args.rb', line 23

def self.gather_constants
  # require all the commands to ensure the _arg methods are defined
  ["cmd", "dev-cmd"].each do |dir|
    Dir[File.join(__dir__, "../../../#{dir}", "*.rb")].each { require(_1) }
  end
  [Homebrew::CLI::Args] + 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:



53
54
55
56
# File 'sorbet/tapioca/compilers/args.rb', line 53

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:



59
60
61
62
# File 'sorbet/tapioca/compilers/args.rb', line 59

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.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'sorbet/tapioca/compilers/args.rb', line 32

def decorate
  if constant == Homebrew::CLI::Args
    root.create_path(Homebrew::CLI::Args) do |klass|
      Homebrew.methods(false).select { _1.end_with?("_args") }.each do |args_method_name|
        parser = Homebrew.method(args_method_name).call
        create_args_methods(klass, parser)
      end
    end
  else
    cmd = T.cast(constant, T.class_of(Homebrew::AbstractCommand))
    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
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:



65
66
67
68
69
70
71
72
73
# File 'sorbet/tapioca/compilers/args.rb', line 65

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