class RBS::CLI
def run_ast(args, options)
def run_ast(args, options) OptionParser.new do |opts| opts.banner = <<EOB e: rbs ast [patterns...] t JSON AST of loaded environment. can specify patterns to filter declarations with the file names. ples: rbs ast rbs ast 'basic_object.rbs' rbs -I ./sig ast ./sig rbs -I ./sig ast '*/models/*.rbs' end.order!(args) patterns = args.map do |arg| path = Pathname(arg) if path.exist? # Pathname means a directory or a file path else # String means a `fnmatch` pattern arg end end loader = options.loader() env = Environment.from_loader(loader).resolve_type_names decls = env.declarations.select do |decl| loc = decl.location or raise # @type var name: String name = loc.buffer.name patterns.empty? || patterns.any? do |pat| case pat when Pathname Pathname(name).ascend.any? {|p| p == pat } when String name.end_with?(pat) || File.fnmatch(pat, name, File::FNM_EXTGLOB) end end end stdout.print JSON.generate(decls) stdout.flush end