ASTConsumer.h revision b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//===--- ASTConsumer.h - Abstract interface for reading ASTs ----*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// This file is distributed under the University of Illinois Open Source
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)//
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)//  This file defines the ASTConsumer class.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifndef LLVM_CLANG_AST_ASTCONSUMER_H
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define LLVM_CLANG_AST_ASTCONSUMER_H
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace clang {
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  class ASTContext;
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  class DeclGroupRef;
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  class TagDecl;
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  class HandleTagDeclDefinition;
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  class SemaConsumer; // layering violation required for safe SemaConsumer
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class VarDecl;
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// ASTConsumer - This is an abstract interface that should be implemented by
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// clients that read ASTs.  This abstraction layer allows the client to be
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// independent of the AST producer (e.g. parser vs AST dump file reader, etc).
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ASTConsumer {
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \brief Whether this AST consumer also requires information about
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// semantic analysis.
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool SemaConsumer;
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class SemaConsumer;
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASTConsumer() : SemaConsumer(false) { }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ASTConsumer() {}
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Initialize - This is called to initialize the consumer, providing the
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// ASTContext and the Action.
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void Initialize(ASTContext &Context) {}
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// HandleTopLevelDecl - Handle the specified top-level declaration.  This is
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ///  called by the parser to process every top-level Decl*. Note that D can
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ///  be the head of a chain of Decls (e.g. for `int a, b` the chain will have
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ///  two elements). Use Decl::getNextDeclarator() to walk the chain.
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void HandleTopLevelDecl(DeclGroupRef D);
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// HandleTranslationUnit - This method is called when the ASTs for entire
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ///  translation unit have been parsed.
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void HandleTranslationUnit(ASTContext &Ctx) {}
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// HandleTagDeclDefinition - This callback is invoked each time a TagDecl
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// (e.g. struct, union, enum, class) is completed.  This allows the client to
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// hack on the type, which can occur at any point in the file (because these
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// can be defined in declspecs).
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void HandleTagDeclDefinition(TagDecl *D) {}
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// \brief Callback invoked at the end of a translation unit to
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// notify the consumer that the given tentative definition should
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// be completed.
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ///
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// The variable declaration itself will be a tentative
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// definition. If it had an incomplete array type, its type will
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// have already been changed to an array of size 1. However, the
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// declaration remains a tentative definition and has not been
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// modified by the introduction of an implicit zero initializer.
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void CompleteTentativeDefinition(VarDecl *D) {}
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// PrintStats - If desired, print any statistics.
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void PrintStats() {
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Support isa/cast/dyn_cast
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static bool classof(const ASTConsumer *) { return true; }
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
7881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // end namespace clang.
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)