void DeclPrinter::VisitCXXRecordDecl(CXXRecordDecl *D) { // FIXME: add printing of pragma attributes if required. if (!Policy.SuppressSpecifiers && D->isModulePrivate()) Out << "__module_private__ "; Out << D->getKindName(); prettyPrintAttributes(D); if (D->getIdentifier()) { Out << ' ' << *D; if (auto S = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) printTemplateArguments(S->getTemplateArgs(), S->getTemplateParameters()); else if (auto S = dyn_cast<ClassTemplateSpecializationDecl>(D)) printTemplateArguments(S->getTemplateArgs()); } if (D->isCompleteDefinition()) { // Print the base classes if (D->getNumBases()) { Out << " : "; for (CXXRecordDecl::base_class_iterator Base = D->bases_begin(), BaseEnd = D->bases_end(); Base != BaseEnd; ++Base) { if (Base != D->bases_begin()) Out << ", "; if (Base->isVirtual()) Out << "virtual "; AccessSpecifier AS = Base->getAccessSpecifierAsWritten(); if (AS != AS_none) { Print(AS); Out << " "; } Out << Base->getType().getAsString(Policy); if (Base->isPackExpansion()) Out << "..."; } } // Print the class definition // FIXME: Doesn't print access specifiers, e.g., "public:" if (Policy.TerseOutput) { Out << " {}"; } else { Out << " {\n"; VisitDeclContext(D); Indent() << "}"; } } }
void ASTDumper::VisitCXXRecordDecl(CXXRecordDecl *D) { VisitRecordDecl(D); if (!D->isCompleteDefinition()) return; for (CXXRecordDecl::base_class_iterator I = D->bases_begin(), E = D->bases_end(); I != E; ++I) { IndentScope Indent(*this); if (I->isVirtual()) OS << "virtual "; dumpAccessSpecifier(I->getAccessSpecifier()); dumpType(I->getType()); if (I->isPackExpansion()) OS << "..."; } }