Home | History | Annotate | Download | only in Sema
      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.
     53   void StartClass() { FieldCount.push_back(0); }
     54 
     55   /// Add - Called by Sema::ActOnCXXMemberDeclarator.
     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.
     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.
     69   FieldDecl **getCurFields() { return &*(Fields.end() - getCurNumFields()); }
     70 
     71   /// FinishClass - Called by Sema::ActOnFinishCXXClassDef.
     72   void FinishClass() {
     73     Fields.resize(Fields.size() - getCurNumFields());
     74     FieldCount.pop_back();
     75   }
     76 };
     77 
     78 } // end namespace clang
     79 
     80 #endif
     81