summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/ast/ast_annotation_member.cpp
blob: d15d73b557a4982326b7fdb24a2bacc4f9507ef0 (plain)
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 ();
}