1e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor//===--- SemaConsumer.h - Abstract interface for AST semantics --*- C++ -*-===//
2e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor//
3e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor//                     The LLVM Compiler Infrastructure
4e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor//
5e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor// This file is distributed under the University of Illinois Open Source
6e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor// License. See LICENSE.TXT for details.
7e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor//
8e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor//===----------------------------------------------------------------------===//
9e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor//
10e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor//  This file defines the SemaConsumer class, a subclass of
11e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor//  ASTConsumer that is used by AST clients that also require
12e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor//  additional semantic analysis.
13e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor//
14e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor//===----------------------------------------------------------------------===//
15e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor#ifndef LLVM_CLANG_SEMA_SEMACONSUMER_H
16e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor#define LLVM_CLANG_SEMA_SEMACONSUMER_H
17e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor
18e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor#include "clang/AST/ASTConsumer.h"
19e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor
20e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregornamespace clang {
21e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor  class Sema;
22e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor
23e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor  /// \brief An abstract interface that should be implemented by
24e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor  /// clients that read ASTs and then require further semantic
25e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor  /// analysis of the entities in those ASTs.
26e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor  class SemaConsumer : public ASTConsumer {
2799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie    virtual void anchor();
28e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor  public:
29668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor    SemaConsumer() {
30e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor      ASTConsumer::SemaConsumer = true;
31e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor    }
32e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor
33e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor    /// \brief Initialize the semantic consumer with the Sema instance
34e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor    /// being used to perform semantic analysis on the abstract syntax
35e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor    /// tree.
36e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor    virtual void InitializeSema(Sema &S) {}
37e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor
38ec2a4ed278a1112ebf84fdcb80ed66f53d8ec8baDaniel Dunbar    /// \brief Inform the semantic consumer that Sema is no longer available.
39ec2a4ed278a1112ebf84fdcb80ed66f53d8ec8baDaniel Dunbar    virtual void ForgetSema() {}
40ec2a4ed278a1112ebf84fdcb80ed66f53d8ec8baDaniel Dunbar
41e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor    // isa/cast/dyn_cast support
421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const ASTConsumer *Consumer) {
431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return Consumer->SemaConsumer;
44e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor    }
45e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor    static bool classof(const SemaConsumer *) { return true; }
46e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor  };
47e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor}
48e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor
49e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor#endif
50