cprover
cpp_id.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: C++ Language Type Checking
4 
5 Author: Daniel Kroening, kroening@cs.cmu.edu
6 
7 \*******************************************************************/
8 
11 
12 #include "cpp_id.h"
13 
14 #include <ostream>
15 
16 #include <util/invariant.h>
17 
18 #include "cpp_scope.h"
19 
21  is_member(false),
22  is_method(false),
23  is_static_member(false),
24  is_scope(false),
25  is_constructor(false),
26  id_class(id_classt::UNKNOWN),
27  this_expr(static_cast<const exprt &>(get_nil_irep())),
28  compound_counter(0),
29  parent(nullptr)
30 {
31 }
32 
33 void cpp_idt::print(std::ostream &out, unsigned indent) const
34 {
35  print_fields(out, indent);
36 
37  if(!sub.empty())
38  {
39  for(const auto &s : sub)
40  s.second.print(out, indent + 2);
41 
42  out << '\n';
43  }
44 }
45 
46 void cpp_idt::print_fields(std::ostream &out, unsigned indent) const
47 {
48  out << std::string(indent, ' ');
49  out << "**identifier=" << identifier << '\n';
50 
51  out << std::string(indent, ' ');
52  out << " prefix=" << prefix << '\n';
53 
54  out << std::string(indent, ' ');
55  out << " suffix=" << suffix << '\n';
56 
57  out << std::string(indent, ' ');
58  out << " base_name=" << base_name << '\n';
59 
60  out << std::string(indent, ' ');
61  out << " method=" << is_method << '\n';
62 
63  out << std::string(indent, ' ');
64  out << " class_identifier=" << class_identifier << '\n';
65 
66  for(const auto &s : secondary_scopes)
67  {
68  out << std::string(indent, ' ');
69  out << " secondary_scope=" << s->identifier << '\n';
70  }
71 
72  for(const auto &s : using_scopes)
73  {
74  out << std::string(indent, ' ');
75  out << " using_scope=" << s->identifier << '\n';
76  }
77 
78  out << std::string(indent, ' ');
79  out << " flags:";
80  if(is_constructor)
81  out << " constructor";
82  if(is_scope)
83  out << " scope";
84  if(is_member)
85  out << " member";
87  out << " static_member";
88  out << '\n';
89 
90  out << std::string(indent, ' ');
91  out << " id_class=" << id_class << '\n';
92 }
93 
94 std::ostream &operator<<(std::ostream &out, const cpp_idt &cpp_id)
95 {
96  cpp_id.print(out, 0);
97  return out;
98 }
99 
100 std::ostream &operator<<(std::ostream &out, const cpp_idt::id_classt &id_class)
101 {
102  // clang-format off
103  switch(id_class)
104  {
105  case cpp_idt::id_classt::UNKNOWN: return out<<"UNKNOWN";
106  case cpp_idt::id_classt::SYMBOL: return out<<"SYMBOL";
107  case cpp_idt::id_classt::TYPEDEF: return out<<"TYPEDEF";
108  case cpp_idt::id_classt::CLASS: return out<<"CLASS";
109  case cpp_idt::id_classt::TEMPLATE: return out<<"TEMPLATE";
110  case cpp_idt::id_classt::TEMPLATE_PARAMETER:return out<<"TEMPLATE_PARAMETER";
111  case cpp_idt::id_classt::ROOT_SCOPE: return out<<"ROOT_SCOPE";
112  case cpp_idt::id_classt::BLOCK_SCOPE: return out<<"BLOCK_SCOPE";
113  case cpp_idt::id_classt::TEMPLATE_SCOPE: return out<<"TEMPLATE_SCOPE";
114  case cpp_idt::id_classt::NAMESPACE: return out<<"NAMESPACE";
115  case cpp_idt::id_classt::ENUM: return out<<"ENUM";
116  }
117  // clang-format on
118 
119  UNREACHABLE;
120 }
UNREACHABLE
#define UNREACHABLE
This should be used to mark dead code.
Definition: invariant.h:504
cpp_idt::class_identifier
irep_idt class_identifier
Definition: cpp_id.h:81
cpp_scope.h
C++ Language Type Checking.
cpp_idt::id_classt::CLASS
@ CLASS
cpp_idt::id_classt::UNKNOWN
@ UNKNOWN
cpp_idt::id_classt::TEMPLATE
@ TEMPLATE
cpp_idt::identifier
irep_idt identifier
Definition: cpp_id.h:78
invariant.h
exprt
Base class for all expressions.
Definition: expr.h:53
cpp_idt::suffix
std::string suffix
Definition: cpp_id.h:85
cpp_idt::id_classt::BLOCK_SCOPE
@ BLOCK_SCOPE
cpp_idt::sub
cpp_id_mapt sub
Definition: cpp_id.h:110
cpp_idt
Definition: cpp_id.h:29
cpp_idt::id_classt
id_classt
Definition: cpp_id.h:34
cpp_idt::is_scope
bool is_scope
Definition: cpp_id.h:49
cpp_idt::is_method
bool is_method
Definition: cpp_id.h:48
cpp_idt::id_classt::SYMBOL
@ SYMBOL
cpp_idt::secondary_scopes
scope_listt secondary_scopes
Definition: cpp_id.h:114
file_typet::UNKNOWN
@ UNKNOWN
cpp_idt::id_classt::TEMPLATE_PARAMETER
@ TEMPLATE_PARAMETER
cpp_idt::is_constructor
bool is_constructor
Definition: cpp_id.h:49
cpp_idt::id_classt::ROOT_SCOPE
@ ROOT_SCOPE
cpp_idt::is_member
bool is_member
Definition: cpp_id.h:48
cpp_idt::id_classt::TEMPLATE_SCOPE
@ TEMPLATE_SCOPE
cpp_idt::using_scopes
scope_listt using_scopes
Definition: cpp_id.h:114
operator<<
std::ostream & operator<<(std::ostream &out, const cpp_idt &cpp_id)
Definition: cpp_id.cpp:94
cpp_idt::print_fields
void print_fields(std::ostream &out, unsigned indent=0) const
Definition: cpp_id.cpp:46
cpp_idt::id_classt::TYPEDEF
@ TYPEDEF
cpp_idt::is_static_member
bool is_static_member
Definition: cpp_id.h:48
cpp_idt::id_class
id_classt id_class
Definition: cpp_id.h:51
cpp_idt::cpp_idt
cpp_idt()
Definition: cpp_id.cpp:20
cpp_idt::prefix
std::string prefix
Definition: cpp_id.h:85
get_nil_irep
const irept & get_nil_irep()
Definition: irep.cpp:26
is_constructor
static bool is_constructor(const irep_idt &method_name)
Definition: java_bytecode_convert_method.cpp:128
cpp_idt::print
void print(std::ostream &out, unsigned indent=0) const
Definition: cpp_id.cpp:33
cpp_idt::base_name
irep_idt base_name
Definition: cpp_id.h:78
cpp_idt::id_classt::ENUM
@ ENUM
cpp_idt::id_classt::NAMESPACE
@ NAMESPACE
cpp_id.h
C++ Language Type Checking.