|  | //===- CXXFieldCollector.h - Utility class for C++ class semantic analysis ===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | //  This file provides CXXFieldCollector that is used during parsing & semantic | 
|  | //  analysis of C++ classes. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_CLANG_SEMA_CXXFIELDCOLLECTOR_H | 
|  | #define LLVM_CLANG_SEMA_CXXFIELDCOLLECTOR_H | 
|  |  | 
|  | #include "llvm/ADT/SmallVector.h" | 
|  |  | 
|  | namespace clang { | 
|  | class FieldDecl; | 
|  |  | 
|  | /// CXXFieldCollector - Used to keep track of CXXFieldDecls during parsing of | 
|  | /// C++ classes. | 
|  | class CXXFieldCollector { | 
|  | /// Fields - Contains all FieldDecls collected during parsing of a C++ | 
|  | /// class. When a nested class is entered, its fields are appended to the | 
|  | /// fields of its parent class, when it is exited its fields are removed. | 
|  | llvm::SmallVector<FieldDecl*, 32> Fields; | 
|  |  | 
|  | /// FieldCount - Each entry represents the number of fields collected during | 
|  | /// the parsing of a C++ class. When a nested class is entered, a new field | 
|  | /// count is pushed, when it is exited, the field count is popped. | 
|  | llvm::SmallVector<size_t, 4> FieldCount; | 
|  |  | 
|  | // Example: | 
|  | // | 
|  | // class C { | 
|  | //   int x,y; | 
|  | //   class NC { | 
|  | //     int q; | 
|  | //     // At this point, Fields contains [x,y,q] decls and FieldCount contains | 
|  | //     // [2,1]. | 
|  | //   }; | 
|  | //   int z; | 
|  | //   // At this point, Fields contains [x,y,z] decls and FieldCount contains | 
|  | //   // [3]. | 
|  | // }; | 
|  |  | 
|  | public: | 
|  | /// StartClass - Called by Sema::ActOnStartCXXClassDef. | 
|  | void StartClass() { FieldCount.push_back(0); } | 
|  |  | 
|  | /// Add - Called by Sema::ActOnCXXMemberDeclarator. | 
|  | void Add(FieldDecl *D) { | 
|  | Fields.push_back(D); | 
|  | ++FieldCount.back(); | 
|  | } | 
|  |  | 
|  | /// getCurNumField - The number of fields added to the currently parsed class. | 
|  | size_t getCurNumFields() const { | 
|  | assert(!FieldCount.empty() && "no currently-parsed class"); | 
|  | return FieldCount.back(); | 
|  | } | 
|  |  | 
|  | /// getCurFields - Pointer to array of fields added to the currently parsed | 
|  | /// class. | 
|  | FieldDecl **getCurFields() { return &*(Fields.end() - getCurNumFields()); } | 
|  |  | 
|  | /// FinishClass - Called by Sema::ActOnFinishCXXClassDef. | 
|  | void FinishClass() { | 
|  | Fields.resize(Fields.size() - getCurNumFields()); | 
|  | FieldCount.pop_back(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | } // end namespace clang | 
|  |  | 
|  | #endif |