ParseAST.cpp revision e91593ef084479340582b2ba177b44be50a717b7
1e91c134d8fee0179d4e88235fe3ac721bb467cd8Chris Lattner//===--- ParseAST.cpp - Provide the clang::ParseAST method ----------------===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
10e91c134d8fee0179d4e88235fe3ac721bb467cd8Chris Lattner// This file implements the clang::ParseAST method.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
14e91c134d8fee0179d4e88235fe3ac721bb467cd8Chris Lattner#include "clang/Sema/ParseAST.h"
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ASTContext.h"
16556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner#include "clang/AST/ASTConsumer.h"
17e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/DeclObjC.h"
18e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Stmt.h"
1927f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek#include "clang/AST/TranslationUnit.h"
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "Sema.h"
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Parse/Action.h"
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Parse/Parser.h"
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Public interface to the file
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
29556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner/// ParseAST - Parse the entire file specified, notifying the ASTConsumer as
3031e6c7ddfeeefe05b67220bc87fa23d4338d1056Chris Lattner/// the file is parsed.  This takes ownership of the ASTConsumer and
3131e6c7ddfeeefe05b67220bc87fa23d4338d1056Chris Lattner/// ultimately deletes it.
327e7e6253d45eb2ca4a4ad9cafcb8b80693f0670aTed Kremenekvoid clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, bool PrintStats) {
33556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner  // Collect global stats on Decls/Stmts (until we have a module streamer).
34556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner  if (PrintStats) {
35556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner    Decl::CollectingStats(true);
36556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner    Stmt::CollectingStats(true);
37556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner  }
38556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner
39e7d07d113677a39026ff5119b8b67f6fe8ca9793Ted Kremenek  ASTContext Context(PP.getLangOptions(), PP.getSourceManager(),
40e7d07d113677a39026ff5119b8b67f6fe8ca9793Ted Kremenek                     PP.getTargetInfo(),
4168d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff                     PP.getIdentifierTable(), PP.getSelectorTable());
42556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner
43e7d07d113677a39026ff5119b8b67f6fe8ca9793Ted Kremenek  TranslationUnit TU(Context);
447ff22b259d4d4729f701679e3a7f0e242365e07fTed Kremenek  TU.SetOwnsDecls(false);
457ff22b259d4d4729f701679e3a7f0e242365e07fTed Kremenek
4680f3346981172428a568ccd67e37755fd2d7efbeEli Friedman
4780f3346981172428a568ccd67e37755fd2d7efbeEli Friedman  Sema S(PP, Context, *Consumer);
4880f3346981172428a568ccd67e37755fd2d7efbeEli Friedman  Parser P(PP, S);
49a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner  PP.EnterMainSourceFile();
50a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner
51a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner  // Initialize the parser.
52a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner  P.Initialize();
53556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner
54e3a6198400453c0d9623207718e4942f7c111f87Ted Kremenek  Consumer->InitializeTU(TU);
55556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner
56a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner  Parser::DeclTy *ADecl;
5727f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek
58a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner  while (!P.ParseTopLevelDecl(ADecl)) {  // Not end of file.
59a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner    // If we got a null return and something *was* parsed, ignore it.  This
60a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner    // is due to a top-level semicolon, an action override, or a parse error
61a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner    // skipping something.
6227f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek    if (ADecl) {
6327f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek      Decl* D = static_cast<Decl*>(ADecl);
6427f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek      TU.AddTopLevelDecl(D); // TranslationUnit now owns the Decl.
6527f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek      Consumer->HandleTopLevelDecl(D);
6627f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek    }
67a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner  };
68c87190da60bca25fe3bc1fe6831916f0076b72b8Ted Kremenek
69c87190da60bca25fe3bc1fe6831916f0076b72b8Ted Kremenek  Consumer->HandleTranslationUnit(TU);
7026e4cd331c389a9b7d51c91981a7a10c8a909bf4Fariborz Jahanian
71556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner  if (PrintStats) {
72556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner    fprintf(stderr, "\nSTATISTICS:\n");
73a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner    P.getActions().PrintStats();
74556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner    Context.PrintStats();
75556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner    Decl::PrintStats();
76556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner    Stmt::PrintStats();
7731e6c7ddfeeefe05b67220bc87fa23d4338d1056Chris Lattner    Consumer->PrintStats();
78556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner
79556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner    Decl::CollectingStats(false);
80556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner    Stmt::CollectingStats(false);
81556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner  }
82556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner}
83