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