/// ParseAST - Parse the entire file specified, notifying the ASTConsumer as /// the file is parsed. This inserts the parsed decls into the translation unit /// held by Ctx. /// void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, ASTContext &Ctx, bool PrintStats, bool CompleteTranslationUnit) { // Collect global stats on Decls/Stmts (until we have a module streamer). if (PrintStats) { Decl::CollectingStats(true); Stmt::CollectingStats(true); } Sema S(PP, Ctx, *Consumer, CompleteTranslationUnit); Parser P(PP, S); PP.EnterMainSourceFile(); // Initialize the parser. P.Initialize(); Consumer->Initialize(Ctx); if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer)) SC->InitializeSema(S); if (ExternalASTSource *External = Ctx.getExternalSource()) { if (ExternalSemaSource *ExternalSema = dyn_cast<ExternalSemaSource>(External)) ExternalSema->InitializeSema(S); External->StartTranslationUnit(Consumer); } Parser::DeclGroupPtrTy ADecl; while (!P.ParseTopLevelDecl(ADecl)) { // Not end of file. // If we got a null return and something *was* parsed, ignore it. This // is due to a top-level semicolon, an action override, or a parse error // skipping something. if (ADecl) Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>()); }; Consumer->HandleTranslationUnit(Ctx); if (PrintStats) { fprintf(stderr, "\nSTATISTICS:\n"); P.getActions().PrintStats(); Ctx.PrintStats(); Decl::PrintStats(); Stmt::PrintStats(); Consumer->PrintStats(); Decl::CollectingStats(false); Stmt::CollectingStats(false); } }
/// ParseAST - Parse the entire file specified, notifying the ASTConsumer as /// the file is parsed. This inserts the parsed decls into the translation unit /// held by Ctx. /// void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, ASTContext &Ctx, bool PrintStats, bool CompleteTranslationUnit, CodeCompleteConsumer *CompletionConsumer) { // Collect global stats on Decls/Stmts (until we have a module streamer). if (PrintStats) { Decl::CollectingStats(true); Stmt::CollectingStats(true); } Sema S(PP, Ctx, *Consumer, CompleteTranslationUnit, CompletionConsumer); Parser P(PP, S); PP.EnterMainSourceFile(); // Initialize the parser. P.Initialize(); Consumer->Initialize(Ctx); if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer)) SC->InitializeSema(S); if (ExternalASTSource *External = Ctx.getExternalSource()) { if (ExternalSemaSource *ExternalSema = dyn_cast<ExternalSemaSource>(External)) ExternalSema->InitializeSema(S); External->StartTranslationUnit(Consumer); } Parser::DeclGroupPtrTy ADecl; while (!P.ParseTopLevelDecl(ADecl)) { // Not end of file. // If we got a null return and something *was* parsed, ignore it. This // is due to a top-level semicolon, an action override, or a parse error // skipping something. if (ADecl) Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>()); }; // Check for any pending objective-c implementation decl. while ((ADecl = P.FinishPendingObjCActions())) Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>()); // Process any TopLevelDecls generated by #pragma weak. for (llvm::SmallVector<Decl*,2>::iterator I = S.WeakTopLevelDecls().begin(), E = S.WeakTopLevelDecls().end(); I != E; ++I) Consumer->HandleTopLevelDecl(DeclGroupRef(*I)); // Dump record layouts, if requested. if (PP.getLangOptions().DumpRecordLayouts) DumpRecordLayouts(Ctx); Consumer->HandleTranslationUnit(Ctx); if (ExternalSemaSource *ESS = dyn_cast_or_null<ExternalSemaSource>(Ctx.getExternalSource())) ESS->ForgetSema(); if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer)) SC->ForgetSema(); if (PrintStats) { fprintf(stderr, "\nSTATISTICS:\n"); P.getActions().PrintStats(); Ctx.PrintStats(); Decl::PrintStats(); Stmt::PrintStats(); Consumer->PrintStats(); } }