Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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.
25
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
  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
  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