fix(cli): enable midas ast dump
This commit is contained in:
@@ -9,7 +9,7 @@ import click
|
|||||||
import midas.ast.midas as m
|
import midas.ast.midas as m
|
||||||
import midas.ast.python as p
|
import midas.ast.python as p
|
||||||
from midas.ast.location import Location
|
from midas.ast.location import Location
|
||||||
from midas.ast.printer import PythonAstPrinter
|
from midas.ast.printer import MidasAstPrinter, PythonAstPrinter
|
||||||
from midas.checker.checker import Checker
|
from midas.checker.checker import Checker
|
||||||
from midas.checker.diagnostic import Diagnostic
|
from midas.checker.diagnostic import Diagnostic
|
||||||
from midas.cli.highlighter import Highlighter, MidasHighlighter, PythonHighlighter
|
from midas.cli.highlighter import Highlighter, MidasHighlighter, PythonHighlighter
|
||||||
@@ -46,26 +46,52 @@ def utils():
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def dump_python_ast(tree: ast.Module) -> str:
|
||||||
|
parser = PythonParser()
|
||||||
|
stmts: list[p.Stmt] = parser.parse_module(tree)
|
||||||
|
printer = PythonAstPrinter()
|
||||||
|
dump: str = ""
|
||||||
|
for stmt in stmts:
|
||||||
|
dump += printer.print(stmt)
|
||||||
|
dump += "\n"
|
||||||
|
return dump
|
||||||
|
|
||||||
|
|
||||||
|
def dump_midas_ast(source: str, filename: str) -> str:
|
||||||
|
lexer = MidasLexer(source, file=filename)
|
||||||
|
tokens: list[Token] = lexer.process()
|
||||||
|
parser = MidasParser(tokens)
|
||||||
|
stmts: list[m.Stmt] = parser.parse()
|
||||||
|
if len(parser.errors) != 0:
|
||||||
|
for err in parser.errors:
|
||||||
|
print(err.get_report())
|
||||||
|
raise RuntimeError("A parsing error occurred")
|
||||||
|
printer = MidasAstPrinter()
|
||||||
|
dump: str = ""
|
||||||
|
for stmt in stmts:
|
||||||
|
dump += printer.print(stmt)
|
||||||
|
dump += "\n"
|
||||||
|
return dump
|
||||||
|
|
||||||
|
|
||||||
@utils.command()
|
@utils.command()
|
||||||
@click.option("-o", "--output", type=click.File("w"))
|
@click.option("-o", "--output", type=click.File("w"))
|
||||||
@click.option("-p", "--parse", is_flag=True)
|
@click.option("-p", "--parse", is_flag=True)
|
||||||
@click.argument("file", type=click.File("r"))
|
@click.argument("file", type=click.File("r"))
|
||||||
def dump_ast(output: Optional[TextIO], parse: bool, file: TextIO):
|
def dump_ast(output: Optional[TextIO], parse: bool, file: TextIO):
|
||||||
source: str = file.read()
|
source: str = file.read()
|
||||||
tree: ast.Module = ast.parse(source, filename=file.name)
|
|
||||||
dump: str
|
dump: str
|
||||||
|
if file.name.endswith(".py"):
|
||||||
if parse:
|
tree: ast.Module = ast.parse(source, filename=file.name)
|
||||||
parser = PythonParser()
|
if parse:
|
||||||
stmts: list[p.Stmt] = parser.parse_module(tree)
|
dump = dump_python_ast(tree)
|
||||||
printer = PythonAstPrinter()
|
else:
|
||||||
dump = ""
|
dump = ast.dump(tree, indent=4)
|
||||||
for stmt in stmts:
|
elif file.name.endswith(".midas"):
|
||||||
dump += printer.print(stmt)
|
dump = dump_midas_ast(source, file.name)
|
||||||
dump += "\n"
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
dump = ast.dump(tree, indent=4)
|
raise ValueError("Unsupported file type")
|
||||||
|
|
||||||
if output is None:
|
if output is None:
|
||||||
click.echo(dump)
|
click.echo(dump)
|
||||||
|
|||||||
Reference in New Issue
Block a user