NamePtr Parser::procStaticClassName(Token &className, bool text) { NamePtr cname; if (text) { if (className.text() == "self") { cname = Name::fromString(this, peekClass()->name(), true); } else if (className.text() == "parent") { cname = Name::fromString(this, peekClass()->parent(), true); } else { cname = Name::fromString(this, className.text()); } cname->setOriginalText(className.text()); } else { cname = className->name(); if (haveClass() && cname->get()) { if (cname->get() == "self") { cname = Name::fromString(this, peekClass()->name(), true); cname->setOriginalText("self"); } else if (cname->get() == "parent") { cname = Name::fromString(this, peekClass()->parent(), true); cname->setOriginalText("parent"); } } } return cname; }
void Parser::appendProperty(Token &prop) { ExpressionPtr &out = m_objects.back(); ExpressionPtr var = out; ExpressionPtr lvar = get_var_expr(var); if (prop->getMode() == Token::SingleName) { NamePtr name = prop->name(); out = NEW_EXP(ObjectProperty, lvar, name); Eval::ExprName *ename = dynamic_cast<Eval::ExprName*>(name.get()); if (ename) { ExpressionPtr nameExp = ename->getExp(); TempExpressionPtr temp = createOffset(var, nameExp); ename->setExp(temp); setOffset(out, var, nameExp); } else if (var->unsafe_cast<TempExpressionList>()) { setOffset(out, var, ExpressionPtr()); } } else { out = NEW_EXP(ObjectProperty, lvar, Name::fromExp(this, createOffset(var, prop->exp()))); setOffset(out, var, prop->exp()); } }
String Expression::getClassName(NamePtr name, VariableEnvironment &env) const { String clsname = name->get(env); if (strcasecmp(clsname.data(), "static") == 0) { if (name->getStatic() != clsname) { raise_error("\"static\" cannot be composed by expression in %s:%d", name->loc()->file, name->loc()->line1); } clsname = FrameInjection::GetStaticClassName(NULL); } return clsname; }
ExpressionPtr SimpleFunctionCallExpression::make(EXPRESSION_ARGS, NamePtr name, const vector<ExpressionPtr> ¶ms, const Parser &p) { String sname = name->get(); if (!sname.isNull()) { if (strcasecmp(sname.data(), "get_class") == 0 && params.size() == 0) { if (p.currentClass()) { return new ScalarExpression(EXPRESSION_PASS, p.currentClass()->name()); } else { return new ScalarExpression(EXPRESSION_PASS, false); } } else if (strcasecmp(sname.data(), "get_parent_class") == 0 && params.size() == 0) { if (p.currentClass() && !p.currentClass()->parent().empty()) { return new ScalarExpression(EXPRESSION_PASS, p.currentClass()->parent()); } else { return new ScalarExpression(EXPRESSION_PASS, false); } } } return new SimpleFunctionCallExpression(EXPRESSION_PASS, name, params); }
StaticMethodExpression:: StaticMethodExpression(EXPRESSION_ARGS, const NamePtr &cname, const NamePtr &name, const vector<ExpressionPtr> ¶ms) : SimpleFunctionCallExpression(EXPRESSION_PASS, name, params), m_cname(cname), m_construct(name->get() == "__construct") {}