Sync with 5.4.2
[deliverable/titan.core.git] / compiler2 / CompField.cc
CommitLineData
970ed795 1///////////////////////////////////////////////////////////////////////////////
3abe9331 2// Copyright (c) 2000-2015 Ericsson Telecom AB
970ed795
EL
3// All rights reserved. This program and the accompanying materials
4// are made available under the terms of the Eclipse Public License v1.0
5// which accompanies this distribution, and is available at
6// http://www.eclipse.org/legal/epl-v10.html
7///////////////////////////////////////////////////////////////////////////////
8#include "CompField.hh"
9#include "Type.hh"
10#include "Value.hh"
11#include "CompilerError.hh"
12
13namespace Common {
14
15// =================================
16// ===== CompField
17// =================================
18
19CompField::CompField(Identifier *p_name, Type *p_type, bool p_is_optional,
20 Value *p_defval)
21 : Node(), Location(), name(p_name), type(p_type),
22 is_optional(p_is_optional), defval(p_defval), rawattrib(0)
23{
24 if(!p_name || !p_type)
25 FATAL_ERROR("NULL parameter: Common::CompField::CompField()");
26 type->set_ownertype(Type::OT_COMP_FIELD, this);
27}
28
29CompField::CompField(const CompField& p)
30 : Node(p), Location(p), is_optional(p.is_optional), rawattrib(0)
31{
32 name=p.name->clone();
33 type=p.type->clone();
34 type->set_ownertype(Type::OT_COMP_FIELD, this);
35 defval=p.defval?p.defval->clone():0;
36}
37
38CompField::~CompField()
39{
40 delete name;
41 delete type;
42 delete defval;
43 delete rawattrib;
44}
45
46CompField *CompField::clone() const
47{
48 return new CompField(*this);
49}
50
51void CompField::set_fullname(const string& p_fullname)
52{
53 string base_name(p_fullname + "." + name->get_dispname());
54 Node::set_fullname(base_name);
55 type->set_fullname(base_name);
56 if (defval) defval->set_fullname(base_name + ".<defval>");
57}
58
59void CompField::set_my_scope(Scope *p_scope)
60{
61 type->set_my_scope(p_scope);
62 if (defval) defval->set_my_scope(p_scope);
63}
64
65void CompField::set_raw_attrib(RawAST* r_attr)
66{
67 delete rawattrib;
68 rawattrib=r_attr;
69}
70
71void CompField::dump(unsigned level) const
72{
73 name->dump(level);
74 type->dump(level + 1);
75 if(is_optional)
76 DEBUG(level + 1, "optional");
77 if(defval) {
78 DEBUG(level + 1, "with default value");
79 defval->dump(level + 2);
80 }
81}
82
83// =================================
84// ===== CompFieldMap
85// =================================
86
87CompFieldMap::CompFieldMap(const CompFieldMap& p)
88 : Node(p), my_type(0), checked(false)
89{
90 size_t nof_comps = p.v.size();
91 for (size_t i = 0; i < nof_comps; i++) v.add(p.v[i]->clone());
92}
93
94CompFieldMap::~CompFieldMap()
95{
96 size_t nof_comps = v.size();
97 for (size_t i = 0; i < nof_comps; i++) delete v[i];
98 v.clear();
99 m.clear();
100}
101
102CompFieldMap *CompFieldMap::clone() const
103{
104 return new CompFieldMap(*this);
105}
106
107void CompFieldMap::set_fullname(const string& p_fullname)
108{
109 Node::set_fullname(p_fullname);
110 size_t nof_comps = v.size();
111 for (size_t i = 0; i < nof_comps; i++) v[i]->set_fullname(p_fullname);
112}
113
114void CompFieldMap::set_my_scope(Scope *p_scope)
115{
116 size_t nof_comps = v.size();
117 for (size_t i = 0; i < nof_comps; i++) v[i]->set_my_scope(p_scope);
118}
119
120void CompFieldMap::add_comp(CompField *comp)
121{
122 v.add(comp);
123 if (checked) {
124 const string& name = comp->get_name().get_name();
125 if (m.has_key(name)) FATAL_ERROR("CompFieldMap::add_comp(%s)", name.c_str());
126 m.add(name, comp);
127 }
128}
129
130bool CompFieldMap::has_comp_withName(const Identifier& p_name)
131{
132 if (!checked) chk_uniq();
133 return m.has_key(p_name.get_name());
134}
135
136CompField* CompFieldMap::get_comp_byName(const Identifier& p_name)
137{
138 if (!checked) chk_uniq();
139 return m[p_name.get_name()];
140}
141
142const char *CompFieldMap::get_typetype_name() const
143{
144 if (!my_type) FATAL_ERROR("CompFieldMap::get_typetype_name()");
145 switch (my_type->get_typetype()) {
146 case Type::T_ANYTYPE:
147 return "anytype";
148 case Type::T_CHOICE_T:
149 return "union";
150 case Type::T_SEQ_T:
151 return "record";
152 case Type::T_SET_T:
153 return "set";
154 case Type::T_OPENTYPE:
155 return "open type";
156 default:
157 return "<unknown>";
158 }
159}
160
161void CompFieldMap::chk_uniq()
162{
163 if (checked) return;
164 const char *typetype_name = get_typetype_name();
165 size_t nof_comps = v.size();
166 for (size_t i = 0; i < nof_comps; i++) {
167 CompField *comp = v[i];
168 const Identifier& id = comp->get_name();
169 const string& name = id.get_name();
170 if (m.has_key(name)) {
171 const char *dispname = id.get_dispname().c_str();
172 comp->error("Duplicate %s field name `%s'", typetype_name, dispname);
173 m[name]->note("Field `%s' is already defined here", dispname);
174 } else m.add(name, comp);
175 }
176 checked = true;
177}
178
179void CompFieldMap::chk()
180{
181 if (!checked) chk_uniq();
182 const char *typetype_name = get_typetype_name();
183 size_t nof_comps = v.size();
184 for (size_t i = 0; i < nof_comps; i++) {
185 CompField *comp = v[i];
186 const Identifier& id = comp->get_name();
187 Error_Context cntxt(comp, "In %s field `%s'", typetype_name,
188 id.get_dispname().c_str());
189 Type *t = comp->get_type();
190 t->set_genname(my_type->get_genname_own(), id.get_name());
191 t->set_parent_type(my_type);
192 t->chk();
193 t->chk_embedded(true, "embedded into another type");
194 }
195}
196
197void CompFieldMap::dump(unsigned level) const
198{
199 size_t nof_comps = v.size();
200 DEBUG(level, "component fields: (%lu pcs.) @ %p",
201 (unsigned long) nof_comps, (const void*)this);
202 for (size_t i = 0; i < nof_comps; i++) v[i]->dump(level + 1);
203}
204
205} /* namespace Common */
This page took 0.038204 seconds and 5 git commands to generate.