Skip to content

Commit e6fb3bf

Browse files
Pretty printing of java_class_typet
Added java_qualifierst that adds annotations as qualifiers to types
1 parent e22b95b commit e6fb3bf

File tree

9 files changed

+250
-13
lines changed

9 files changed

+250
-13
lines changed

src/ansi-c/c_qualifiers.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,27 @@ Author: Daniel Kroening, [email protected]
99
#include "c_qualifiers.h"
1010

1111
#include <ostream>
12+
#include <util/make_unique.h>
13+
14+
c_qualifierst &c_qualifierst::operator=(const c_qualifierst &other)
15+
{
16+
is_constant = other.is_constant;
17+
is_volatile = other.is_volatile;
18+
is_restricted = other.is_restricted;
19+
is_atomic = other.is_atomic;
20+
is_noreturn = other.is_noreturn;
21+
is_ptr32 = other.is_ptr32;
22+
is_ptr64 = other.is_ptr64;
23+
is_transparent_union = other.is_transparent_union;
24+
return *this;
25+
}
26+
27+
std::unique_ptr<c_qualifierst> c_qualifierst::clone() const
28+
{
29+
auto other = util_make_unique<c_qualifierst>();
30+
*other = *this;
31+
return other;
32+
}
1233

1334
std::string c_qualifierst::as_string() const
1435
{

src/ansi-c/c_qualifiers.h

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Author: Daniel Kroening, [email protected]
1111
#define CPROVER_ANSI_C_C_QUALIFIERS_H
1212

1313
#include <iosfwd>
14+
#include <memory>
1415

1516
#include <util/expr.h>
1617

@@ -28,7 +29,13 @@ class c_qualifierst
2829
read(src);
2930
}
3031

