| 1 | #!/usr/bin/env python3
|
| 2 | """
|
| 3 | mypy_shim.py
|
| 4 |
|
| 5 | Convert stdlib ast nodes into MyPy nodes
|
| 6 | """
|
| 7 |
|
| 8 | import os
|
| 9 |
|
| 10 | from typing import Any
|
| 11 |
|
| 12 | from mypy.nodes import (MypyFile, FuncDef, Argument, ReturnStmt, IntExpr,
|
| 13 | Statement, Block, Var, ARG_POS)
|
| 14 |
|
| 15 | from mypy.types import Type, CallableType
|
| 16 |
|
| 17 | from mycpp.conversion_pass import Primitive
|
| 18 |
|
| 19 | from pea import header
|
| 20 | from pea.header import log
|
| 21 | from pea import parse
|
| 22 |
|
| 23 |
|
| 24 | def CreateMyPyFile(path: str) -> MypyFile:
|
| 25 | """
|
| 26 | Hacky function create MyPy AST!
|
| 27 |
|
| 28 | Works for a trivial function
|
| 29 | """
|
| 30 | defs: list[Statement] = []
|
| 31 | stub = MypyFile(defs, [])
|
| 32 |
|
| 33 | func_name = 'main'
|
| 34 |
|
| 35 | v = Var('argv')
|
| 36 | s = ret_type = Primitive('builtins.str')
|
| 37 | type_annotation = Primitive('builtins.list', args=[s])
|
| 38 | initializer = None
|
| 39 | kind = ARG_POS
|
| 40 |
|
| 41 | arguments = [Argument(v, type_annotation, initializer, kind)]
|
| 42 | body = Block([ReturnStmt(IntExpr(42))])
|
| 43 |
|
| 44 | # Why are types duplicated?
|
| 45 | arg_types: list[Type] = [type_annotation]
|
| 46 | arg_kinds: list[Any] = [ARG_POS]
|
| 47 | arg_names: list[str] = ['argv']
|
| 48 | ret_type = Primitive('builtins.int')
|
| 49 | fallback = Primitive('??? fallback') # WHAT is this for?
|
| 50 | func_type = CallableType(arg_types, arg_kinds, arg_names, ret_type,
|
| 51 | fallback)
|
| 52 |
|
| 53 | func = FuncDef(func_name, arguments, body, typ=func_type)
|
| 54 | func._fullname = func_name
|
| 55 |
|
| 56 | #_ = func
|
| 57 | defs.append(func)
|
| 58 |
|
| 59 | # fullname is a property, backed by _fullname
|
| 60 | #
|
| 61 | # mycpp/examples/pea_hello.py -> mycpp
|
| 62 |
|
| 63 | name = os.path.basename(path)
|
| 64 | mod_name, _ = os.path.splitext(name)
|
| 65 |
|
| 66 | stub._fullname = mod_name
|
| 67 |
|
| 68 | prog = header.Program()
|
| 69 | log('Pea begin')
|
| 70 |
|
| 71 | if not parse.ParseFiles([path], prog):
|
| 72 | raise AssertionError()
|
| 73 |
|
| 74 | prog.PrintStats()
|
| 75 | log('prog %s', prog)
|
| 76 |
|
| 77 | return stub
|