 |
|
 |
|
| Files: |
1 |
|
Branches Taken: |
0.0% |
0 / 0 |
| Generated: |
2010-02-10 01:31 |
|
Branches Executed: |
0.0% |
0 / 0 |
| |
|
Line Coverage: |
100.0% |
12 / 12 |
| |
 |
|
 |
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 "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 1696: 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 : llvm::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 : llvm::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 3394: void StartClass() { FieldCount.push_back(0); }
53 :
54 : /// Add - Called by Sema::ActOnCXXMemberDeclarator.
55 1591: void Add(FieldDecl *D) {
56 1591: Fields.push_back(D);
57 1591: ++FieldCount.back();
58 1591: }
59 :
60 : /// getCurNumField - The number of fields added to the currently parsed class.
61 10182: size_t getCurNumFields() const { return FieldCount.back(); }
62 :
63 : /// getCurFields - Pointer to array of fields added to the currently parsed
64 : /// class.
65 3394: FieldDecl **getCurFields() { return &*(Fields.end() - getCurNumFields()); }
66 :
67 : /// FinishClass - Called by Sema::ActOnFinishCXXClassDef.
68 3394: void FinishClass() {
69 3394: Fields.resize(Fields.size() - getCurNumFields());
70 3394: FieldCount.pop_back();
71 3394: }
72 : };
73 :
74 : } // end namespace clang
75 :
76 : #endif
Generated: 2010-02-10 01:31 by zcov