void BuiltinSymbols::ImportExtMethods(AnalysisResultPtr ar, FunctionScopePtrVec &vec, ClassInfo *cls) { const ClassInfo::MethodVec &methods = cls->getMethodsVec(); for (auto it = methods.begin(); it != methods.end(); ++it) { FunctionScopePtr f = ImportFunctionScopePtr(ar, cls, *it); vec.push_back(f); } }
void FunctionContainer::getFunctionsFlattened( const StringToFunctionScopePtrVecMap *redec, FunctionScopePtrVec &funcs, bool excludePseudoMains /* = false */) const { for (StringToFunctionScopePtrMap::const_iterator it = m_functions.begin(); it != m_functions.end(); ++it) { FunctionScopePtr func = it->second; if (!excludePseudoMains || !func->inPseudoMain()) { if (func->isLocalRedeclaring()) { const FunctionScopePtrVec &r = redec->find(it->first)->second; funcs.insert(funcs.end(), r.begin(), r.end()); } else { funcs.push_back(func); } } } }
void BuiltinSymbols::ParseExtClasses(AnalysisResultPtr ar, const char **p, bool sep) { while (*p) { // Parse name const char *cname = *p++; // Parse parent const char *cparent = *p++; if (!cparent) cparent = ""; // Parse list of interfaces vector<string> ifaces; while (*p) ifaces.push_back(*p++); p++; // Parse methods FunctionScopePtrVec methods; while (*p) { FunctionScopePtr fs = ParseExtFunction(ar, p, true); if (sep) { fs->setSepExtension(); } int flags = (int)(int64)(*p++); if (flags & ClassInfo::IsAbstract) { fs->addModifier(T_ABSTRACT); } int vismod = 0; if (flags & ClassInfo::IsProtected) { vismod = T_PROTECTED; } else if (flags & ClassInfo::IsPrivate) { vismod = T_PRIVATE; } fs->addModifier(vismod); if (flags & ClassInfo::IsStatic) { fs->addModifier(T_STATIC); } methods.push_back(fs); } if (cparent && *cparent && (ifaces.empty() || ifaces[0] != cparent)) { ifaces.insert(ifaces.begin(), cparent); } ClassScopePtr cl(new ClassScope(ar, cname, cparent, ifaces, methods)); for (uint i = 0; i < methods.size(); ++i) { methods[i]->setOuterScope(cl); } p++; // Parse properties while (*p) { int flags = (int)(int64)(*p++); ModifierExpressionPtr modifiers( new ModifierExpression(BlockScopePtr(), LocationPtr())); if (flags & ClassInfo::IsProtected) { modifiers->add(T_PROTECTED); } else if (flags & ClassInfo::IsPrivate) { modifiers->add(T_PRIVATE); } if (flags & ClassInfo::IsStatic) { modifiers->add(T_STATIC); } const char *name = *p++; TypePtr type = ParseType(p); cl->getVariables()->add(name, type, false, ar, ExpressionPtr(), modifiers); } p++; // Parse consts while (*p) { const char *name = *p++; TypePtr type = ParseType(p); cl->getConstants()->add(name, type, ExpressionPtr(), ar, ConstructPtr()); } p++; int flags = (int)(int64)(*p++); cl->setClassInfoAttribute(flags); if (flags & ClassInfo::HasDocComment) { cl->setDocComment(*p++); } cl->setSystem(); if (sep) { cl->setSepExtension(); } s_classes[cl->getName()] = cl; } }