void print_property(Output& out, const PreClass::Prop* prop) { out.fmtln(".property{} {} =", opt_attrs(AttrContext::Prop, prop->attrs()), prop->name()->data()); indented(out, [&] { out.fmtln("{};", member_tv_initializer(prop->val())); }); }
void print_alias(Output& out, const TypeAlias& alias) { auto flags = TypeConstraint::NoFlags; if (alias.nullable) flags = flags | TypeConstraint::Nullable; TypeConstraint constraint(alias.value, flags); out.fmtln(".alias{} {} = <{}>;", opt_attrs(AttrContext::Alias, alias.attrs), (const StringData*)alias.name, type_constraint(constraint)); }
void print_cls(Output& out, const PreClass* cls) { out.indent(); out.fmt(".class{} {}", opt_attrs(AttrContext::Class, cls->attrs()), cls->name()->data()); print_cls_inheritance_list(out, cls); out.fmt(" {{"); out.nl(); indented(out, [&] { print_cls_directives(out, cls); }); out.fmtln("}}"); out.nl(); }
void print_method(Output& out, const Func* func) { auto const finfo = find_func_info(func); out.fmtln(".method{} {}({}) {{", opt_attrs(AttrContext::Func, func->attrs()), func->name()->data(), func_param_list(finfo)); indented(out, [&] { print_func_directives(out, func); print_func_body(out, finfo); }); out.fmtln("}}"); }
void print_cls_used_traits(Output& out, const PreClass* cls) { auto& traits = cls->usedTraits(); if (traits.empty()) return; out.indent(); out.fmt(".use"); for (auto i = uint32_t{0}; i < traits.size(); ++i) { out.fmt(" {}", traits[i].get()); } auto& precRules = cls->traitPrecRules(); auto& aliasRules = cls->traitAliasRules(); if (precRules.empty() && aliasRules.empty()) { out.fmt(";"); out.nl(); return; } out.fmt(" {{"); out.nl(); indented(out, [&] { for (auto& prec : precRules) { out.fmtln("{}::{} insteadof{};", prec.selectedTraitName()->data(), prec.methodName()->data(), [&]() -> std::string { auto ret = std::string{}; for (auto& name : prec.otherTraitNames()) { ret += folly::format(" {}", name.get()).str(); } return ret; }() ); } for (auto& alias : aliasRules) { out.fmtln("{}{} as{}{};", alias.traitName()->empty() ? std::string{} : folly::format("{}::", alias.traitName()).str(), alias.origMethodName()->data(), opt_attrs(AttrContext::TraitImport, alias.modifiers()), alias.newMethodName() != alias.origMethodName() ? std::string(" ") + alias.newMethodName()->data() : std::string{} ); } }); out.fmtln("}}"); }
void print_method(Output& out, const Func* func) { auto const finfo = find_func_info(func); out.fmtln(".method{} {}{}({}){}{{", opt_attrs(AttrContext::Func, func->attrs(), &func->userAttributes()), opt_type_info(func->returnUserType(), func->returnTypeConstraint()), func->name(), func_param_list(finfo), func_flag_list(finfo)); indented(out, [&] { print_func_directives(out, finfo); print_func_body(out, finfo); }); out.fmtln("}}"); }