1 //===- CXXFieldCollector.h - Utility class for C++ class semantic analysis ===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file provides CXXFieldCollector that is used during parsing & semantic 11 // analysis of C++ classes. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CLANG_SEMA_CXXFIELDCOLLECTOR_H 16 #define LLVM_CLANG_SEMA_CXXFIELDCOLLECTOR_H 17 18 #include "clang/Basic/LLVM.h" 19 #include "llvm/ADT/SmallVector.h" 20 21 namespace clang { 22 class FieldDecl; 23 24 /// CXXFieldCollector - Used to keep track of CXXFieldDecls during parsing of 25 /// C++ classes. 26 class CXXFieldCollector { 27 /// Fields - Contains all FieldDecls collected during parsing of a C++ 28 /// class. When a nested class is entered, its fields are appended to the 29 /// fields of its parent class, when it is exited its fields are removed. 30 SmallVector<FieldDecl*, 32> Fields; 31 32 /// FieldCount - Each entry represents the number of fields collected during 33 /// the parsing of a C++ class. When a nested class is entered, a new field 34 /// count is pushed, when it is exited, the field count is popped. 35 SmallVector<size_t, 4> FieldCount; 36 37 // Example: 38 // 39 // class C { 40 // int x,y; 41 // class NC { 42 // int q; 43 // // At this point, Fields contains [x,y,q] decls and FieldCount contains 44 // // [2,1]. 45 // }; 46 // int z; 47 // // At this point, Fields contains [x,y,z] decls and FieldCount contains 48 // // [3]. 49 // }; 50 51 public: 52 /// StartClass - Called by Sema::ActOnStartCXXClassDef. StartClass()53 void StartClass() { FieldCount.push_back(0); } 54 55 /// Add - Called by Sema::ActOnCXXMemberDeclarator. Add(FieldDecl * D)56 void Add(FieldDecl *D) { 57 Fields.push_back(D); 58 ++FieldCount.back(); 59 } 60 61 /// getCurNumField - The number of fields added to the currently parsed class. getCurNumFields()62 size_t getCurNumFields() const { 63 assert(!FieldCount.empty() && "no currently-parsed class"); 64 return FieldCount.back(); 65 } 66 67 /// getCurFields - Pointer to array of fields added to the currently parsed 68 /// class. getCurFields()69 FieldDecl **getCurFields() { return &*(Fields.end() - getCurNumFields()); } 70 71 /// FinishClass - Called by Sema::ActOnFinishCXXClassDef. FinishClass()72 void FinishClass() { 73 Fields.resize(Fields.size() - getCurNumFields()); 74 FieldCount.pop_back(); 75 } 76 }; 77 78 } // end namespace clang 79 80 #endif 81