clang  10.0.0svn
CXXFieldCollector.h
Go to the documentation of this file.
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.
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.
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
void FinishClass()
FinishClass - Called by Sema::ActOnFinishCXXClassDef.
CXXFieldCollector - Used to keep track of CXXFieldDecls during parsing of C++ classes.
size_t getCurNumFields() const
getCurNumField - The number of fields added to the currently parsed class.
void StartClass()
StartClass - Called by Sema::ActOnStartCXXClassDef.
Represents a member of a struct/union/class.
Definition: Decl.h:2643
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
void Add(FieldDecl *D)
Add - Called by Sema::ActOnCXXMemberDeclarator.
Dataflow Directional Tag Classes.
FieldDecl ** getCurFields()
getCurFields - Pointer to array of fields added to the currently parsed class.