ParseAST.cpp revision e91c134d8fee0179d4e88235fe3ac721bb467cd8
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//===--- ParseAST.cpp - Provide the clang::ParseAST method ----------------===// 2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The LLVM Compiler Infrastructure 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This file is distributed under the University of Illinois Open Source 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// License. See LICENSE.TXT for details. 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//===----------------------------------------------------------------------===// 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This file implements the clang::ParseAST method. 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//===----------------------------------------------------------------------===// 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "clang/Sema/ParseAST.h" 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "clang/AST/ASTContext.h" 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "clang/AST/ASTConsumer.h" 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Sema.h" 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "clang/Parse/Action.h" 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "clang/Parse/Parser.h" 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace clang; 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectASTConsumer::~ASTConsumer() {} 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//===----------------------------------------------------------------------===// 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Public interface to the file 26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//===----------------------------------------------------------------------===// 27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/// ParseAST - Parse the entire file specified, notifying the ASTConsumer as 29dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch/// the file is parsed. This takes ownership of the ASTConsumer and 30231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block/// ultimately deletes it. 31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, bool PrintStats) { 32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Collect global stats on Decls/Stmts (until we have a module streamer). 33231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (PrintStats) { 34231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Decl::CollectingStats(true); 35dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch Stmt::CollectingStats(true); 36dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch } 37dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 38dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch ASTContext Context(PP.getSourceManager(), PP.getTargetInfo(), 39dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch PP.getIdentifierTable(), PP.getSelectorTable()); 40dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 41dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch Parser P(PP, *new Sema(PP, Context)); 4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch PP.EnterMainSourceFile(); 4328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 4428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // Initialize the parser. 4528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu P.Initialize(); 4628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Consumer->Initialize(Context); 48dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Parser::DeclTy *ADecl; 5028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu while (!P.ParseTopLevelDecl(ADecl)) { // Not end of file. 5128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // If we got a null return and something *was* parsed, ignore it. This 5228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // is due to a top-level semicolon, an action override, or a parse error 5328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // skipping something. 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (ADecl) 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Consumer->HandleTopLevelDecl(static_cast<Decl*>(ADecl)); 5628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu }; 5728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 5828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (PrintStats) { 5928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu fprintf(stderr, "\nSTATISTICS:\n"); 60dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch P.getActions().PrintStats(); 61dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch Context.PrintStats(); 62dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch Decl::PrintStats(); 634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Stmt::PrintStats(); 644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Consumer->PrintStats(); 654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Decl::CollectingStats(false); 67dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch Stmt::CollectingStats(false); 68dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch } 69dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 70dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch delete Consumer; 71dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 72dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch