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
This commit is contained in:
Fariborz Jahanian 2012-12-19 23:36:00 +00:00
Родитель ca40f30a20
Коммит 40902d817e
4 изменённых файлов: 31 добавлений и 15 удалений

Просмотреть файл

@ -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

Просмотреть файл

@ -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<ObjCProtocolDecl>::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<ObjCProtocolDecl> &Protocols = PID->getReferencedProtocols();
if (!Protocols.empty()) {
Out << "@protocol " << *PID;
for (ObjCList<ObjCProtocolDecl>::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) {

Просмотреть файл

@ -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);

Просмотреть файл

@ -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"));
}