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; } }
void BuiltinSymbols::ParseExtClasses(AnalysisResultPtr ar, const char **p, bool sep) { while (*p) { // Parse name const char *cname = *p++; // Parse parent const char *cparent = *p++; // Parse list of interfaces vector<string> ifaces; while (*p) ifaces.push_back(*p++); p++; // Parse methods vector<FunctionScopePtr> methods; while (*p) { FunctionScopePtr fs = ParseExtFunction(ar, p); if (sep) { fs->setSepExtension(); } bool abstract = (bool)*p++; if (abstract) { fs->addModifier(T_ABSTRACT); } int visibility = (long)*p++; int vismod = 0; if (visibility == 1) { vismod = T_PROTECTED; } else if (visibility == 2) { vismod = T_PRIVATE; } fs->addModifier(vismod); bool stat = (bool)*p++; if (stat) { 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, string(cname), string(cparent), ifaces, methods)); p++; // Parse properties while (*p) { *p++; // TODO, support visibility const char *name = *p++; TypePtr type = ParseType(p); cl->getVariables()->add(name, type, false, ar, ExpressionPtr(), ModifierExpressionPtr()); } p++; // Parse consts while (*p) { const char *name = *p++; TypePtr type = ParseType(p); cl->getConstants()->add(name, type, ExpressionPtr(), ar, ConstructPtr()); } p++; cl->setSystem(); if (sep) { cl->setSepExtension(); } s_classes[cl->getName()] = cl; } }