FunctionScopePtr FileScope::createPseudoMain(AnalysisResultConstPtr ar) { StatementListPtr st = m_tree; auto labelScope = std::make_shared<LabelScope>(); auto f = std::make_shared<FunctionStatement>( BlockScopePtr(), labelScope, Location::Range(), ModifierExpressionPtr(), false, pseudoMainName(), ExpressionListPtr(), TypeAnnotationPtr(), st, 0, "", ExpressionListPtr()); f->setFileLevel(); auto pseudoMain = std::make_shared<HPHP::FunctionScope>( ar, true, pseudoMainName().c_str(), f, false, 0, 0, ModifierExpressionPtr(), m_attributes[0], "", shared_from_this(), vector<UserAttributePtr>(), true); f->setBlockScope(pseudoMain); auto& fs = m_functions[pseudoMainName()]; always_assert(!fs); fs = pseudoMain; m_pseudoMain = pseudoMain; return pseudoMain; }
TypeAnnotation::TypeAnnotation(const std::string &name, TypeAnnotationPtr typeArgs) : m_name(name), m_typeArgs(typeArgs), m_typeList(TypeAnnotationPtr()), m_nullable(false), m_soft(false), m_tuple(false), m_function(false), m_xhp(false), m_typevar(false) {}
void ClosureExpression::setCaptureList( AnalysisResultConstRawPtr ar, const std::set<std::string>& captureNames) { assert(m_captureState == CaptureState::Unknown); m_captureState = CaptureState::Known; bool usedThis = false; SCOPE_EXIT { /* * TODO: closures in a non-class scope should be neither static * nor non-static, but right now we don't really have this idea. * * This would allow not having to check for a $this or late bound * class in the closure object or on the ActRec when returning * from those closures. * * (We could also mark closures that don't use late static binding * with this flag to avoid checks on closures in member functions * when they use neither $this nor static::) */ if (!usedThis && !m_func->getModifiers()->isStatic()) { m_func->getModifiers()->add(T_STATIC); } }; if (captureNames.empty()) return; m_vars = ExpressionListPtr( new ExpressionList(getScope(), getRange())); for (auto const& name : captureNames) { if (name == "this") { usedThis = true; continue; } auto expr = std::make_shared<ParameterExpression>( BlockScopePtr(getScope()), getRange(), TypeAnnotationPtr(), true /* hhType */, name, ParamMode::In, 0 /* token modifier thing */, ExpressionPtr(), ExpressionPtr() ); m_vars->insertElement(expr); } initializeValuesFromVars(); analyzeVarsForClosure(ar); analyzeVarsForClosureExpression(ar); }
TypeAnnotationPtr TypeAnnotation::getTypeArg(int n) const { int i = 0; TypeAnnotationPtr typeEl = m_typeArgs; while (typeEl) { if (i == n) { return typeEl; } ++i; typeEl = typeEl->m_typeList; } return TypeAnnotationPtr(); }
TypeAnnotation::TypeAnnotation(const std::string &name, TypeAnnotationPtr typeArgs) : m_name(name), m_typeArgs(typeArgs), m_typeList(TypeAnnotationPtr()), m_nullable(false), m_soft(false), m_tuple(false), m_function(false), m_xhp(false), m_typevar(false), m_typeaccess(false), m_shape(false), m_allowsUnknownFields(false), m_clsCnsShapeField(false), m_optionalShapeField(false) { }