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