15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.Compiler.Visitor import VisitorTransform
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.Compiler.Nodes import StatListNode
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ExtractPxdCode(VisitorTransform):
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Finds nodes in a pxd file that should generate code, and
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    returns them in a StatListNode.
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    The result is a tuple (StatListNode, ModuleScope), i.e.
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    everything that is needed from the pxd after it is processed.
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    A purer approach would be to seperately compile the pxd code,
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    but the result would have to be slightly more sophisticated
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    than pure strings (functions + wanted interned strings +
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    wanted utility code + wanted cached objects) so for now this
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    approach is taken.
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def __call__(self, root):
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.funcs = []
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.visitchildren(root)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return (StatListNode(root.pos, stats=self.funcs), root.scope)
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def visit_FuncDefNode(self, node):
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.funcs.append(node)
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        # Do not visit children, nested funcdefnodes will
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        # also be moved by this action...
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return node
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def visit_Node(self, node):
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.visitchildren(node)
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return node
33