31-
void clear()
32+
c_qualifierst(const c_qualifierst &other) = delete;
33+
virtual c_qualifierst &operator=(const c_qualifierst &other);
34+
virtual std::unique_ptr<c_qualifierst> clone() const;
35+
36+
virtual ~c_qualifierst() = default;
37+
38+
virtual void clear()
3239
{
3340
is_constant=false;
3441
is_volatile=false;
@@ -50,13 +57,13 @@ class c_qualifierst
5057

5158
// will likely add alignment here as well
5259

53-
std::string as_string() const;
54-
void read(const typet &src);
55-
void write(typet &src) const;
60+
virtual std::string as_string() const;
61+
virtual void read(const typet &src);
62+
virtual void write(typet &src) const;
5663

5764
static void clear(typet &dest);
5865

59-
bool is_subset_of(const c_qualifierst &q) const
66+
virtual bool is_subset_of(const c_qualifierst &q) const
6067
{
6168
return (!is_constant || q.is_constant) &&
6269
(!is_volatile || q.is_volatile) &&
@@ -69,7 +76,7 @@ class c_qualifierst
6976
// is_transparent_union isn't checked
7077
}
7178

72-
bool operator==(const c_qualifierst &other) const
79+
virtual bool operator==(const c_qualifierst &other) const
7380
{
7481
return is_constant==other.is_constant &&
7582
is_volatile==other.is_volatile &&
@@ -86,7 +93,7 @@ class c_qualifierst
8693
return !(*this==other);
8794
}
8895

89-
c_qualifierst &operator+=(const c_qualifierst &b)
96+
virtual c_qualifierst &operator+=(const c_qualifierst &b)
9097
{
9198
is_constant|=b.is_constant;
9299
is_volatile|=b.is_volatile;
@@ -99,7 +106,7 @@ class c_qualifierst
99106
return *this;
100107
}
101108

102-
unsigned count() const
109+
virtual std::size_t count() const
103110
{
104111
return is_constant+is_volatile+is_restricted+is_atomic+
105112
is_ptr32+is_ptr64+is_noreturn;

src/ansi-c/expr2c.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,8 @@ std::string expr2ct::convert_rec(
165165
const c_qualifierst &qualifiers,
166166
const std::string &declarator)
167167
{
168-
c_qualifierst new_qualifiers(qualifiers);
168+
std::unique_ptr<c_qualifierst> clone = qualifiers.clone();
169+
c_qualifierst &new_qualifiers = *clone;
169170
new_qualifiers.read(src);
170171

171172
std::string q=new_qualifiers.as_string();

src/cpp/expr2cpp.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ std::string expr2cppt::convert_rec(
132132
const c_qualifierst &qualifiers,
133133
const std::string &declarator)
134134
{
135-
c_qualifierst new_qualifiers(qualifiers);
135+
std::unique_ptr<c_qualifierst> clone = qualifiers.clone();
136+
c_qualifierst &new_qualifiers = *clone;
136137
new_qualifiers.read(src);
137138

138139
const std::string d=

src/java_bytecode/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ SRC = bytecode_info.cpp \
2323
java_local_variable_table.cpp \
2424
java_object_factory.cpp \
2525
java_pointer_casts.cpp \
26+
java_qualifiers.cpp \
2627
java_root_class.cpp \
2728
java_static_initializers.cpp \
2829
java_string_library_preprocess.cpp \

src/java_bytecode/expr2java.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,22 @@ Author: Daniel Kroening, [email protected]
1919
#include <util/arith_tools.h>
2020
#include <util/ieee_float.h>
2121

22-
#include <ansi-c/c_qualifiers.h>
2322
#include <ansi-c/c_misc.h>
2423
#include <ansi-c/expr2c_class.h>
2524

25+
#include "java_qualifiers.h"
2626
#include "java_types.h"
2727

28+
std::string expr2javat::convert(const typet &src)
29+
{
30+
return convert_rec(src, java_qualifierst(ns), "");
31+
}
32+
33+
std::string expr2javat::convert(const exprt &src)
34+
{
35+
return expr2ct::convert(src);
36+
}
37+
2838
std::string expr2javat::convert_code_function_call(
2939
const code_function_callt &src,
3040
unsigned indent)
@@ -244,7 +254,8 @@ std::string expr2javat::convert_rec(
244254
const c_qualifierst &qualifiers,
245255
const std::string &declarator)
246256
{
247-
c_qualifierst new_qualifiers(qualifiers);
257+
std::unique_ptr<c_qualifierst> clone = qualifiers.clone();
258+
c_qualifierst &new_qualifiers = *clone;
248259
new_qualifiers.read(src);
249260

250261
const std::string d=
@@ -307,7 +318,7 @@ std::string expr2javat::convert_rec(
307318
const typet &return_type=code_type.return_type();
308319
dest+=" -> "+convert(return_type);
309320

310-
return dest;
321+
return q + dest;
311322
}
312323
else
313324
return expr2ct::convert_rec(src, qualifiers, declarator);

src/java_bytecode/expr2java.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ class expr2javat:public expr2ct
2020
{
2121
public:
2222
explicit expr2javat(const namespacet &_ns):expr2ct(_ns) { }
23+
virtual std::string convert(const typet &src) override;
24+
virtual std::string convert(const exprt &src) override;
2325

2426
protected:
2527
virtual std::string convert_with_precedence(

src/java_bytecode/java_qualifiers.cpp

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
// Author: Diffblue Ltd.
2+
3+
/// \file
4+
/// Java-specific type qualifiers
5+
6+
#include "java_qualifiers.h"
7+
#include <sstream>
8+
#include <util/make_unique.h>
9+
#include "expr2java.h"
10+
11+
12+
java_qualifierst &java_qualifierst::operator=(const java_qualifierst &other)
13+
{
14+
INVARIANT(
15+
&other.ns == &ns,
16+
"Can only assign from a java_qualifierst using the same namespace");
17+
annotations = other.annotations;
18+
c_qualifierst::operator=(other);
19+
return *this;
20+
}
21+
22+
java_qualifierst &java_qualifierst::operator=(java_qualifierst &&other)
23+
{
24+
INVARIANT(
25+
&other.ns == &ns,
26+
"Can only assign from a java_qualifierst using the same namespace");
27+
annotations = std::move(other.annotations);
28+
c_qualifierst::operator=(other);
29+
return *this;
30+
}
31+
32+
c_qualifierst &java_qualifierst::operator=(const c_qualifierst &c_other)
33+
{
34+
auto other = dynamic_cast<const java_qualifierst *>(&c_other);
35+
if(other != nullptr)
36+
*this = *other;
37+
else
38+
{
39+
annotations.clear();
40+
c_qualifierst::operator=(c_other);
41+
}
42+
return *this;
43+
}
44+
45+
std::unique_ptr<c_qualifierst> java_qualifierst::clone() const
46+
{
47+
auto other = util_make_unique<java_qualifierst>(ns);
48+
*other = *this;
49+
return std::move(other);
50+
}
51+
52+
std::size_t java_qualifierst::count() const
53+
{
54+
return c_qualifierst::count() + annotations.size();
55+
}
56+
57+
void java_qualifierst::clear()
58+
{
59+
c_qualifierst::clear();
60+
annotations.clear();
61+
}
62+
63+
void java_qualifierst::read(const typet &src)
64+
{
65+
c_qualifierst::read(src);
66+
auto &annotated_type = static_cast<const annotated_typet &>(src);
67+
annotations = annotated_type.get_annotations();
68+
}
69+
70+
void java_qualifierst::write(typet &src) const
71+
{
72+
c_qualifierst::write(src);
73+
auto &annotated_type = static_cast<annotated_typet &>(src);
74+
annotated_type.get_annotations() = annotations;
75+
}
76+
77+
c_qualifierst &java_qualifierst::operator+=(const c_qualifierst &c_other)
78+
{
79+
c_qualifierst::operator+=(c_other);
80+
auto other = dynamic_cast<const java_qualifierst *>(&c_other);
81+
if(other != nullptr)
82+
{
83+
std::copy(
84+
other->annotations.begin(),
85+
other->annotations.end(),
86+
std::back_inserter(annotations));
87+
}
88+
return *this;
89+
}
90+
91+
bool java_qualifierst::operator==(const c_qualifierst &c_other) const
92+
{
93+
auto other = dynamic_cast<const java_qualifierst *>(&c_other);
94+
if(other == nullptr)
95+
return false;
96+
return
97+
c_qualifierst::operator==(c_other) && annotations == other->annotations;
98+
}
99+
100+
bool java_qualifierst::is_subset_of(const c_qualifierst &c_other) const
101+
{
102+
if(!c_qualifierst::is_subset_of(c_other))
103+
return false;
104+
auto other = dynamic_cast<const java_qualifierst *>(&c_other);
105+
if(other == nullptr)
106+
return annotations.empty();
107+
auto &other_a = other->annotations;
108+
for(const auto &annotation : annotations)
109+
{
110+
if(std::find(other_a.begin(), other_a.end(), annotation) == other_a.end())
111+
return false;
112+
}
113+
return true;
114+
}
115+
116+
std::string java_qualifierst::as_string() const
117+
{
118+
std::stringstream out;
119+
for(const java_annotationt &annotation : annotations)
120+
{
121+
out << '@';
122+
out << annotation.get_type().subtype().get(ID_identifier);
123+
124+
if(!annotation.get_values().empty())
125+
{
126+
out << '(';
127+
128+
bool first = true;
129+
for(const java_annotationt::valuet &value : annotation.get_values())
130+
{
131+
if(first)
132+
first = false;
133+
else
134+
out << ", ";
135+
136+
out << '"' << value.get_name() << '"' << '=';
137+
out << expr2java(value.get_value(), ns);
138+
}
139+
140+
out << ')';
141+
}
142+
out << ' ';
143+
}
144+
out << c_qualifierst::as_string();
145+
return out.str();
146+
}

src/java_bytecode/java_qualifiers.h

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// Author: Diffblue Ltd.
2+
3+
/// \file
4+
/// Java-specific type qualifiers
5+
6+
#ifndef CPROVER_JAVA_BYTECODE_JAVA_QUALIFIERS_H
7+
#define CPROVER_JAVA_BYTECODE_JAVA_QUALIFIERS_H
8+
9+
#include "java_types.h"
10+
#include <ansi-c/c_qualifiers.h>
11+
12+
class java_qualifierst : public c_qualifierst
13+
{
14+
private:
15+
const namespacet &ns;
16+
std::vector<java_annotationt> annotations;
17+
18+
public:
19+
explicit java_qualifierst(const namespacet &ns)
20+
: ns(ns)
21+
{}
22+
23+
java_qualifierst &operator=(const java_qualifierst &other);
24+
java_qualifierst &operator=(java_qualifierst &&other);
25+
virtual c_qualifierst &operator=(const c_qualifierst &other) override;
26+
virtual std::unique_ptr<c_qualifierst> clone() const override;
27+
28+
virtual c_qualifierst &operator+=(const c_qualifierst &other) override;
29+
30+
const std::vector<java_annotationt> &get_annotations() const
31+
{
32+
return annotations;
33+
}
34+
virtual std::size_t count() const override;
35+
36+
virtual void clear() override;
37+
38+
virtual void read(const typet &src) override;
39+
virtual void write(typet &src) const override;
40+
41+
virtual bool is_subset_of(const c_qualifierst &other) const override;
42+
virtual bool operator==(const c_qualifierst &other) const override;
43+
44+
virtual std::string as_string() const override;
45+
};
46+
47+
#endif // CPROVER_JAVA_BYTECODE_JAVA_QUALIFIERS_H

0 commit comments

Comments
 (0)