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