bool ExpressionList::flattenLiteralStrings(vector<ExpressionPtr> &literals) const { for (unsigned i = 0; i < m_exps.size(); i++) { ExpressionPtr e = m_exps[i]; if (e->is(Expression::KindOfArrayPairExpression)) { ArrayPairExpressionPtr ap = dynamic_pointer_cast<ArrayPairExpression>(e); if (ap->getName()) return false; e = ap->getValue(); } if (e->is(Expression::KindOfUnaryOpExpression)) { UnaryOpExpressionPtr unary = dynamic_pointer_cast<UnaryOpExpression>(e); if (unary->getOp() == T_ARRAY) { ExpressionListPtr el = dynamic_pointer_cast<ExpressionList>(unary->getExpression()); if (!el->flattenLiteralStrings(literals)) { return false; } } } else if (e->isLiteralString()) { literals.push_back(e); } else { return false; } } return true; }