void walk_ast(ConstructPtr node) { if (!node) return; if (dynamic_pointer_cast<MethodStatement>(node)) { // Don't descend into nested non-closure functions, or functions // in the psuedo-main. return; } if (auto ce = dynamic_pointer_cast<ClosureExpression>(node)) { visit_closure(ce); return; } for (int i = 0; i < node->getKidCount(); ++i) { walk_ast(node->getNthKid(i)); } }
// Returns: whether or not $this is implicitly used in this part of the AST, // e.g. via a call using parent::. bool walk_ast(ConstructPtr node) { if (!node) return false; if (dynamic_pointer_cast<MethodStatement>(node)) { // Don't descend into nested non-closure functions, or functions // in the pseudo-main. return false; } if (auto ce = dynamic_pointer_cast<ClosureExpression>(node)) { return visit_closure(ce); } auto ret = false; if (auto fc = dynamic_pointer_cast<FunctionCall>(node)) { if (fc->isParent()) ret = true; } for (int i = 0; i < node->getKidCount(); ++i) { if (walk_ast(node->getNthKid(i))) ret = true; } return ret; }