static fbstring genDocComment(const PhpFunc& func, const fbstring& classname) { fbstring ret(genDocCommentPreamble(func.getPhpName(), func.getDesc(), func.flags(), classname)); for (auto ¶m : func.params()) { ret += "@" + param.name() + " " + param.getPhpType() + " "; if (param.isRef()) { ret += "(output) "; } ret += param.getDesc() + "\n"; } if (func.numParams() > 0) { ret += "\n"; } auto rko = func.returnKindOf(); if ((rko != KindOfNull) && (rko != KindOfInvalid)) { ret += "@return " + func.returnPhpType() + " "; if (func.isReturnRef()) { ret += "(output) "; } ret += func.returnDesc() + "\n"; } return formatDocComment(ret); }
static void writeFunction(std::ostream& out, const PhpFunc& func) { auto flags = (func.flags() & FUNC_FLAG_MASK) | IsSystem | IsNothing; if (flags & RefVariableArguments) { flags |= VariableArguments; } if (flags & MixedVariableArguments) { flags |= RefVariableArguments | VariableArguments; } if (!func.isMethod() || !(flags & VISIBILITY_MASK)) { flags |= IsPublic; } if (func.isReturnRef()) { flags |= IsReference; } out << " " << castLong(flags, true) << ", \"" << escapeCpp(func.getPhpName()) << "\", " << "\"\", " << castLong(0) << ", " << castLong(0) << ",\n"; out << " \"" << escapeCpp(genDocComment(func, func.className())) << "\",\n"; DataType rko = func.returnKindOf(); if (rko == KindOfAny) { // ClassInfo::MethodInfo expects this for Any/Variant // TODO: Fix that broken assumption rko = KindOfInvalid; } out << " " << castLong(rko, true) << ",\n"; for (auto &p : func.params()) { long attr = IsNothing; DataType ko = p.kindOf(); if (p.isRef()) { // We don't declare param type as KindOfRef // as then the caller will try to cast it as such attr |= IsReference; ko = KindOfAny; } if (ko == KindOfAny) { // TODO: See above ko = KindOfInvalid; } out << " " << castLong(attr, true) << ", " << "\"" << escapeCpp(p.name()) << "\", \"\", " << castLong(ko, true) << ",\n"; auto ser = p.getDefaultSerialized(); auto val = p.getDefaultPhp(); out << " " << "\"" << escapeCpp(ser) << "\", " << castLong(ser.size()) << ", " << "\"" << escapeCpp(val) << "\", " << castLong(val.size()) << ", " << "NULL,\n"; } out << " NULL,\n" << " NULL,\n" << " NULL,\n"; }