diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/ParseAST.cpp | 56 | ||||
| -rw-r--r-- | clang/lib/Sema/Sema.cpp | 21 | 
2 files changed, 41 insertions, 36 deletions
diff --git a/clang/lib/Sema/ParseAST.cpp b/clang/lib/Sema/ParseAST.cpp index 4286b3f7c4d..099171e56fb 100644 --- a/clang/lib/Sema/ParseAST.cpp +++ b/clang/lib/Sema/ParseAST.cpp @@ -56,64 +56,48 @@ void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer,                       ASTContext &Ctx, bool PrintStats,                       bool CompleteTranslationUnit,                       CodeCompleteConsumer *CompletionConsumer) { +  Sema S(PP, Ctx, *Consumer, CompleteTranslationUnit, CompletionConsumer); +  ParseAST(S, PrintStats); +} + +void clang::ParseAST(Sema &S, bool PrintStats) {    // Collect global stats on Decls/Stmts (until we have a module streamer).    if (PrintStats) {      Decl::CollectingStats(true);      Stmt::CollectingStats(true);    } -  Sema S(PP, Ctx, *Consumer, CompleteTranslationUnit, CompletionConsumer); -  Parser P(PP, S); -  PP.EnterMainSourceFile(); - -  // Initialize the parser. -  P.Initialize(); - -  Consumer->Initialize(Ctx); - -  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer)) -    SC->InitializeSema(S); - -  if (ExternalASTSource *External = Ctx.getExternalSource()) { -    if (ExternalSemaSource *ExternalSema = -          dyn_cast<ExternalSemaSource>(External)) -      ExternalSema->InitializeSema(S); - +  Parser P(S.getPreprocessor(), S); +  S.getPreprocessor().EnterMainSourceFile(); +   +  if (ExternalASTSource *External = S.getASTContext().getExternalSource())      External->StartTranslationUnit(Consumer); -  } - +      Parser::DeclGroupPtrTy ADecl; - +      while (!P.ParseTopLevelDecl(ADecl)) {  // Not end of file. -    // If we got a null return and something *was* parsed, ignore it.  This -    // is due to a top-level semicolon, an action override, or a parse error -    // skipping something. +                                         // If we got a null return and something *was* parsed, ignore it.  This +                                         // is due to a top-level semicolon, an action override, or a parse error +                                         // skipping something.      if (ADecl)        Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>());    };    // Check for any pending objective-c implementation decl.    while ((ADecl = P.FinishPendingObjCActions()))      Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>()); - +      // Process any TopLevelDecls generated by #pragma weak.    for (llvm::SmallVector<Decl*,2>::iterator -        I = S.WeakTopLevelDecls().begin(), -        E = S.WeakTopLevelDecls().end(); I != E; ++I) +       I = S.WeakTopLevelDecls().begin(), +       E = S.WeakTopLevelDecls().end(); I != E; ++I)      Consumer->HandleTopLevelDecl(DeclGroupRef(*I)); - +      // Dump record layouts, if requested.    if (PP.getLangOptions().DumpRecordLayouts)      DumpRecordLayouts(Ctx); - +      Consumer->HandleTranslationUnit(Ctx); - -  if (ExternalSemaSource *ESS = -        dyn_cast_or_null<ExternalSemaSource>(Ctx.getExternalSource())) -    ESS->ForgetSema(); - -  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer)) -    SC->ForgetSema(); - +      if (PrintStats) {      fprintf(stderr, "\nSTATISTICS:\n");      P.getActions().PrintStats(); diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index e7f5bb4317f..a504ae69a2c 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -143,6 +143,18 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,    ExprEvalContexts.push_back(                    ExpressionEvaluationContextRecord(PotentiallyEvaluated, 0)); +   +  // Tell the AST consumer about this Sema object. +  Consumer.Initialize(this); +   +  // FIXME: Isn't this redundant with the initialization above? +  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer)) +    SC->InitializeSema(*this); +   +  // Tell the external Sema source about this Sema object. +  if (ExternalSemaSource *ExternalSema +        = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource())) +    ExternalSema->InitializeSema(S)  }  Sema::~Sema() { @@ -151,6 +163,15 @@ Sema::~Sema() {    delete TheTargetAttributesSema;    while (!FunctionScopes.empty())      PopFunctionOrBlockScope(); +   +  // Tell the SemaConsumer to forget about us; we're going out of scope. +  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer)) +    SC->ForgetSema(); + +  // Detach from the external Sema source. +  if (ExternalSemaSource *ExternalSema +      = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource())) +    ExternalSema->ForgetSema();  }  /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.  | 

