clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
//===- CXXFieldCollector.h - Utility class for C++ class semantic analysis ===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// 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 "clang/Basic/LLVM.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.
|
|
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.
|
|
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
|