Example #1
0
 def __init__(self, sym: ast.Identifier, arg_cnt: int) -> None:
     super().__init__(
         0, ast.Qualifier.NONE,
         ast.TemplatedIdentifier(0, '@func', [
             ast.FunctionType(
                 CAnyType.make_symbol(),
                 [ast.VariableDeclaration(CAnyType.make_symbol(), None)] *
                 arg_cnt)
         ]), sym)
     self.declaration_type = ast.DeclarationType.C
Example #2
0
def type_FUNCTIONPROTO(typ: Type) -> ast.Node:
    args: List[ast.VariableDeclaration] = []
    for a in typ.argument_types():
        res: ast.Node = type_to_ehlit(a)
        assert isinstance(res, ast.Symbol)
        args.append(ast.VariableDeclaration(res, None))
    ret_type: ast.Node = type_to_ehlit(typ.get_result())
    assert isinstance(ret_type, ast.Symbol)
    return ast.TemplatedIdentifier(0, '@func',
                                   [ast.FunctionType(ret_type, args)])
Example #3
0
def parse_FUNCTION_DECL(cursor: Cursor) -> ast.Node:
    args: List[ast.VariableDeclaration] = []
    for c in cursor.get_children():
        if c.kind == CursorKind.PARM_DECL:
            typ = type_to_ehlit(c.type)
            assert isinstance(typ, ast.Symbol)
            args.append(
                ast.VariableDeclaration(typ, ast.Identifier(0, c.spelling)))

    ret_type = type_to_ehlit(cursor.type.get_result())
    assert isinstance(ret_type, ast.Symbol)
    return ast.Function(
        0, ast.Qualifier.NONE,
        ast.TemplatedIdentifier(0, '@func', [
            ast.FunctionType(ret_type, args,
                             cursor.type.is_function_variadic())
        ]), ast.Identifier(0, cursor.spelling))
Example #4
0
 def visit_function_prototype(self, node: ParseTreeNode,
                              children: Tuple[ast.Symbol, ast.Identifier,
                                              Tuple[List[ast.VariableDeclaration],
                                                    Optional[ast.Symbol]]]
                              ) -> Tuple[ast.TemplatedIdentifier, ast.Identifier]:
     args: List[ast.VariableDeclaration]
     variadic_type: Optional[ast.Symbol]
     if len(children) == 3:
         args, variadic_type = children[2]
     else:
         args = []
         variadic_type = None
     return ast.TemplatedIdentifier(
         node.position,
         '@func',
         [ast.FunctionType(children[0], args, variadic_type is not None, variadic_type)]
     ), children[1]
Example #5
0
 def visit_destructor(self, node: ParseTreeNode, children: Tuple[str, ast.UnparsedContents]
                      ) -> ast.Dtor:
     qualifiers: ast.Qualifier = ast.Qualifier.NONE
     i: int = 0
     while isinstance(children[i], str):
         if children[i] == 'inline':
             qualifiers |= ast.Qualifier.INLINE
         elif children[i] == 'priv':
             qualifiers |= ast.Qualifier.PRIVATE
         elif children[i] == 'dtor':
             break
         i += 1
     i += 1
     body = None
     if len(children) > i:
         body = children[i]
     typ = ast.TemplatedIdentifier(node.position, '@func', [ast.FunctionType(
         ast.CompoundIdentifier([ast.Identifier(node.position, '@void')]),
         []
     )])
     assert(body is None or isinstance(body, ast.UnparsedContents))
     return ast.Dtor(node.position, qualifiers, typ, body)
Example #6
0
 def visit_constructor(self, node: ParseTreeNode,
                       children: Tuple[str, Tuple[List[ast.VariableDeclaration],
                                                  Optional[ast.Symbol]],
                                       ast.UnparsedContents]
                       ) -> ast.Ctor:
     qualifiers: ast.Qualifier = ast.Qualifier.NONE
     i: int = 0
     while isinstance(children[i], str):
         if children[i] == 'inline':
             qualifiers |= ast.Qualifier.INLINE
         elif children[i] == 'priv':
             qualifiers |= ast.Qualifier.PRIVATE
         elif children[i] == 'ctor':
             break
         i += 1
     i += 1
     args: List[ast.VariableDeclaration]
     variadic_type: Optional[ast.Symbol]
     body = None
     if len(children) < i or isinstance(children[i], ast.UnparsedContents):
         args = []
         variadic_type = None
         if len(children) > i:
             body = children[i]
     else:
         child_i = children[i]
         assert(isinstance(child_i, tuple))
         args, variadic_type = child_i
         if len(children) > i + 1:
             body = children[i + 1]
     typ = ast.TemplatedIdentifier(node.position, '@func', [ast.FunctionType(
         ast.CompoundIdentifier([ast.Identifier(node.position, '@void')]),
         args,
         variadic_type is not None,
         variadic_type
     )])
     assert(body is None or isinstance(body, ast.UnparsedContents))
     return ast.Ctor(node.position, qualifiers, typ, body)
Example #7
0
 def visit_function_type(self, node: ParseTreeNode,
                         children: Tuple[StrMatch, ast.Symbol, Tuple[ast.Symbol, ...]]
                         ) -> ast.TemplatedIdentifier:
     args: List[ast.VariableDeclaration] = []
     variadic: bool = False
     variadic_type: Optional[ast.Symbol] = ast.CompoundIdentifier([ast.Identifier(0, '@any')])
     if len(children) > 2:
         i = 0
         while i < len(children[2]):
             arg = children[2][i]
             if arg == '...':
                 variadic = True
             elif len(children[2]) > i + 1 and children[2][i + 1] == '...':
                 assert isinstance(arg, ast.Symbol)
                 variadic_type = arg
                 variadic = True
             else:
                 args.append(ast.VariableDeclaration(arg, None))
             i += 2
     return ast.TemplatedIdentifier(
         node.position,
         '@func',
         [ast.FunctionType(children[1], args, variadic, variadic_type)]
     )