예제 #1
0
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);
  }
}
예제 #2
0
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);
      }
    }
  }
}
예제 #3
0
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;
    }
}