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