29 #define DEBUG_TYPE "detailed-records-backend"
37 class DetailedRecordsEmitter {
42 DetailedRecordsEmitter(
RecordKeeper &RK) : Records(RK) {}
60 printReportHeading(OS);
67 void DetailedRecordsEmitter::printReportHeading(
raw_ostream &OS) {
68 OS <<
formatv(
"DETAILED RECORDS for file {0}\n", Records.getInputFilename());
72 void DetailedRecordsEmitter::printVariables(
raw_ostream &OS) {
73 const auto GlobalList = Records.getGlobals();
74 printSectionHeading(
"Global Variables", GlobalList.size(), OS);
77 for (
const auto &Var : GlobalList) {
78 OS << Var.first <<
" = " << Var.second->getAsString() <<
NL;
84 void DetailedRecordsEmitter::printClasses(
raw_ostream &OS) {
85 const auto &ClassList = Records.getClasses();
86 printSectionHeading(
"Classes", ClassList.size(), OS);
88 for (
const auto &ClassPair : ClassList) {
89 auto *
const Class = ClassPair.second.get();
90 OS <<
formatv(
"\n{0} |{1}|\n",
Class->getNameInitAsString(),
92 printTemplateArgs(Class, OS);
93 printSuperclasses(Class, OS);
94 printFields(Class, OS);
100 void DetailedRecordsEmitter::printRecords(
raw_ostream &OS) {
101 const auto &RecordList = Records.getDefs();
102 printSectionHeading(
"Records", RecordList.size(), OS);
104 for (
const auto &RecPair : RecordList) {
105 auto *
const Rec = RecPair.second.get();
106 std::string
Name = Rec->getNameInitAsString();
110 printSuperclasses(Rec, OS);
111 printFields(Rec, OS);
117 void DetailedRecordsEmitter::printSectionHeading(
StringRef Title,
int Count,
119 OS <<
formatv(
"\n{0} {1} ({2}) {0}\n",
"--------------------", Title, Count);
125 const auto &LocList = Rec->
getLoc();
126 if (LocList.size() < 2)
129 OS <<
" Defm sequence:";
130 for (
unsigned I = LocList.size() - 1;
I >= 1; --
I) {
137 void DetailedRecordsEmitter::printTemplateArgs(
Record *Rec,
141 OS <<
" Template args: (none)\n";
145 OS <<
" Template args:\n";
148 assert(
Value &&
"Template argument value not found.");
160 if (Superclasses.
empty()) {
161 OS <<
" Superclasses: (none)\n";
165 OS <<
" Superclasses:";
166 for (
const auto &SuperclassPair : Superclasses) {
167 auto *ClassRec = SuperclassPair.first;
169 OS <<
formatv(
" {0}", ClassRec->getNameInitAsString());
171 OS <<
formatv(
" ({0})", ClassRec->getNameInitAsString());
178 const auto &ValueList = Rec->
getValues();
179 if (ValueList.empty()) {
180 OS <<
" Fields: (none)\n";
200 DetailedRecordsEmitter(RK).run(OS);