예제 #1
0
ClassScopePtr BuiltinSymbols::ImportClassScopePtr(AnalysisResultPtr ar,
                                                  ClassInfo *cls) {
  FunctionScopePtrVec methods;
  ImportExtMethods(ar, methods, cls);

  ClassInfo::InterfaceVec ifaces = cls->getInterfacesVec();
  String parent = cls->getParentClass();
  std::vector<std::string> stdIfaces;
  if (!parent.empty() && (ifaces.empty() || ifaces[0] != parent)) {
    stdIfaces.push_back(parent.data());
  }
  for (auto it = ifaces.begin(); it != ifaces.end(); ++it) {
    stdIfaces.push_back(it->data());
  }

  ClassScopePtr cl(new ClassScope(ar, cls->getName().data(), parent.data(),
                                  stdIfaces, methods));
  for (uint i = 0; i < methods.size(); ++i) {
    methods[i]->setOuterScope(cl);
  }

  ImportExtProperties(ar, cl->getVariables(), cls);
  ImportExtConstants(ar, cl->getConstants(), cls);
  int attrs = cls->getAttribute();
  cl->setClassInfoAttribute(attrs);
  cl->setDocComment(cls->getDocComment());
  cl->setSystem();
  return cl;
}
예제 #2
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;
    }
}