diff --git a/src/ast_util.py b/src/ast_util.py index a393f18..5cad594 100644 --- a/src/ast_util.py +++ b/src/ast_util.py @@ -6,7 +6,8 @@ from random import Random import re from typing import Any, Callable, Dict, List, Optional, Set, Tuple, TYPE_CHECKING, Union -from pycparser import CParser, c_ast as ca, c_generator +from pycparser import c_ast as ca, c_generator +from pycparser.c_parser import CParser from pycparser.plyparser import ParseError from .error import CandidateConstructionFailure diff --git a/stubs/pycparser/__init__.py b/stubs/pycparser/__init__.py deleted file mode 100644 index 06e6865..0000000 --- a/stubs/pycparser/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -#----------------------------------------------------------------- -# pycparser: __init__.py -# -# This package file exports some convenience functions for -# interacting with pycparser -# -# Eli Bendersky [https://eli.thegreenplace.net/] -# License: BSD -#----------------------------------------------------------------- -__all__ = ['c_parser', 'c_ast'] -__version__ = '2.19' - -from typing import Any, List, Union -from . import c_ast -from .c_parser import CParser - -def preprocess_file(filename: str, cpp_path: str='cpp', cpp_args: Union[List[str], str]='') -> str: ... -def parse_file(filename: str, use_cpp: bool=False, cpp_path: str='cpp', cpp_args: str='', parser: Any=None) -> c_ast.FileAST: ... diff --git a/stubs/pycparser/__init__.pyi b/stubs/pycparser/__init__.pyi new file mode 100644 index 0000000..c83af03 --- /dev/null +++ b/stubs/pycparser/__init__.pyi @@ -0,0 +1,26 @@ +# ----------------------------------------------------------------- +# pycparser: __init__.py +# +# This package file exports some convenience functions for +# interacting with pycparser +# +# Eli Bendersky [https://eli.thegreenplace.net/] +# License: BSD +# ----------------------------------------------------------------- +__all__ = ["c_parser", "c_ast"] +__version__ = "2.19" + +from typing import Any, List, Optional, Union +from . import c_ast +from .c_parser import CParser + +def preprocess_file( + filename: str, cpp_path: str = "cpp", cpp_args: Union[List[str], str] = "" +) -> str: ... +def parse_file( + filename: str, + use_cpp: bool = False, + cpp_path: str = "cpp", + cpp_args: str = "", + parser: Optional[CParser] = None, +) -> c_ast.FileAST: ... diff --git a/stubs/pycparser/c_ast.py b/stubs/pycparser/c_ast.pyi similarity index 68% rename from stubs/pycparser/c_ast.py rename to stubs/pycparser/c_ast.pyi index a03f62c..570c978 100644 --- a/stubs/pycparser/c_ast.py +++ b/stubs/pycparser/c_ast.pyi @@ -7,24 +7,16 @@ # License: BSD # ----------------------------------------------------------------- - from typing import TextIO, Iterable, List, Any, Optional, Union as Union_ from .plyparser import Coord import sys - class Node(object): coord: Optional[Coord] - def __repr__(self) -> str: - ... - - def __iter__(self) -> Iterable[Node]: - ... - - def children(self) -> Iterable[Node]: - ... - + def __repr__(self) -> str: ... + def __iter__(self) -> Iterable[Node]: ... + def children(self) -> Iterable[Node]: ... def show( self, buf: TextIO = sys.stdout, @@ -32,9 +24,7 @@ class Node(object): attrnames: bool = False, nodenames: bool = False, showcoord: bool = False, - ) -> None: - ... - + ) -> None: ... Expression = Union_[ "ArrayRef", @@ -89,158 +79,57 @@ AnyNode = Union_[ "Typename", ] - class NodeVisitor: - def visit(self, node: Node) -> None: - ... - - def generic_visit(self, node: Node) -> None: - ... - - def visit_Alignas(self, node: Alignas) -> None: - ... - - def visit_ArrayDecl(self, node: ArrayDecl) -> None: - ... - - def visit_ArrayRef(self, node: ArrayRef) -> None: - ... - - def visit_Assignment(self, node: Assignment) -> None: - ... - - def visit_BinaryOp(self, node: BinaryOp) -> None: - ... - - def visit_Break(self, node: Break) -> None: - ... - - def visit_Case(self, node: Case) -> None: - ... - - def visit_Cast(self, node: Cast) -> None: - ... - - def visit_Compound(self, node: Compound) -> None: - ... - - def visit_CompoundLiteral(self, node: CompoundLiteral) -> None: - ... - - def visit_Constant(self, node: Constant) -> None: - ... - - def visit_Continue(self, node: Continue) -> None: - ... - - def visit_Decl(self, node: Decl) -> None: - ... - - def visit_DeclList(self, node: DeclList) -> None: - ... - - def visit_Default(self, node: Default) -> None: - ... - - def visit_DoWhile(self, node: DoWhile) -> None: - ... - - def visit_EllipsisParam(self, node: EllipsisParam) -> None: - ... - - def visit_EmptyStatement(self, node: EmptyStatement) -> None: - ... - - def visit_Enum(self, node: Enum) -> None: - ... - - def visit_Enumerator(self, node: Enumerator) -> None: - ... - - def visit_EnumeratorList(self, node: EnumeratorList) -> None: - ... - - def visit_ExprList(self, node: ExprList) -> None: - ... - - def visit_FileAST(self, node: FileAST) -> None: - ... - - def visit_For(self, node: For) -> None: - ... - - def visit_FuncCall(self, node: FuncCall) -> None: - ... - - def visit_FuncDecl(self, node: FuncDecl) -> None: - ... - - def visit_FuncDef(self, node: FuncDef) -> None: - ... - - def visit_Goto(self, node: Goto) -> None: - ... - - def visit_ID(self, node: ID) -> None: - ... - - def visit_IdentifierType(self, node: IdentifierType) -> None: - ... - - def visit_If(self, node: If) -> None: - ... - - def visit_InitList(self, node: InitList) -> None: - ... - - def visit_Label(self, node: Label) -> None: - ... - - def visit_NamedInitializer(self, node: NamedInitializer) -> None: - ... - - def visit_ParamList(self, node: ParamList) -> None: - ... - - def visit_PtrDecl(self, node: PtrDecl) -> None: - ... - - def visit_Return(self, node: Return) -> None: - ... - - def visit_Struct(self, node: Struct) -> None: - ... - - def visit_StructRef(self, node: StructRef) -> None: - ... - - def visit_Switch(self, node: Switch) -> None: - ... - - def visit_TernaryOp(self, node: TernaryOp) -> None: - ... - - def visit_TypeDecl(self, node: TypeDecl) -> None: - ... - - def visit_Typedef(self, node: Typedef) -> None: - ... - - def visit_Typename(self, node: Typename) -> None: - ... - - def visit_UnaryOp(self, node: UnaryOp) -> None: - ... - - def visit_Union(self, node: Union) -> None: - ... - - def visit_While(self, node: While) -> None: - ... - - def visit_Pragma(self, node: Pragma) -> None: - ... - + def visit(self, node: Node) -> None: ... + def generic_visit(self, node: Node) -> None: ... + def visit_Alignas(self, node: Alignas) -> None: ... + def visit_ArrayDecl(self, node: ArrayDecl) -> None: ... + def visit_ArrayRef(self, node: ArrayRef) -> None: ... + def visit_Assignment(self, node: Assignment) -> None: ... + def visit_BinaryOp(self, node: BinaryOp) -> None: ... + def visit_Break(self, node: Break) -> None: ... + def visit_Case(self, node: Case) -> None: ... + def visit_Cast(self, node: Cast) -> None: ... + def visit_Compound(self, node: Compound) -> None: ... + def visit_CompoundLiteral(self, node: CompoundLiteral) -> None: ... + def visit_Constant(self, node: Constant) -> None: ... + def visit_Continue(self, node: Continue) -> None: ... + def visit_Decl(self, node: Decl) -> None: ... + def visit_DeclList(self, node: DeclList) -> None: ... + def visit_Default(self, node: Default) -> None: ... + def visit_DoWhile(self, node: DoWhile) -> None: ... + def visit_EllipsisParam(self, node: EllipsisParam) -> None: ... + def visit_EmptyStatement(self, node: EmptyStatement) -> None: ... + def visit_Enum(self, node: Enum) -> None: ... + def visit_Enumerator(self, node: Enumerator) -> None: ... + def visit_EnumeratorList(self, node: EnumeratorList) -> None: ... + def visit_ExprList(self, node: ExprList) -> None: ... + def visit_FileAST(self, node: FileAST) -> None: ... + def visit_For(self, node: For) -> None: ... + def visit_FuncCall(self, node: FuncCall) -> None: ... + def visit_FuncDecl(self, node: FuncDecl) -> None: ... + def visit_FuncDef(self, node: FuncDef) -> None: ... + def visit_Goto(self, node: Goto) -> None: ... + def visit_ID(self, node: ID) -> None: ... + def visit_IdentifierType(self, node: IdentifierType) -> None: ... + def visit_If(self, node: If) -> None: ... + def visit_InitList(self, node: InitList) -> None: ... + def visit_Label(self, node: Label) -> None: ... + def visit_NamedInitializer(self, node: NamedInitializer) -> None: ... + def visit_ParamList(self, node: ParamList) -> None: ... + def visit_PtrDecl(self, node: PtrDecl) -> None: ... + def visit_Return(self, node: Return) -> None: ... + def visit_Struct(self, node: Struct) -> None: ... + def visit_StructRef(self, node: StructRef) -> None: ... + def visit_Switch(self, node: Switch) -> None: ... + def visit_TernaryOp(self, node: TernaryOp) -> None: ... + def visit_TypeDecl(self, node: TypeDecl) -> None: ... + def visit_Typedef(self, node: Typedef) -> None: ... + def visit_Typename(self, node: Typename) -> None: ... + def visit_UnaryOp(self, node: UnaryOp) -> None: ... + def visit_Union(self, node: Union) -> None: ... + def visit_While(self, node: While) -> None: ... + def visit_Pragma(self, node: Pragma) -> None: ... class Alignas(Node): alignment: Union_[Expression, Typename] @@ -250,9 +139,7 @@ class Alignas(Node): self, alignment: Union_[Expression, Typename], coord: Optional[Coord] = None, - ): - ... - + ): ... class ArrayDecl(Node): type: Type @@ -265,17 +152,13 @@ class ArrayDecl(Node): dim: Optional[Node], dim_quals: List[str], coord: Optional[Coord] = None, - ): - ... - + ): ... class ArrayRef(Node): name: Expression subscript: Expression - def __init__(self, name: Node, subscript: Node, coord: Optional[Coord] = None): - ... - + def __init__(self, name: Node, subscript: Node, coord: Optional[Coord] = None): ... class Assignment(Node): op: str @@ -288,23 +171,19 @@ class Assignment(Node): lvalue: Expression, rvalue: Expression, coord: Optional[Coord] = None, - ): - ... - + ): ... class BinaryOp(Node): op: str left: Expression right: Expression - def __init__(self, op: str, left: Node, right: Node, coord: Optional[Coord] = None): - ... - + def __init__( + self, op: str, left: Node, right: Node, coord: Optional[Coord] = None + ): ... class Break(Node): - def __init__(self, coord: Optional[Coord] = None): - ... - + def __init__(self, coord: Optional[Coord] = None): ... class Case(Node): expr: Expression @@ -312,9 +191,7 @@ class Case(Node): def __init__( self, expr: Expression, stmts: List[Statement], coord: Optional[Coord] = None - ): - ... - + ): ... class Cast(Node): to_type: "Typename" @@ -322,18 +199,14 @@ class Cast(Node): def __init__( self, to_type: "Typename", expr: Expression, coord: Optional[Coord] = None - ): - ... - + ): ... class Compound(Node): block_items: Optional[List[Statement]] def __init__( self, block_items: Optional[List[Statement]], coord: Optional[Coord] = None - ): - ... - + ): ... class CompoundLiteral(Node): type: "Typename" @@ -341,22 +214,16 @@ class CompoundLiteral(Node): def __init__( self, type: "Typename", init: "InitList", coord: Optional[Coord] = None - ): - ... - + ): ... class Constant(Node): type: str value: str - def __init__(self, type: str, value: str, coord: Optional[Coord] = None): - ... - + def __init__(self, type: str, value: str, coord: Optional[Coord] = None): ... class Continue(Node): - def __init__(self, coord: Optional[Coord] = None): - ... - + def __init__(self, coord: Optional[Coord] = None): ... class Decl(Node): name: Optional[str] @@ -364,7 +231,7 @@ class Decl(Node): align: List[Alignas] storage: List[str] # e.g. register funcspec: List[str] # e.g. inline - type: Union_[Type, "Struct", "Union", "Enum"] + type: Union_[Type, "Struct", "Enum", "Union"] init: Optional[Union_[Expression, "InitList"]] bitsize: Optional[Expression] @@ -375,27 +242,21 @@ class Decl(Node): align: List[Alignas], storage: List[str], funcspec: List[str], - type: Union_[Type, "Struct", "Union", "Enum"], + type: Union_[Type, "Struct", "Enum", "Union"], init: Optional[Union_[Expression, "InitList"]], bitsize: Optional[Expression], coord: Optional[Coord] = None, - ): - ... - + ): ... class DeclList(Node): decls: List[Decl] - def __init__(self, decls: List[Decl], coord: Optional[Coord] = None): - ... - + def __init__(self, decls: List[Decl], coord: Optional[Coord] = None): ... class Default(Node): stmts: List[Statement] - def __init__(self, stmts: List[Statement], coord: Optional[Coord] = None): - ... - + def __init__(self, stmts: List[Statement], coord: Optional[Coord] = None): ... class DoWhile(Node): cond: Expression @@ -403,19 +264,13 @@ class DoWhile(Node): def __init__( self, cond: Expression, stmt: Statement, coord: Optional[Coord] = None - ): - ... - + ): ... class EllipsisParam(Node): - def __init__(self, coord: Optional[Coord] = None): - ... - + def __init__(self, coord: Optional[Coord] = None): ... class EmptyStatement(Node): - def __init__(self, coord: Optional[Coord] = None): - ... - + def __init__(self, coord: Optional[Coord] = None): ... class Enum(Node): name: Optional[str] @@ -426,9 +281,7 @@ class Enum(Node): name: Optional[str], values: "Optional[EnumeratorList]", coord: Optional[Coord] = None, - ): - ... - + ): ... class Enumerator(Node): name: str @@ -436,32 +289,28 @@ class Enumerator(Node): def __init__( self, name: str, value: Optional[Expression], coord: Optional[Coord] = None - ): - ... - + ): ... class EnumeratorList(Node): enumerators: List[Enumerator] - def __init__(self, enumerators: List[Enumerator], coord: Optional[Coord] = None): - ... - + def __init__( + self, enumerators: List[Enumerator], coord: Optional[Coord] = None + ): ... class ExprList(Node): exprs: List[Union_[Expression, Typename]] # typename only for offsetof def __init__( self, exprs: List[Union_[Expression, Typename]], coord: Optional[Coord] = None - ): - ... - + ): ... class FileAST(Node): ext: List[ExternalDeclaration] - def __init__(self, ext: List[ExternalDeclaration], coord: Optional[Coord] = None): - ... - + def __init__( + self, ext: List[ExternalDeclaration], coord: Optional[Coord] = None + ): ... class For(Node): init: Union_[None, Expression, DeclList] @@ -476,9 +325,7 @@ class For(Node): next: Optional[Expression], stmt: Statement, coord: Optional[Coord] = None, - ): - ... - + ): ... class FuncCall(Node): name: Expression @@ -486,9 +333,7 @@ class FuncCall(Node): def __init__( self, name: Expression, args: Optional[ExprList], coord: Optional[Coord] = None - ): - ... - + ): ... class FuncDecl(Node): args: Optional[ParamList] @@ -496,9 +341,7 @@ class FuncDecl(Node): def __init__( self, args: Optional[ParamList], type: Type, coord: Optional[Coord] = None - ): - ... - + ): ... class FuncDef(Node): decl: Decl @@ -511,30 +354,22 @@ class FuncDef(Node): param_decls: Optional[List[Decl]], body: Compound, coord: Optional[Coord] = None, - ): - ... - + ): ... class Goto(Node): name: str - def __init__(self, name: str, coord: Optional[Coord] = None): - ... - + def __init__(self, name: str, coord: Optional[Coord] = None): ... class ID(Node): name: str - def __init__(self, name: str, coord: Optional[Coord] = None): - ... - + def __init__(self, name: str, coord: Optional[Coord] = None): ... class IdentifierType(Node): names: List[str] # e.g. ['long', 'int'] - def __init__(self, names: List[str], coord: Optional[Coord] = None): - ... - + def __init__(self, names: List[str], coord: Optional[Coord] = None): ... class If(Node): cond: Expression @@ -547,9 +382,7 @@ class If(Node): iftrue: Statement, iffalse: Optional[Statement], coord: Optional[Coord] = None, - ): - ... - + ): ... class InitList(Node): exprs: List[Union_[Expression, "NamedInitializer"]] @@ -558,17 +391,13 @@ class InitList(Node): self, exprs: List[Union_[Expression, "NamedInitializer"]], coord: Optional[Coord] = None, - ): - ... - + ): ... class Label(Node): name: str stmt: Statement - def __init__(self, name: str, stmt: Statement, coord: Optional[Coord] = None): - ... - + def __init__(self, name: str, stmt: Statement, coord: Optional[Coord] = None): ... class NamedInitializer(Node): name: List[Expression] # [ID(x), Constant(4)] for {.x[4] = ...} @@ -576,9 +405,7 @@ class NamedInitializer(Node): def __init__( self, name: List[Expression], expr: Expression, coord: Optional[Coord] = None - ): - ... - + ): ... class ParamList(Node): params: List[Union_[Decl, ID, Typename, EllipsisParam]] @@ -587,24 +414,18 @@ class ParamList(Node): self, params: List[Union_[Decl, ID, Typename, EllipsisParam]], coord: Optional[Coord] = None, - ): - ... - + ): ... class PtrDecl(Node): quals: List[str] type: Type - def __init__(self, quals: List[str], type: Type, coord: Optional[Coord] = None): - ... - + def __init__(self, quals: List[str], type: Type, coord: Optional[Coord] = None): ... class Return(Node): expr: Optional[Expression] - def __init__(self, expr: Optional[Expression], coord: Optional[Coord] = None): - ... - + def __init__(self, expr: Optional[Expression], coord: Optional[Coord] = None): ... class Struct(Node): name: Optional[str] @@ -615,9 +436,7 @@ class Struct(Node): name: Optional[str], decls: Optional[List[Union_[Decl, Pragma]]], coord: Optional[Coord] = None, - ): - ... - + ): ... class StructRef(Node): name: Expression @@ -626,9 +445,7 @@ class StructRef(Node): def __init__( self, name: Expression, type: str, field: ID, coord: Optional[Coord] = None - ): - ... - + ): ... class Switch(Node): cond: Expression @@ -636,9 +453,7 @@ class Switch(Node): def __init__( self, cond: Expression, stmt: Statement, coord: Optional[Coord] = None - ): - ... - + ): ... class TernaryOp(Node): cond: Expression @@ -651,9 +466,7 @@ class TernaryOp(Node): iftrue: Expression, iffalse: Expression, coord: Optional[Coord] = None, - ): - ... - + ): ... class TypeDecl(Node): declname: Optional[str] @@ -668,9 +481,7 @@ class TypeDecl(Node): align: List[Alignas], type: InnerType, coord: Optional[Coord] = None, - ): - ... - + ): ... class Typedef(Node): name: str @@ -685,9 +496,7 @@ class Typedef(Node): storage: List[str], type: Type, coord: Optional[Coord] = None, - ): - ... - + ): ... class Typename(Node): name: None @@ -702,9 +511,7 @@ class Typename(Node): align: List[Alignas], type: Type, coord: Optional[Coord] = None, - ): - ... - + ): ... class UnaryOp(Node): op: str @@ -712,9 +519,7 @@ class UnaryOp(Node): def __init__( self, op: str, expr: Union_[Expression, Typename], coord: Optional[Coord] = None - ): - ... - + ): ... class Union(Node): name: Optional[str] @@ -725,9 +530,7 @@ class Union(Node): name: Optional[str], decls: Optional[List[Union_[Decl, Pragma]]], coord: Optional[Coord] = None, - ): - ... - + ): ... class While(Node): cond: Expression @@ -735,12 +538,9 @@ class While(Node): def __init__( self, cond: Expression, stmt: Statement, coord: Optional[Coord] = None - ): - ... - + ): ... class Pragma(Node): string: str - def __init__(self, string: str, coord: Optional[Coord] = None): - ... + def __init__(self, string: str, coord: Optional[Coord] = None): ... diff --git a/stubs/pycparser/c_generator.py b/stubs/pycparser/c_generator.pyi similarity index 62% rename from stubs/pycparser/c_generator.py rename to stubs/pycparser/c_generator.pyi index ea3b70d..1a0bbee 100644 --- a/stubs/pycparser/c_generator.py +++ b/stubs/pycparser/c_generator.pyi @@ -1,11 +1,11 @@ -#------------------------------------------------------------------------------ +# ------------------------------------------------------------------------------ # pycparser: c_generator.py # # C code generator from pycparser AST nodes. # # Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD -#------------------------------------------------------------------------------ +# ------------------------------------------------------------------------------ from . import c_ast class CGenerator: diff --git a/stubs/pycparser/c_parser.py b/stubs/pycparser/c_parser.py deleted file mode 100644 index fac2fa8..0000000 --- a/stubs/pycparser/c_parser.py +++ /dev/null @@ -1,15 +0,0 @@ -#------------------------------------------------------------------------------ -# pycparser: c_parser.py -# -# CParser class: Parser and AST builder for the C language -# -# Eli Bendersky [https://eli.thegreenplace.net/] -# License: BSD -#------------------------------------------------------------------------------ - -from . import c_ast - -class CParser: - def __init__(self) -> None: ... - def parse(self, text: str, filename: str='', debuglevel: int=0) -> c_ast.FileAST: ... - diff --git a/stubs/pycparser/c_parser.pyi b/stubs/pycparser/c_parser.pyi new file mode 100644 index 0000000..4617afb --- /dev/null +++ b/stubs/pycparser/c_parser.pyi @@ -0,0 +1,22 @@ +# ------------------------------------------------------------------------------ +# pycparser: c_parser.py +# +# CParser class: Parser and AST builder for the C language +# +# Eli Bendersky [https://eli.thegreenplace.net/] +# License: BSD +# ------------------------------------------------------------------------------ + +from . import c_ast +from typing import Any, Dict, List, Optional + +class CParser: + clex: Any # CLexer + cparser: Any # LRParser + _scope_stack: List[Dict[str, bool]] + _last_yielded_token: Optional[Any] + + def __init__(self) -> None: ... + def parse( + self, text: str, filename: str = "", debuglevel: int = 0 + ) -> c_ast.FileAST: ... diff --git a/stubs/pycparser/plyparser.py b/stubs/pycparser/plyparser.pyi similarity index 87% rename from stubs/pycparser/plyparser.py rename to stubs/pycparser/plyparser.pyi index e63c53e..e11a0fc 100644 --- a/stubs/pycparser/plyparser.py +++ b/stubs/pycparser/plyparser.pyi @@ -10,18 +10,13 @@ from typing import Optional - class Coord: file: str line: int column: Optional[int] - def __init__(self, file: str, line: int, column: Optional[int] = None): - ... - - def __str__(self) -> str: - ... - + def __init__(self, file: str, line: int, column: Optional[int] = None): ... + def __str__(self) -> str: ... class ParseError(Exception): pass