void TemplightProtobufWriter::printEntry(const PrintableTemplightEntryBegin& aEntry) { std::string entry_contents; { llvm::raw_string_ostream OS_inner(entry_contents); /* message Begin { required InstantiationKind kind = 1; required string name = 2; required SourceLocation location = 3; optional double time_stamp = 4; optional uint64 memory_usage = 5; optional SourceLocation template_origin = 6; } */ llvm::protobuf::saveVarInt(OS_inner, 1, aEntry.InstantiationKind); // kind llvm::protobuf::saveString(OS_inner, 2, printTemplateName(aEntry.Name)); // name llvm::protobuf::saveString(OS_inner, 3, printEntryLocation(aEntry.FileName, aEntry.Line, aEntry.Column)); // location llvm::protobuf::saveDouble(OS_inner, 4, aEntry.TimeStamp); // time_stamp if ( aEntry.MemoryUsage > 0 ) llvm::protobuf::saveVarInt(OS_inner, 5, aEntry.MemoryUsage); // memory_usage if ( !aEntry.TempOri_FileName.empty() ) llvm::protobuf::saveString(OS_inner, 6, printEntryLocation(aEntry.TempOri_FileName, aEntry.TempOri_Line, aEntry.TempOri_Column)); // template_origin } std::string oneof_contents; { llvm::raw_string_ostream OS_inner(oneof_contents); /* oneof begin_or_end { Begin begin = 1; End end = 2; } */ llvm::protobuf::saveString(OS_inner, 1, entry_contents); // begin } llvm::raw_string_ostream OS(buffer); // repeated TemplightEntry entries = 2; llvm::protobuf::saveString(OS, 2, oneof_contents); }
// Adapted from tools\clang\lib\AST\TemplateBase.cpp TemplateArgument::print void printTemplateArgument(raw_ostream &out, const PrintingPolicy &policy, TemplateArgument const &arg, bool qualifyNames) { switch (arg.getKind()) { case TemplateArgument::Null: out << "(no value)"; break; case TemplateArgument::Type: { PrintingPolicy SubPolicy(policy); SubPolicy.SuppressStrongLifetime = true; arg.getAsType().print(out, SubPolicy); break; } case TemplateArgument::Declaration: { NamedDecl *ND = cast<NamedDecl>(arg.getAsDecl()); out << '&'; if (ND->getDeclName()) { // FIXME: distinguish between pointer and reference args? ND->printQualifiedName(out); } else { out << "(anonymous)"; } break; } case TemplateArgument::NullPtr: out << "nullptr"; break; case TemplateArgument::Template: // Orig: arg.getAsTemplate().print(out, policy); { auto templateName = arg.getAsTemplate(); printTemplateName(out, policy, templateName, qualifyNames); break; } case TemplateArgument::TemplateExpansion: arg.getAsTemplateOrTemplatePattern().print(out, policy); out << "..."; break; case TemplateArgument::Integral: { printIntegral(arg, out, policy); break; } case TemplateArgument::Expression: arg.getAsExpr()->printPretty(out, nullptr, policy); break; case TemplateArgument::Pack: out << "<"; bool First = true; for (const auto &P : arg.pack_elements()) { if (First) First = false; else out << ", "; P.print(policy, out); } out << ">"; break; } }