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