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:
Chris Lattner 2007-11-03 06:24:16 +00:00
parent 9ffbd2d648
commit 376cdaf50b
6 changed files with 23 additions and 32 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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() {
}

View File

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