ParseAST.cpp revision ec2a4ed278a1112ebf84fdcb80ed66f53d8ec8ba
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" 15498603d6ea8a534ce7af3dfdcc0fa2c42d016025Chris Lattner#include "Sema.h" 1681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Sema/CodeCompleteConsumer.h" 17e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor#include "clang/Sema/SemaConsumer.h" 18668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor#include "clang/Sema/ExternalSemaSource.h" 19556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner#include "clang/AST/ASTConsumer.h" 20fdd0172ca1b3c837f8c2b37d69cc2085234e09faDouglas Gregor#include "clang/AST/ExternalASTSource.h" 21e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Stmt.h" 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Parse/Parser.h" 23f42e4a6e089e8413247400fe58ad299193371f9cTorok Edwin#include <cstdio> 24f42e4a6e089e8413247400fe58ad299193371f9cTorok Edwin 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Public interface to the file 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 31556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner/// ParseAST - Parse the entire file specified, notifying the ASTConsumer as 323599dbe94ed8229b4a0eca0b066129e381ccb277Chris Lattner/// the file is parsed. This inserts the parsed decls into the translation unit 333599dbe94ed8229b4a0eca0b066129e381ccb277Chris Lattner/// held by Ctx. 34d3db40151868df39b14d2ef8ffacf19e8c36331fDaniel Dunbar/// 3546157b59646e3fd4252747c679fda529b8bf46afTed Kremenekvoid clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, 36f807fe0d1a865f4c6ba7e494cf4ae360c4173521Douglas Gregor ASTContext &Ctx, bool PrintStats, 3781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool CompleteTranslationUnit, 383a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer *CompletionConsumer) { 39556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner // Collect global stats on Decls/Stmts (until we have a module streamer). 40556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner if (PrintStats) { 41556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner Decl::CollectingStats(true); 42556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner Stmt::CollectingStats(true); 43556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner } 4446157b59646e3fd4252747c679fda529b8bf46afTed Kremenek 453a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar Sema S(PP, Ctx, *Consumer, CompleteTranslationUnit, CompletionConsumer); 4680f3346981172428a568ccd67e37755fd2d7efbeEli Friedman Parser P(PP, S); 47a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner PP.EnterMainSourceFile(); 481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner // Initialize the parser. 50a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner P.Initialize(); 511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 523599dbe94ed8229b4a0eca0b066129e381ccb277Chris Lattner Consumer->Initialize(Ctx); 531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer)) 55e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor SC->InitializeSema(S); 56e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor 57668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor if (ExternalASTSource *External = Ctx.getExternalSource()) { 581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (ExternalSemaSource *ExternalSema = 59668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor dyn_cast<ExternalSemaSource>(External)) 60668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor ExternalSema->InitializeSema(S); 61668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor 62668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor External->StartTranslationUnit(Consumer); 63668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor } 64fdd0172ca1b3c837f8c2b37d69cc2085234e09faDouglas Gregor 65682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner Parser::DeclGroupPtrTy ADecl; 661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner while (!P.ParseTopLevelDecl(ADecl)) { // Not end of file. 68a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner // If we got a null return and something *was* parsed, ignore it. This 69a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner // is due to a top-level semicolon, an action override, or a parse error 70a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner // skipping something. 71682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner if (ADecl) 72682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>()); 73a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner }; 7463e963cdffca9530f920dbab58b9b4eecb2a582cFariborz Jahanian // Check for any pending objective-c implementation decl. 751ac7104947020a60430ba6f519cd5869af77046fFariborz Jahanian while ((ADecl = P.RetrievePendingObjCImpDecl())) 7663e963cdffca9530f920dbab58b9b4eecb2a582cFariborz Jahanian Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>()); 771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78ec2a4ed278a1112ebf84fdcb80ed66f53d8ec8baDaniel Dunbar // Process any TopLevelDecls generated by #pragma weak. 797b1fdbda2757cc4a7f25664475be44119d7f8e59Ryan Flynn for (llvm::SmallVector<Decl*,2>::iterator 807b1fdbda2757cc4a7f25664475be44119d7f8e59Ryan Flynn I = S.WeakTopLevelDecls().begin(), 817b1fdbda2757cc4a7f25664475be44119d7f8e59Ryan Flynn E = S.WeakTopLevelDecls().end(); I != E; ++I) 827b1fdbda2757cc4a7f25664475be44119d7f8e59Ryan Flynn Consumer->HandleTopLevelDecl(DeclGroupRef(*I)); 837b1fdbda2757cc4a7f25664475be44119d7f8e59Ryan Flynn 843599dbe94ed8229b4a0eca0b066129e381ccb277Chris Lattner Consumer->HandleTranslationUnit(Ctx); 8526e4cd331c389a9b7d51c91981a7a10c8a909bf4Fariborz Jahanian 86ec2a4ed278a1112ebf84fdcb80ed66f53d8ec8baDaniel Dunbar if (ExternalSemaSource *ESS = 87ec2a4ed278a1112ebf84fdcb80ed66f53d8ec8baDaniel Dunbar dyn_cast_or_null<ExternalSemaSource>(Ctx.getExternalSource())) 88ec2a4ed278a1112ebf84fdcb80ed66f53d8ec8baDaniel Dunbar ESS->ForgetSema(); 89ec2a4ed278a1112ebf84fdcb80ed66f53d8ec8baDaniel Dunbar 90ec2a4ed278a1112ebf84fdcb80ed66f53d8ec8baDaniel Dunbar if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer)) 91ec2a4ed278a1112ebf84fdcb80ed66f53d8ec8baDaniel Dunbar SC->ForgetSema(); 92ec2a4ed278a1112ebf84fdcb80ed66f53d8ec8baDaniel Dunbar 93556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner if (PrintStats) { 94556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner fprintf(stderr, "\nSTATISTICS:\n"); 95a0e328f9953e2d8e83227ffa601f5a606b7aa062Chris Lattner P.getActions().PrintStats(); 963599dbe94ed8229b4a0eca0b066129e381ccb277Chris Lattner Ctx.PrintStats(); 97556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner Decl::PrintStats(); 98556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner Stmt::PrintStats(); 9931e6c7ddfeeefe05b67220bc87fa23d4338d1056Chris Lattner Consumer->PrintStats(); 100556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner } 101556beb71b8820ed5243e385ffcc91433a494c170Chris Lattner} 102