Exemplo n.º 1
0
void BuiltinSymbols::ParseExtFunctions(AnalysisResultPtr ar, const char **p,
                                       bool sep) {
  while (*p) {
    FunctionScopePtr f = ParseExtFunction(ar, p);
    if (sep) {
      f->setSepExtension();
    }
    assert(!s_functions[f->getName()]);
    s_functions[f->getName()] = f;
  }
}
Exemplo n.º 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;
    }
}
Exemplo n.º 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++;
    // 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;
  }
}