80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
//===- 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
|