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