#!/usr/bin/env python3
"""
Parse source files and print the abstract syntax trees.
"""

from __future__ import annotations

import argparse
import sys

from mypy import defaults
from mypy.errors import CompileError
from mypy.options import Options
from mypy.parse import parse


def dump(fname: str, python_version: tuple[int, int], quiet: bool = False) -> None:
    options = Options()
    options.python_version = python_version
    with open(fname, "rb") as f:
        s = f.read()
        tree = parse(s, fname, None, errors=None, options=options)
        if not quiet:
            print(tree)


def main() -> None:
    # Parse a file and dump the AST (or display errors).
    parser = argparse.ArgumentParser(
        description="Parse source files and print the abstract syntax tree (AST)."
    )
    parser.add_argument("--quiet", action="store_true", help="do not print AST")
    parser.add_argument("FILE", nargs="*", help="files to parse")
    args = parser.parse_args()

    status = 0
    for fname in args.FILE:
        try:
            dump(fname, defaults.PYTHON3_VERSION, args.quiet)
        except CompileError as e:
            for msg in e.messages:
                sys.stderr.write("%s\n" % msg)
            status = 1
    sys.exit(status)


if __name__ == "__main__":
    main()
