From: Fariborz Jahanian Date: Wed, 19 Dec 2012 23:36:00 +0000 (+0000) Subject: Audit DeclPrinter with -ast-dump on Cocoa.h and X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=40902d817e5a73850045d8a0c9795bc5047ee000;p=clang Audit DeclPrinter with -ast-dump on Cocoa.h and fix any bad objectiveC syntax coming out of DeclPrinter. This is on going. Also, introduce a new PrintPolicy and use it as needed when declaration tag is to be produced via DeclPrinter. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@170606 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/PrettyPrinter.h b/include/clang/AST/PrettyPrinter.h index 598a86fa71..10354034a5 100644 --- a/include/clang/AST/PrettyPrinter.h +++ b/include/clang/AST/PrettyPrinter.h @@ -40,7 +40,7 @@ struct PrintingPolicy { SuppressUnwrittenScope(false), SuppressInitializers(false), ConstantArraySizeAsWritten(false), AnonymousTagLocations(true), SuppressStrongLifetime(false), Bool(LO.Bool), - TerseOutput(false), SuppressAttributes(false), + TerseOutput(false), PolishForDeclaration(false), DumpSourceManager(0) { } /// \brief What language we're printing. @@ -143,9 +143,10 @@ struct PrintingPolicy { /// only the requested declaration. unsigned TerseOutput : 1; - /// \brief When true, do not print attributes attached to the declaration. + /// \brief When true, do certain refinement needed for producing proper + /// declaration tag; such as, do not print attributes attached to the declaration. /// - unsigned SuppressAttributes : 1; + unsigned PolishForDeclaration : 1; /// \brief If we are "dumping" rather than "pretty-printing", this points to /// a SourceManager which will be used to dump SourceLocations. Dumping diff --git a/lib/AST/DeclPrinter.cpp b/lib/AST/DeclPrinter.cpp index 34c69059c4..572e3d0bc7 100644 --- a/lib/AST/DeclPrinter.cpp +++ b/lib/AST/DeclPrinter.cpp @@ -193,7 +193,7 @@ raw_ostream& DeclPrinter::Indent(unsigned Indentation) { } void DeclPrinter::prettyPrintAttributes(Decl *D) { - if (Policy.SuppressAttributes) + if (Policy.PolishForDeclaration) return; if (D->hasAttrs()) { @@ -915,7 +915,7 @@ void DeclPrinter::VisitObjCMethodDecl(ObjCMethodDecl *OMD) { OMD->getBody()->printPretty(Out, 0, Policy); Out << '\n'; } - else + else if (Policy.PolishForDeclaration) Out << ';'; } @@ -950,7 +950,7 @@ void DeclPrinter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *OID) { Out << "@class " << I << ";"; return; } - + bool eolnOut = false; if (SID) Out << "@interface " << I << " : " << *SID; else @@ -962,13 +962,12 @@ void DeclPrinter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *OID) { for (ObjCList::iterator I = Protocols.begin(), E = Protocols.end(); I != E; ++I) Out << (I == Protocols.begin() ? '<' : ',') << **I; - } - - if (!Protocols.empty()) Out << "> "; + } if (OID->ivar_size() > 0) { Out << "{\n"; + eolnOut = true; Indentation += Policy.Indentation; for (ObjCInterfaceDecl::ivar_iterator I = OID->ivar_begin(), E = OID->ivar_end(); I != E; ++I) { @@ -977,19 +976,33 @@ void DeclPrinter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *OID) { Indentation -= Policy.Indentation; Out << "}\n"; } + else if (SID) { + Out << "\n"; + eolnOut = true; + } VisitDeclContext(OID, false); + if (!eolnOut) + Out << ' '; Out << "@end"; // FIXME: implement the rest... } void DeclPrinter::VisitObjCProtocolDecl(ObjCProtocolDecl *PID) { if (!PID->isThisDeclarationADefinition()) { - Out << "@protocol " << PID->getIdentifier() << ";\n"; + Out << "@protocol " << *PID << ";\n"; return; } - - Out << "@protocol " << *PID << '\n'; + // Protocols? + const ObjCList &Protocols = PID->getReferencedProtocols(); + if (!Protocols.empty()) { + Out << "@protocol " << *PID; + for (ObjCList::iterator I = Protocols.begin(), + E = Protocols.end(); I != E; ++I) + Out << (I == Protocols.begin() ? '<' : ',') << **I; + Out << ">\n"; + } else + Out << "@protocol " << *PID << '\n'; VisitDeclContext(PID, false); Out << "@end"; } @@ -1095,7 +1108,9 @@ void DeclPrinter::VisitObjCPropertyDecl(ObjCPropertyDecl *PDecl) { (void) first; // Silence dead store warning due to idiomatic code. Out << " )"; } - Out << ' ' << PDecl->getType().getAsString(Policy) << ' ' << *PDecl << ';'; + Out << ' ' << PDecl->getType().getAsString(Policy) << ' ' << *PDecl; + if (Policy.PolishForDeclaration) + Out << ';'; } void DeclPrinter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PID) { diff --git a/tools/libclang/CXComment.cpp b/tools/libclang/CXComment.cpp index 0656ab824b..caf6a857f0 100644 --- a/tools/libclang/CXComment.cpp +++ b/tools/libclang/CXComment.cpp @@ -908,7 +908,7 @@ void getSourceTextOfDeclaration(const DeclInfo *ThisDecl, const LangOptions &LangOpts = Context.getLangOpts(); llvm::raw_svector_ostream OS(Str); PrintingPolicy PPolicy(LangOpts); - PPolicy.SuppressAttributes = true; + PPolicy.PolishForDeclaration = true; PPolicy.TerseOutput = true; ThisDecl->CurrentDecl->print(OS, PPolicy, /*Indentation*/0, /*PrintInstantiation*/true); diff --git a/unittests/AST/DeclPrinterTest.cpp b/unittests/AST/DeclPrinterTest.cpp index e9fc6fdea3..844b9a49e1 100644 --- a/unittests/AST/DeclPrinterTest.cpp +++ b/unittests/AST/DeclPrinterTest.cpp @@ -1234,6 +1234,6 @@ TEST(DeclPrinter, TestObjCMethod1) { "@end\n", namedDecl(hasName("A:inRange:"), hasDescendant(namedDecl(hasName("printThis")))).bind("id"), - "- (int) A:(id)anObject inRange:(long)range;")); + "- (int) A:(id)anObject inRange:(long)range")); }