/* * If the object expression is query local, that is, if it is a simple variable * referring to a name declared in a query clause, or itself a query local * object expression, then if keep this expression as is. If not, then * rewrite this expression into a query parameter reference. */ ExpressionPtr CaptureExtractor::rewriteObjectProperty( ObjectPropertyExpressionPtr ope) { assert(ope != nullptr); auto obj = ope->getObject(); if (this->dependsOnQueryOnlyState(obj)) { auto prop = ope->getProperty(); if (prop->getKindOf() == Expression::KindOfScalarExpression) { auto scalar = static_pointer_cast<ScalarExpression>(prop); const string &propName = scalar->getLiteralString(); if (!propName.empty()) { return ope; } } } return newQueryParamRef(ope); }
void Parser::appendMethodParams(Token ¶ms) { if (params.num == 1) { ObjectPropertyExpressionPtr prop = (m_objects.back())-> cast<ObjectPropertyExpression>(); if (prop) { ObjectMethodExpressionPtr method = NEW_EXP(ObjectMethod, prop->getObject(), prop->getProperty(), params->exprs()); m_objects.back() = method; } else { m_objects.back() = NEW_EXP(SimpleFunctionCall, Name::fromExp(this, m_objects.back()), params->exprs()); } } }
void Parser::appendMethodParams(Token ¶ms) { if (params.num() == 1) { ExpressionPtr &out = m_objects.back(); ObjectPropertyExpressionPtr prop = out->unsafe_cast<ObjectPropertyExpression>(); TempExpressionListPtr texp = out->unsafe_cast<TempExpressionList>(); if (!prop && texp) { prop = texp->getLast()->unsafe_cast<ObjectPropertyExpression>(); } if (prop) { out = NEW_EXP(ObjectMethod, prop->getObject(), prop->getProperty(), params->exprs()); if (texp) { texp->setLast(out); out = texp; } } else { out = NEW_EXP(SimpleFunctionCall, Name::fromExp(this, out), params->exprs()); } } }
void Parser::appendMethodParams(Token *params) { ExpressionListPtr paramsExp; if (params) { if (params->exp) { paramsExp = dynamic_pointer_cast<ExpressionList>(params->exp); } else if (params->num == 1) { paramsExp = NEW_EXP0(ExpressionList); } } if (paramsExp) { ObjectPropertyExpressionPtr prop = dynamic_pointer_cast<ObjectPropertyExpression>(m_objects.back()); if (prop) { ObjectMethodExpressionPtr method = NEW_EXP(ObjectMethodExpression, prop->getObject(), prop->getProperty(), paramsExp); m_objects.back() = method; } else { m_objects.back() = NEW_EXP(DynamicFunctionCall, m_objects.back(), paramsExp, NULL); } } }