| 1 | import ast
|
| 2 | from ast import AST, stmt
|
| 3 | import os
|
| 4 |
|
| 5 | from pea.header import TypeSyntaxError, Program, PyFile
|
| 6 |
|
| 7 |
|
| 8 | def ParseFuncType(st: stmt) -> AST:
|
| 9 | # 2024-12: causes an error with the latest MyPy, 1.13.0
|
| 10 | # works with Soil CI MyPy, 1.10.0
|
| 11 | #assert st.type_comment, st
|
| 12 |
|
| 13 | # Caller checks this. Is there a better way?
|
| 14 | assert hasattr(st, 'type_comment'), st
|
| 15 |
|
| 16 | try:
|
| 17 | # This parses with the func_type production in the grammar
|
| 18 | return ast.parse(st.type_comment, mode='func_type')
|
| 19 | except SyntaxError:
|
| 20 | raise TypeSyntaxError(st.lineno, st.type_comment)
|
| 21 |
|
| 22 |
|
| 23 | def ParseFiles(files: list[str], prog: Program) -> bool:
|
| 24 |
|
| 25 | for filename in files:
|
| 26 | with open(filename) as f:
|
| 27 | contents = f.read()
|
| 28 |
|
| 29 | try:
|
| 30 | # Python 3.8+ supports type_comments=True
|
| 31 | module = ast.parse(contents, filename=filename, type_comments=True)
|
| 32 | except SyntaxError as e:
|
| 33 | # This raises an exception for some reason
|
| 34 | #e.print_file_and_line()
|
| 35 | print('Error parsing %s: %s' % (filename, e))
|
| 36 | return False
|
| 37 |
|
| 38 | tmp = os.path.basename(filename)
|
| 39 | namespace, _ = os.path.splitext(tmp)
|
| 40 |
|
| 41 | prog.py_files.append(PyFile(filename, namespace, module))
|
| 42 |
|
| 43 | prog.stats['num_files'] += 1
|
| 44 |
|
| 45 | return True
|