1 : //==============================================================================
2 : // File <$/src/cpp/dev/idlc/sym_container.cpp>
3 : // This file is part of YaOrb : Yet Another Object Request Broker,
4 : // Copyright (c) 2000-2003, Marc Alff.
5 : //
6 : // This program is free software; you can redistribute it and/or
7 : // modify it under the terms of the GNU General Public License
8 : // as published by the Free Software Foundation; either version 2
9 : // of the License, or (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License
17 : // along with this program; if not, write to the Free Software
18 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 : //
20 : //==============================================================================
21 :
22 : #include "src/cpp/prod/tool/DEVELOPMENT.h"
23 :
24 : #include "src/cpp/prod/tool/Assert.h"
25 :
26 : #include "src/cpp/dev/idlc/symbol.h"
27 : #include "src/cpp/dev/idlc/sym_container.h"
28 : #include "src/cpp/dev/idlc/context.h"
29 : #include "src/cpp/dev/idlc/yyutils.h"
30 :
31 3797 : SymbolContainer::SymbolContainer(Context *parent)
32 3797 : : _parent(parent), _subContexts(), _localSymbols()
33 : {}
34 :
35 3797 : SymbolContainer::~SymbolContainer()
36 : {
37 : // Do NOT delete _parent !
38 3797 : _subContexts.clearAndDestroy() ;
39 3797 : _localSymbols.clearAndDestroy() ;
40 0 : }
41 :
42 12845 : void SymbolContainer::addLocalSymbol(Symbol *s)
43 : {
44 : Symbol *duplicate = NULL ;
45 12845 : const String& name = s->GetName() ;
46 :
47 12845 : SymbolListIt it(_localSymbols) ;
48 285611 : while (it.GetNext())
49 : {
50 : duplicate = it.GetItem() ;
51 259922 : if (name == duplicate->GetName())
52 : {
53 1 : String error = "Symbol " ;
54 1 : error += name ;
55 1 : error += " is already defined in this scope." ;
56 1 : IDLCompileError(error) ;
57 0 : return ;
58 : }
59 : }
60 :
61 : _localSymbols.addTail(s) ;
62 : }
63 :
64 474 : void SymbolContainer::relocateLocalTail(Symbol *s)
65 : {
66 : ASSERT(s != NULL) ;
67 : _localSymbols.removeObject(s) ;
68 : _localSymbols.addTail(s) ;
69 : }
70 :
71 3734 : void SymbolContainer::addLocalContext(Context *c)
72 : {
73 : _subContexts.addTail(c) ;
74 : }
75 :
76 36228 : Context* SymbolContainer::GetParent(void) const
77 : {
78 : return _parent ;
79 : }
80 :
81 953 : const SymbolList& SymbolContainer::GetLocalSymbols(void) const
82 : {
83 : return _localSymbols ;
84 : }
85 :
86 0 : const ContextList& SymbolContainer::GetLocalContexts(void) const
87 : {
88 : return _subContexts ;
89 : }
90 :
91 17169 : Symbol *SymbolContainer::findLocalSymbol(const String& name)
92 : {
93 : Symbol *result = NULL ;
94 : Symbol *tmp = NULL ;
95 :
96 : SymbolListIt it(_localSymbols) ;
97 446584 : while (it.GetNext())
98 : {
99 : tmp = it.GetItem() ;
100 422087 : if (name == tmp->GetName())
101 : {
102 : result = tmp ;
103 : break ;
104 : }
105 : }
106 :
107 : return result ;
108 : }
109 :
110 944 : Context *SymbolContainer::findLocalContext(const String& name)
111 : {
112 : Context *result = NULL ;
113 : Context *tmp = NULL ;
114 :
115 : ContextListIt it(_subContexts) ;
116 11218 : while (it.GetNext())
117 : {
118 : tmp = it.GetItem() ;
119 10274 : if (name == tmp->GetName())
120 : {
121 : result = tmp ;
122 : break ;
123 : }
124 : }
125 :
126 : return result ;
127 : }
128 :
129 490 : Symbol* SymbolContainer::find(const Scope& scope)
130 : {
131 490 : const StringList& names = scope.GetNameList() ;
132 : int nbNames = names.size() ;
133 : String *name = NULL ;
134 : Symbol *result = NULL ;
135 : SymbolContainer *current = this ;
136 : SymbolContainer *context = NULL ;
137 :
138 : int nbContexts = nbNames ;
139 :
140 : StringListIt it(names) ;
141 1958 : while (it.GetNext())
142 : {
143 : name = it.GetItem() ;
144 978 : nbContexts -- ;
145 :
146 978 : if (nbContexts > 0)
147 : {
148 488 : context = current->findLocalContext(*name) ;
149 488 : if (context == NULL)
150 : {
151 : return NULL ;
152 : }
153 : else
154 : {
155 : current = context ;
156 : }
157 : }
158 : else
159 : {
160 : ASSERT(nbContexts == 0) ;
161 490 : result = current->findLocalSymbol(*name) ;
162 : }
163 : }
164 :
165 : return result ;
166 : }
167 :
168 69 : void SymbolContainer::print(std::ostream& str, const String& tab) const
169 : {
170 69 : String tab2(80) ;
171 :
172 69 : tab2 = tab ;
173 69 : tab2 += " " ;
174 : Symbol *symbol = NULL ;
175 : Context *context = NULL ;
176 :
177 69 : if (_localSymbols.size() != 0)
178 : {
179 61 : str << tab << "Local symbols (" << std::endl ;
180 : SymbolListIt its(_localSymbols) ;
181 630 : while (its.GetNext())
182 : {
183 : symbol = its.GetItem() ;
184 569 : str << tab2 ;
185 569 : symbol->print(str) ;
186 : str << std::endl ;
187 : }
188 61 : str << tab << ")" << std::endl ;
189 : }
190 :
191 69 : if (_subContexts.size() != 0)
192 : {
193 29 : str << tab << "Local contexts (" << std::endl ;
194 : ContextListIt itc(_subContexts) ;
195 83 : while (itc.GetNext())
196 : {
197 : context = itc.GetItem() ;
198 54 : context->print(str, tab2) ;
199 : }
200 29 : str << tab << ")" << std::endl ;
201 0 : }
202 63 : }
203 63 :
|