1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
/**
* Abstract Syntax Tree Node for a Member Value of an Annotation
*/
#include "ast_annotation_member.h"
#include "ast_type.h"
#include "utl_scope.h"
#include "ast_enum.h"
#include "ast_enum_val.h"
AST_Decl::NodeType const AST_Annotation_Member::NT =
AST_Decl::NT_annotation_member;
AST_Annotation_Member::AST_Annotation_Member (
AST_Expression::ExprType expr_type, AST_Type *type, UTL_ScopedName *name)
: AST_Decl (NT, name),
AST_Field (type, name, vis_NA),
expr_type_ (expr_type),
value_ (0)
{
}
AST_Annotation_Member::AST_Annotation_Member (
AST_Decl::NodeType nt,
AST_Expression::ExprType expr_type, AST_Type *type, UTL_ScopedName *name)
: AST_Decl (nt, name),
AST_Field (nt, type, name, vis_NA),
expr_type_ (expr_type),
value_ (0)
{
}
AST_Annotation_Member::AST_Annotation_Member (
UTL_ScopedName *name,
AST_Annotation_Member *other)
: AST_Decl (name, dynamic_cast<AST_Decl*>(other)),
AST_Field (name, dynamic_cast<AST_Field*>(other)),
expr_type_ (other->expr_type ()),
value_ (other->value () ?
new AST_Expression (other->value (), other->expr_type ()) : 0)
{
}
AST_Annotation_Member::~AST_Annotation_Member ()
{
delete value_;
}
void
AST_Annotation_Member::destroy ()
{
if (value_)
{
value_->destroy ();
}
AST_Field::destroy ();
}
IMPL_NARROW_FROM_DECL (AST_Annotation_Member);
IMPL_NARROW_FROM_SCOPE (AST_Annotation_Member);
void
AST_Annotation_Member::dump (ACE_OSTREAM_TYPE &o)
{
AST_Field::dump (o);
if (field_type () && value_)
{
dump_i (o, " default ");
if (field_type ()->node_type () == AST_Decl::NT_enum)
{
dynamic_cast<AST_Enum*> (field_type ())->
lookup_by_value (value_)->name ()->dump (o);
}
else
{
value_->dump (o);
}
}
}
AST_Expression *
AST_Annotation_Member::value ()
{
return value_;
}
void
AST_Annotation_Member::value (AST_Expression *value)
{
if (value_)
{
value_->destroy ();
delete value_;
}
value_ = value;
}
AST_Expression::ExprType
AST_Annotation_Member::expr_type ()
{
return expr_type_;
}
bool
AST_Annotation_Member::invalid_value ()
{
return !value () || !value ()->ev ();
}
|