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)