def _scan_type_forward_decl(type_, has_seen):
    '''Scan type for forward declarations.'''
    if type_.is_user_defined_type():
        tree = type_.get_declaration()
        if tree.is_user_defined_type_decl() and tree not in has_seen:
            tree.annotate(annotations.FORWARD_DECLARATION, True)
        return

    stripped_type = strip_type(type_)
    if stripped_type:
        _scan_type_forward_decl(stripped_type, has_seen)
def _scan_tree(tree, root):
    '''Scan this tree for __va_list_tag.'''
    if not tree.get_annotation(annotations.REQUIRED, False):
        return
    type_ = tree.type
    while True:
        if tree.name == '__va_list_tag':
            root.annotate(annotations.USE_VA_LIST_TAG, tree)
            raise StopIteration()  # Return from deeply recursion
        while True:
            type_ = strip_type(type_)
            if not type_:
                return
            if type_.is_user_defined_type():
                tree = type_.get_declaration()
                break
def _scan_tree(tree, root):
    '''Scan this tree for __va_list_tag.'''
    if not tree.get_annotation(annotations.REQUIRED, False):
        return
    type_ = tree.type
    while True:
        if tree.name == '__va_list_tag':
            root.annotate(annotations.USE_VA_LIST_TAG, tree)
            raise StopIteration()  # Return from deeply recursion
        while True:
            type_ = strip_type(type_)
            if not type_:
                return
            if type_.is_user_defined_type():
                tree = type_.get_declaration()
                break
def _scan_type_definition(type_, todo, visited):
    """Scan type definition."""
    if type_.is_user_defined_type():
        tree = type_.get_declaration()
        if not tree.is_user_defined_type_decl():
            return
        if tree in visited:
            return
        todo.append(tree)
        visited.add(tree)
        for field in tree.get_field_declaration():
            _scan_type_definition(field.type, todo, visited)
        return

    stripped_type = strip_type(type_)
    if stripped_type:
        _scan_type_definition(stripped_type, todo, visited)
def _scan_type_definition(type_, todo, visited):
    '''Scan type definition.'''
    if type_.is_user_defined_type():
        tree = type_.get_declaration()
        if not tree.is_user_defined_type_decl():
            return
        if tree in visited:
            return
        todo.append(tree)
        visited.add(tree)
        for field in tree.get_field_declaration():
            _scan_type_definition(field.type, todo, visited)
        return

    stripped_type = strip_type(type_)
    if stripped_type:
        _scan_type_definition(stripped_type, todo, visited)