Fix ownership model of ParseAST to allow the dtor of
ASTConsumer to process the AST before it is destroyed. This allows elimination of HandleObjcMetaDataEmission. llvm-svn: 43659
This commit is contained in:
parent
9ffbd2d648
commit
376cdaf50b
|
@ -227,8 +227,8 @@ static bool CheckResults(Preprocessor &PP,
|
|||
/// CheckASTConsumer - Implement diagnostic checking for AST consumers.
|
||||
bool clang::CheckASTConsumer(Preprocessor &PP, unsigned MainFileID,
|
||||
ASTConsumer* C) {
|
||||
|
||||
ParseAST(PP, MainFileID, *C);
|
||||
// Parse the AST and run the consumer, ultimately deleting C.
|
||||
ParseAST(PP, MainFileID, C);
|
||||
|
||||
// Gather the set of expected diagnostics.
|
||||
DiagList ExpectedErrors, ExpectedWarnings;
|
||||
|
|
|
@ -79,7 +79,6 @@ namespace {
|
|||
void SynthGetClassFunctionDecl();
|
||||
|
||||
// Metadata emission.
|
||||
void HandleObjcMetaDataEmission();
|
||||
void RewriteObjcClassMetaData(ObjcImplementationDecl *IDecl,
|
||||
std::string &Result);
|
||||
|
||||
|
@ -162,6 +161,12 @@ RewriteTest::~RewriteTest() {
|
|||
// Get the top-level buffer that this corresponds to.
|
||||
RewriteTabs();
|
||||
|
||||
// Rewrite Objective-c meta data*
|
||||
std::string ResultStr;
|
||||
WriteObjcMetaData(ResultStr);
|
||||
// For now just print the string out.
|
||||
printf("%s", ResultStr.c_str());
|
||||
|
||||
// Get the buffer corresponding to MainFileID. If we haven't changed it, then
|
||||
// we are done.
|
||||
if (const RewriteBuffer *RewriteBuf =
|
||||
|
@ -175,16 +180,6 @@ RewriteTest::~RewriteTest() {
|
|||
|
||||
}
|
||||
|
||||
/// HandleObjcMetaDataEmission - main routine to generate objective-c's
|
||||
/// metadata.
|
||||
void RewriteTest::HandleObjcMetaDataEmission() {
|
||||
// Rewrite Objective-c meta data*
|
||||
std::string ResultStr;
|
||||
WriteObjcMetaData(ResultStr);
|
||||
// For now just print the string out.
|
||||
printf("%s", ResultStr.c_str());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Syntactic (non-AST) Rewriting Code
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -821,11 +821,10 @@ static void ProcessInputFile(Preprocessor &PP, unsigned MainFileID,
|
|||
|
||||
if (Consumer) {
|
||||
if (VerifyDiagnostics)
|
||||
exit (CheckASTConsumer(PP, MainFileID, Consumer));
|
||||
else
|
||||
ParseAST(PP, MainFileID, *Consumer, Stats);
|
||||
|
||||
delete Consumer;
|
||||
exit(CheckASTConsumer(PP, MainFileID, Consumer));
|
||||
|
||||
// This deletes Consumer.
|
||||
ParseAST(PP, MainFileID, Consumer, Stats);
|
||||
}
|
||||
|
||||
if (Stats) {
|
||||
|
|
|
@ -89,9 +89,10 @@ void ASTStreamer::PrintStats() const {
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// ParseAST - Parse the entire file specified, notifying the ASTConsumer as
|
||||
/// the file is parsed.
|
||||
/// the file is parsed. This takes ownership of the ASTConsumer and
|
||||
/// ultimately deletes it.
|
||||
void clang::ParseAST(Preprocessor &PP, unsigned MainFileID,
|
||||
ASTConsumer &Consumer, bool PrintStats) {
|
||||
ASTConsumer *Consumer, bool PrintStats) {
|
||||
// Collect global stats on Decls/Stmts (until we have a module streamer).
|
||||
if (PrintStats) {
|
||||
Decl::CollectingStats(true);
|
||||
|
@ -103,22 +104,22 @@ void clang::ParseAST(Preprocessor &PP, unsigned MainFileID,
|
|||
|
||||
ASTStreamer Streamer(PP, Context, MainFileID);
|
||||
|
||||
Consumer.Initialize(Context, MainFileID);
|
||||
Consumer->Initialize(Context, MainFileID);
|
||||
|
||||
while (Decl *D = Streamer.ReadTopLevelDecl())
|
||||
Consumer.HandleTopLevelDecl(D);
|
||||
Consumer->HandleTopLevelDecl(D);
|
||||
|
||||
Consumer.HandleObjcMetaDataEmission();
|
||||
|
||||
if (PrintStats) {
|
||||
fprintf(stderr, "\nSTATISTICS:\n");
|
||||
Streamer.PrintStats();
|
||||
Context.PrintStats();
|
||||
Decl::PrintStats();
|
||||
Stmt::PrintStats();
|
||||
Consumer.PrintStats();
|
||||
Consumer->PrintStats();
|
||||
|
||||
Decl::CollectingStats(false);
|
||||
Stmt::CollectingStats(false);
|
||||
}
|
||||
|
||||
delete Consumer;
|
||||
}
|
||||
|
|
|
@ -34,11 +34,6 @@ public:
|
|||
virtual void HandleTopLevelDecl(Decl *D) {
|
||||
}
|
||||
|
||||
/// HandleObjcMetaDataEmission - top level routine for objective-c
|
||||
/// metadata emission.
|
||||
virtual void HandleObjcMetaDataEmission() {
|
||||
}
|
||||
|
||||
/// PrintStats - If desired, print any statistics.
|
||||
virtual void PrintStats() {
|
||||
}
|
||||
|
|
|
@ -21,9 +21,10 @@ namespace clang {
|
|||
class ASTConsumer;
|
||||
|
||||
/// ParseAST - Parse the entire file specified, notifying the ASTConsumer as
|
||||
/// the file is parsed. This does not take ownership of the ASTConsumer.
|
||||
/// the file is parsed. This takes ownership of the ASTConsumer and
|
||||
/// ultimately deletes it.
|
||||
void ParseAST(Preprocessor &pp, unsigned MainFileID,
|
||||
ASTConsumer &C, bool PrintStats = false);
|
||||
ASTConsumer *C, bool PrintStats = false);
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue