mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00

This is a naive attempt at creating an RBI compiler for the `Cask::Config` class. `Config` contains methods like `appdir` that are defined dynamically using the class's default values and Sorbet doesn't understand that these methods exist or what their return types are. This compiler works as expected and gets the job done but I know basically nothing about Tapioca, so there may be a better way of doing this. For what it's worth, this isn't an issue right now but Sorbet will surface an error once `Cask::DSL` is updated to `typed: strict` (i.e., `Method appdir does not exist on Cask::Config`). That's something I've been working on and this compiler is intended as a way of preemptively resolving that Sorbet error, so I can move forward with the `Cask::DSL` type signature work.
38 lines
1.0 KiB
Ruby
38 lines
1.0 KiB
Ruby
# typed: strict
|
|
# frozen_string_literal: true
|
|
|
|
require_relative "../../../../global"
|
|
require "cask/config"
|
|
|
|
module Tapioca
|
|
module Compilers
|
|
class CaskConfig < Tapioca::Dsl::Compiler
|
|
ConstantType = type_member { { fixed: Module } }
|
|
|
|
sig { override.returns(T::Enumerable[Module]) }
|
|
def self.gather_constants = [Cask::Config]
|
|
|
|
sig { override.void }
|
|
def decorate
|
|
root.create_module("Cask") do |mod|
|
|
mod.create_class("Config") do |klass|
|
|
Cask::Config.defaults.each do |key, value|
|
|
return_type = if key == :languages
|
|
# :languages is a `LazyObject`, so it lazily evaluates to an
|
|
# array of strings when a method is called on it.
|
|
"T::Array[String]"
|
|
elsif key.end_with?("?")
|
|
"T::Boolean"
|
|
else
|
|
value.class.to_s
|
|
end
|
|
|
|
klass.create_method(key.to_s, return_type:, class_method: false)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|