annotate generator/parser/binder.cpp @ 414:b2a803c73b89 default tip

Declare tabArray const.
author David Nadlinger <code@klickverbot.at>
date Fri, 06 May 2011 13:39:49 +0200
parents 09a0f1d048f2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
e78566595089 initial import
mandel
parents:
diff changeset
1 /****************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
2 **
52
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
3 ** Copyright (C) 1992-2009 Nokia. All rights reserved.
1
e78566595089 initial import
mandel
parents:
diff changeset
4 ** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
e78566595089 initial import
mandel
parents:
diff changeset
5 **
e78566595089 initial import
mandel
parents:
diff changeset
6 ** This file is part of Qt Jambi.
e78566595089 initial import
mandel
parents:
diff changeset
7 **
52
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
8 ** Commercial Usage
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
9 Licensees holding valid Qt Commercial licenses may use this file in
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
10 accordance with the Qt Commercial License Agreement provided with the
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
11 Software or, alternatively, in accordance with the terms contained in
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
12 a written agreement between you and Nokia.
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
13
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
14 GNU Lesser General Public License Usage
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
15 Alternatively, this file may be used under the terms of the GNU Lesser
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
16 General Public License version 2.1 as published by the Free Software
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
17 Foundation and appearing in the file LICENSE.LGPL included in the
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
18 packaging of this file. Please review the following information to
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
19 ensure the GNU Lesser General Public License version 2.1 requirements
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
20 will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
21
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
22 In addition, as a special exception, Nokia gives you certain
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
23 additional rights. These rights are described in the Nokia Qt LGPL
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
24 Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
25 package.
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
26
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
27 GNU General Public License Usage
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
28 Alternatively, this file may be used under the terms of the GNU
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
29 General Public License version 3.0 as published by the Free Software
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
30 Foundation and appearing in the file LICENSE.GPL included in the
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
31 packaging of this file. Please review the following information to
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
32 ensure the GNU General Public License version 3.0 requirements will be
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
33 met: http://www.gnu.org/copyleft/gpl.html.
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
34
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
35 If you are unsure which license is appropriate for your use, please
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
36 contact the sales department at qt-sales@nokia.com.
1
e78566595089 initial import
mandel
parents:
diff changeset
37
e78566595089 initial import
mandel
parents:
diff changeset
38 **
e78566595089 initial import
mandel
parents:
diff changeset
39 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
e78566595089 initial import
mandel
parents:
diff changeset
40 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
e78566595089 initial import
mandel
parents:
diff changeset
41 **
e78566595089 initial import
mandel
parents:
diff changeset
42 ****************************************************************************/
e78566595089 initial import
mandel
parents:
diff changeset
43
e78566595089 initial import
mandel
parents:
diff changeset
44 #include "binder.h"
e78566595089 initial import
mandel
parents:
diff changeset
45 #include "lexer.h"
e78566595089 initial import
mandel
parents:
diff changeset
46 #include "control.h"
e78566595089 initial import
mandel
parents:
diff changeset
47 #include "symbol.h"
e78566595089 initial import
mandel
parents:
diff changeset
48 #include "codemodel_finder.h"
e78566595089 initial import
mandel
parents:
diff changeset
49 #include "class_compiler.h"
e78566595089 initial import
mandel
parents:
diff changeset
50 #include "compiler_utils.h"
e78566595089 initial import
mandel
parents:
diff changeset
51 #include "tokens.h"
e78566595089 initial import
mandel
parents:
diff changeset
52 #include "dumptree.h"
e78566595089 initial import
mandel
parents:
diff changeset
53
e78566595089 initial import
mandel
parents:
diff changeset
54 #include <iostream>
e78566595089 initial import
mandel
parents:
diff changeset
55
e78566595089 initial import
mandel
parents:
diff changeset
56 #include <qdebug.h>
e78566595089 initial import
mandel
parents:
diff changeset
57
e78566595089 initial import
mandel
parents:
diff changeset
58 void binder_default_message_handler(const std::string &str) {
e78566595089 initial import
mandel
parents:
diff changeset
59 std::cerr << str;
e78566595089 initial import
mandel
parents:
diff changeset
60 }
e78566595089 initial import
mandel
parents:
diff changeset
61
e78566595089 initial import
mandel
parents:
diff changeset
62 MessageHandler Binder::_M_message_handler = binder_default_message_handler;
e78566595089 initial import
mandel
parents:
diff changeset
63
e78566595089 initial import
mandel
parents:
diff changeset
64 Binder::Binder(CodeModel *__model, LocationManager &__location, Control *__control)
e78566595089 initial import
mandel
parents:
diff changeset
65 : _M_model(__model),
e78566595089 initial import
mandel
parents:
diff changeset
66 _M_location(__location),
e78566595089 initial import
mandel
parents:
diff changeset
67 _M_token_stream(&_M_location.token_stream),
e78566595089 initial import
mandel
parents:
diff changeset
68 _M_control(__control),
e78566595089 initial import
mandel
parents:
diff changeset
69 _M_current_function_type(CodeModel::Normal),
e78566595089 initial import
mandel
parents:
diff changeset
70 type_cc(this),
e78566595089 initial import
mandel
parents:
diff changeset
71 name_cc(this),
e78566595089 initial import
mandel
parents:
diff changeset
72 decl_cc(this)
e78566595089 initial import
mandel
parents:
diff changeset
73 {
e78566595089 initial import
mandel
parents:
diff changeset
74 _M_qualified_types["char"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
75 _M_qualified_types["double"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
76 _M_qualified_types["float"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
77 _M_qualified_types["int"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
78 _M_qualified_types["long"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
79 _M_qualified_types["short"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
80 _M_qualified_types["void"] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
81 }
e78566595089 initial import
mandel
parents:
diff changeset
82
e78566595089 initial import
mandel
parents:
diff changeset
83 Binder::~Binder()
e78566595089 initial import
mandel
parents:
diff changeset
84 {
e78566595089 initial import
mandel
parents:
diff changeset
85 }
e78566595089 initial import
mandel
parents:
diff changeset
86
e78566595089 initial import
mandel
parents:
diff changeset
87 FileModelItem Binder::run(AST *node)
e78566595089 initial import
mandel
parents:
diff changeset
88 {
e78566595089 initial import
mandel
parents:
diff changeset
89 FileModelItem old = _M_current_file;
e78566595089 initial import
mandel
parents:
diff changeset
90 _M_current_access = CodeModel::Public;
e78566595089 initial import
mandel
parents:
diff changeset
91
e78566595089 initial import
mandel
parents:
diff changeset
92 _M_current_file = model()->create<FileModelItem>();
e78566595089 initial import
mandel
parents:
diff changeset
93 updateItemPosition (_M_current_file->toItem(), node);
e78566595089 initial import
mandel
parents:
diff changeset
94 visit(node);
e78566595089 initial import
mandel
parents:
diff changeset
95 FileModelItem result = _M_current_file;
e78566595089 initial import
mandel
parents:
diff changeset
96
e78566595089 initial import
mandel
parents:
diff changeset
97 _M_current_file = old; // restore
e78566595089 initial import
mandel
parents:
diff changeset
98
e78566595089 initial import
mandel
parents:
diff changeset
99 return result;
e78566595089 initial import
mandel
parents:
diff changeset
100 }
e78566595089 initial import
mandel
parents:
diff changeset
101
e78566595089 initial import
mandel
parents:
diff changeset
102 ScopeModelItem Binder::currentScope()
e78566595089 initial import
mandel
parents:
diff changeset
103 {
e78566595089 initial import
mandel
parents:
diff changeset
104 if (_M_current_class)
e78566595089 initial import
mandel
parents:
diff changeset
105 return model_static_cast<ScopeModelItem>(_M_current_class);
e78566595089 initial import
mandel
parents:
diff changeset
106 else if (_M_current_namespace)
e78566595089 initial import
mandel
parents:
diff changeset
107 return model_static_cast<ScopeModelItem>(_M_current_namespace);
e78566595089 initial import
mandel
parents:
diff changeset
108
e78566595089 initial import
mandel
parents:
diff changeset
109 return model_static_cast<ScopeModelItem>(_M_current_file);
e78566595089 initial import
mandel
parents:
diff changeset
110 }
e78566595089 initial import
mandel
parents:
diff changeset
111
e78566595089 initial import
mandel
parents:
diff changeset
112 TemplateParameterList Binder::changeTemplateParameters(TemplateParameterList templateParameters)
e78566595089 initial import
mandel
parents:
diff changeset
113 {
e78566595089 initial import
mandel
parents:
diff changeset
114 TemplateParameterList old = _M_current_template_parameters;
e78566595089 initial import
mandel
parents:
diff changeset
115 _M_current_template_parameters = templateParameters;
e78566595089 initial import
mandel
parents:
diff changeset
116 return old;
e78566595089 initial import
mandel
parents:
diff changeset
117 }
e78566595089 initial import
mandel
parents:
diff changeset
118
e78566595089 initial import
mandel
parents:
diff changeset
119 CodeModel::FunctionType Binder::changeCurrentFunctionType(CodeModel::FunctionType functionType)
e78566595089 initial import
mandel
parents:
diff changeset
120 {
e78566595089 initial import
mandel
parents:
diff changeset
121 CodeModel::FunctionType old = _M_current_function_type;
e78566595089 initial import
mandel
parents:
diff changeset
122 _M_current_function_type = functionType;
e78566595089 initial import
mandel
parents:
diff changeset
123 return old;
e78566595089 initial import
mandel
parents:
diff changeset
124 }
e78566595089 initial import
mandel
parents:
diff changeset
125
e78566595089 initial import
mandel
parents:
diff changeset
126 CodeModel::AccessPolicy Binder::changeCurrentAccess(CodeModel::AccessPolicy accessPolicy)
e78566595089 initial import
mandel
parents:
diff changeset
127 {
e78566595089 initial import
mandel
parents:
diff changeset
128 CodeModel::AccessPolicy old = _M_current_access;
e78566595089 initial import
mandel
parents:
diff changeset
129 _M_current_access = accessPolicy;
e78566595089 initial import
mandel
parents:
diff changeset
130 return old;
e78566595089 initial import
mandel
parents:
diff changeset
131 }
e78566595089 initial import
mandel
parents:
diff changeset
132
e78566595089 initial import
mandel
parents:
diff changeset
133 NamespaceModelItem Binder::changeCurrentNamespace(NamespaceModelItem item)
e78566595089 initial import
mandel
parents:
diff changeset
134 {
e78566595089 initial import
mandel
parents:
diff changeset
135 NamespaceModelItem old = _M_current_namespace;
e78566595089 initial import
mandel
parents:
diff changeset
136 _M_current_namespace = item;
e78566595089 initial import
mandel
parents:
diff changeset
137 return old;
e78566595089 initial import
mandel
parents:
diff changeset
138 }
e78566595089 initial import
mandel
parents:
diff changeset
139
e78566595089 initial import
mandel
parents:
diff changeset
140 ClassModelItem Binder::changeCurrentClass(ClassModelItem item)
e78566595089 initial import
mandel
parents:
diff changeset
141 {
e78566595089 initial import
mandel
parents:
diff changeset
142 ClassModelItem old = _M_current_class;
e78566595089 initial import
mandel
parents:
diff changeset
143 _M_current_class = item;
e78566595089 initial import
mandel
parents:
diff changeset
144 return old;
e78566595089 initial import
mandel
parents:
diff changeset
145 }
e78566595089 initial import
mandel
parents:
diff changeset
146
e78566595089 initial import
mandel
parents:
diff changeset
147 FunctionDefinitionModelItem Binder::changeCurrentFunction(FunctionDefinitionModelItem item)
e78566595089 initial import
mandel
parents:
diff changeset
148 {
e78566595089 initial import
mandel
parents:
diff changeset
149 FunctionDefinitionModelItem old = _M_current_function;
e78566595089 initial import
mandel
parents:
diff changeset
150 _M_current_function = item;
e78566595089 initial import
mandel
parents:
diff changeset
151 return old;
e78566595089 initial import
mandel
parents:
diff changeset
152 }
e78566595089 initial import
mandel
parents:
diff changeset
153
e78566595089 initial import
mandel
parents:
diff changeset
154 int Binder::decode_token(std::size_t index) const
e78566595089 initial import
mandel
parents:
diff changeset
155 {
e78566595089 initial import
mandel
parents:
diff changeset
156 return _M_token_stream->kind(index);
e78566595089 initial import
mandel
parents:
diff changeset
157 }
e78566595089 initial import
mandel
parents:
diff changeset
158
e78566595089 initial import
mandel
parents:
diff changeset
159 CodeModel::AccessPolicy Binder::decode_access_policy(std::size_t index) const
e78566595089 initial import
mandel
parents:
diff changeset
160 {
e78566595089 initial import
mandel
parents:
diff changeset
161 switch (decode_token(index))
e78566595089 initial import
mandel
parents:
diff changeset
162 {
e78566595089 initial import
mandel
parents:
diff changeset
163 case Token_class:
e78566595089 initial import
mandel
parents:
diff changeset
164 return CodeModel::Private;
e78566595089 initial import
mandel
parents:
diff changeset
165
e78566595089 initial import
mandel
parents:
diff changeset
166 case Token_struct:
e78566595089 initial import
mandel
parents:
diff changeset
167 case Token_union:
e78566595089 initial import
mandel
parents:
diff changeset
168 return CodeModel::Public;
e78566595089 initial import
mandel
parents:
diff changeset
169
e78566595089 initial import
mandel
parents:
diff changeset
170 default:
e78566595089 initial import
mandel
parents:
diff changeset
171 return CodeModel::Public;
e78566595089 initial import
mandel
parents:
diff changeset
172 }
e78566595089 initial import
mandel
parents:
diff changeset
173 }
e78566595089 initial import
mandel
parents:
diff changeset
174
e78566595089 initial import
mandel
parents:
diff changeset
175 CodeModel::ClassType Binder::decode_class_type(std::size_t index) const
e78566595089 initial import
mandel
parents:
diff changeset
176 {
e78566595089 initial import
mandel
parents:
diff changeset
177 switch (decode_token(index))
e78566595089 initial import
mandel
parents:
diff changeset
178 {
e78566595089 initial import
mandel
parents:
diff changeset
179 case Token_class:
e78566595089 initial import
mandel
parents:
diff changeset
180 return CodeModel::Class;
e78566595089 initial import
mandel
parents:
diff changeset
181 case Token_struct:
e78566595089 initial import
mandel
parents:
diff changeset
182 return CodeModel::Struct;
e78566595089 initial import
mandel
parents:
diff changeset
183 case Token_union:
e78566595089 initial import
mandel
parents:
diff changeset
184 return CodeModel::Union;
e78566595089 initial import
mandel
parents:
diff changeset
185 default:
e78566595089 initial import
mandel
parents:
diff changeset
186 _M_message_handler("** WARNING unrecognized class type");
e78566595089 initial import
mandel
parents:
diff changeset
187 }
e78566595089 initial import
mandel
parents:
diff changeset
188 return CodeModel::Class;
e78566595089 initial import
mandel
parents:
diff changeset
189 }
e78566595089 initial import
mandel
parents:
diff changeset
190
e78566595089 initial import
mandel
parents:
diff changeset
191 const NameSymbol *Binder::decode_symbol(std::size_t index) const
e78566595089 initial import
mandel
parents:
diff changeset
192 {
e78566595089 initial import
mandel
parents:
diff changeset
193 return _M_token_stream->symbol(index);
e78566595089 initial import
mandel
parents:
diff changeset
194 }
e78566595089 initial import
mandel
parents:
diff changeset
195
e78566595089 initial import
mandel
parents:
diff changeset
196 void Binder::visitAccessSpecifier(AccessSpecifierAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
197 {
e78566595089 initial import
mandel
parents:
diff changeset
198 const ListNode<std::size_t> *it = node->specs;
e78566595089 initial import
mandel
parents:
diff changeset
199 if (it == 0)
e78566595089 initial import
mandel
parents:
diff changeset
200 return;
e78566595089 initial import
mandel
parents:
diff changeset
201
e78566595089 initial import
mandel
parents:
diff changeset
202 it = it->toFront();
e78566595089 initial import
mandel
parents:
diff changeset
203 const ListNode<std::size_t> *end = it;
e78566595089 initial import
mandel
parents:
diff changeset
204
e78566595089 initial import
mandel
parents:
diff changeset
205 do
e78566595089 initial import
mandel
parents:
diff changeset
206 {
e78566595089 initial import
mandel
parents:
diff changeset
207 switch (decode_token(it->element))
e78566595089 initial import
mandel
parents:
diff changeset
208 {
e78566595089 initial import
mandel
parents:
diff changeset
209 default:
e78566595089 initial import
mandel
parents:
diff changeset
210 break;
e78566595089 initial import
mandel
parents:
diff changeset
211
e78566595089 initial import
mandel
parents:
diff changeset
212 case Token_public:
e78566595089 initial import
mandel
parents:
diff changeset
213 changeCurrentAccess(CodeModel::Public);
e78566595089 initial import
mandel
parents:
diff changeset
214 changeCurrentFunctionType(CodeModel::Normal);
e78566595089 initial import
mandel
parents:
diff changeset
215 break;
e78566595089 initial import
mandel
parents:
diff changeset
216 case Token_protected:
e78566595089 initial import
mandel
parents:
diff changeset
217 changeCurrentAccess(CodeModel::Protected);
e78566595089 initial import
mandel
parents:
diff changeset
218 changeCurrentFunctionType(CodeModel::Normal);
e78566595089 initial import
mandel
parents:
diff changeset
219 break;
e78566595089 initial import
mandel
parents:
diff changeset
220 case Token_private:
e78566595089 initial import
mandel
parents:
diff changeset
221 changeCurrentAccess(CodeModel::Private);
e78566595089 initial import
mandel
parents:
diff changeset
222 changeCurrentFunctionType(CodeModel::Normal);
e78566595089 initial import
mandel
parents:
diff changeset
223 break;
e78566595089 initial import
mandel
parents:
diff changeset
224 case Token_signals:
e78566595089 initial import
mandel
parents:
diff changeset
225 changeCurrentAccess(CodeModel::Protected);
e78566595089 initial import
mandel
parents:
diff changeset
226 changeCurrentFunctionType(CodeModel::Signal);
e78566595089 initial import
mandel
parents:
diff changeset
227 break;
e78566595089 initial import
mandel
parents:
diff changeset
228 case Token_slots:
e78566595089 initial import
mandel
parents:
diff changeset
229 changeCurrentFunctionType(CodeModel::Slot);
e78566595089 initial import
mandel
parents:
diff changeset
230 break;
e78566595089 initial import
mandel
parents:
diff changeset
231 }
e78566595089 initial import
mandel
parents:
diff changeset
232 it = it->next;
e78566595089 initial import
mandel
parents:
diff changeset
233 }
e78566595089 initial import
mandel
parents:
diff changeset
234 while (it != end);
e78566595089 initial import
mandel
parents:
diff changeset
235 }
e78566595089 initial import
mandel
parents:
diff changeset
236
e78566595089 initial import
mandel
parents:
diff changeset
237 void Binder::visitSimpleDeclaration(SimpleDeclarationAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
238 {
e78566595089 initial import
mandel
parents:
diff changeset
239 visit(node->type_specifier);
e78566595089 initial import
mandel
parents:
diff changeset
240
e78566595089 initial import
mandel
parents:
diff changeset
241 if (const ListNode<InitDeclaratorAST*> *it = node->init_declarators)
e78566595089 initial import
mandel
parents:
diff changeset
242 {
e78566595089 initial import
mandel
parents:
diff changeset
243 it = it->toFront();
e78566595089 initial import
mandel
parents:
diff changeset
244 const ListNode<InitDeclaratorAST*> *end = it;
e78566595089 initial import
mandel
parents:
diff changeset
245 do
e78566595089 initial import
mandel
parents:
diff changeset
246 {
e78566595089 initial import
mandel
parents:
diff changeset
247 InitDeclaratorAST *init_declarator = it->element;
e78566595089 initial import
mandel
parents:
diff changeset
248 declare_symbol(node, init_declarator);
e78566595089 initial import
mandel
parents:
diff changeset
249 it = it->next;
e78566595089 initial import
mandel
parents:
diff changeset
250 }
e78566595089 initial import
mandel
parents:
diff changeset
251 while (it != end);
e78566595089 initial import
mandel
parents:
diff changeset
252 }
e78566595089 initial import
mandel
parents:
diff changeset
253 }
e78566595089 initial import
mandel
parents:
diff changeset
254
e78566595089 initial import
mandel
parents:
diff changeset
255 void Binder::declare_symbol(SimpleDeclarationAST *node, InitDeclaratorAST *init_declarator)
e78566595089 initial import
mandel
parents:
diff changeset
256 {
e78566595089 initial import
mandel
parents:
diff changeset
257 DeclaratorAST *declarator = init_declarator->declarator;
e78566595089 initial import
mandel
parents:
diff changeset
258
e78566595089 initial import
mandel
parents:
diff changeset
259 while (declarator && declarator->sub_declarator)
e78566595089 initial import
mandel
parents:
diff changeset
260 declarator = declarator->sub_declarator;
e78566595089 initial import
mandel
parents:
diff changeset
261
e78566595089 initial import
mandel
parents:
diff changeset
262 NameAST *id = declarator->id;
e78566595089 initial import
mandel
parents:
diff changeset
263 if (! declarator->id)
e78566595089 initial import
mandel
parents:
diff changeset
264 {
e78566595089 initial import
mandel
parents:
diff changeset
265 _M_message_handler("** WARNING expected a declarator id");
e78566595089 initial import
mandel
parents:
diff changeset
266 return;
e78566595089 initial import
mandel
parents:
diff changeset
267 }
e78566595089 initial import
mandel
parents:
diff changeset
268
e78566595089 initial import
mandel
parents:
diff changeset
269 CodeModelFinder finder(model(), this);
e78566595089 initial import
mandel
parents:
diff changeset
270 ScopeModelItem symbolScope = finder.resolveScope(id, currentScope());
e78566595089 initial import
mandel
parents:
diff changeset
271 if (! symbolScope)
e78566595089 initial import
mandel
parents:
diff changeset
272 {
e78566595089 initial import
mandel
parents:
diff changeset
273 name_cc.run(id);
e78566595089 initial import
mandel
parents:
diff changeset
274 _M_message_handler(std::string("** WARNING scope not found for symbol:") + qPrintable(name_cc.name()));
e78566595089 initial import
mandel
parents:
diff changeset
275 return;
e78566595089 initial import
mandel
parents:
diff changeset
276 }
e78566595089 initial import
mandel
parents:
diff changeset
277
e78566595089 initial import
mandel
parents:
diff changeset
278 decl_cc.run(declarator);
e78566595089 initial import
mandel
parents:
diff changeset
279
e78566595089 initial import
mandel
parents:
diff changeset
280 if (decl_cc.isFunction())
e78566595089 initial import
mandel
parents:
diff changeset
281 {
e78566595089 initial import
mandel
parents:
diff changeset
282 name_cc.run(id->unqualified_name);
e78566595089 initial import
mandel
parents:
diff changeset
283
e78566595089 initial import
mandel
parents:
diff changeset
284 FunctionModelItem fun = model()->create<FunctionModelItem>();
e78566595089 initial import
mandel
parents:
diff changeset
285 updateItemPosition (fun->toItem(), node);
e78566595089 initial import
mandel
parents:
diff changeset
286 fun->setAccessPolicy(_M_current_access);
e78566595089 initial import
mandel
parents:
diff changeset
287 fun->setFunctionType(_M_current_function_type);
e78566595089 initial import
mandel
parents:
diff changeset
288 fun->setName(name_cc.name());
e78566595089 initial import
mandel
parents:
diff changeset
289 fun->setAbstract(init_declarator->initializer != 0);
e78566595089 initial import
mandel
parents:
diff changeset
290 fun->setConstant(declarator->fun_cv != 0);
e78566595089 initial import
mandel
parents:
diff changeset
291 fun->setTemplateParameters(_M_current_template_parameters);
e78566595089 initial import
mandel
parents:
diff changeset
292 applyStorageSpecifiers(node->storage_specifiers, model_static_cast<MemberModelItem>(fun));
e78566595089 initial import
mandel
parents:
diff changeset
293 applyFunctionSpecifiers(node->function_specifiers, fun);
e78566595089 initial import
mandel
parents:
diff changeset
294
e78566595089 initial import
mandel
parents:
diff changeset
295 // build the type
e78566595089 initial import
mandel
parents:
diff changeset
296 TypeInfo typeInfo = CompilerUtils::typeDescription(node->type_specifier,
e78566595089 initial import
mandel
parents:
diff changeset
297 declarator,
e78566595089 initial import
mandel
parents:
diff changeset
298 this);
e78566595089 initial import
mandel
parents:
diff changeset
299
e78566595089 initial import
mandel
parents:
diff changeset
300 fun->setType(qualifyType(typeInfo, symbolScope->qualifiedName()));
e78566595089 initial import
mandel
parents:
diff changeset
301
e78566595089 initial import
mandel
parents:
diff changeset
302
e78566595089 initial import
mandel
parents:
diff changeset
303 fun->setVariadics (decl_cc.isVariadics ());
e78566595089 initial import
mandel
parents:
diff changeset
304
e78566595089 initial import
mandel
parents:
diff changeset
305 // ... and the signature
e78566595089 initial import
mandel
parents:
diff changeset
306 foreach (DeclaratorCompiler::Parameter p, decl_cc.parameters())
e78566595089 initial import
mandel
parents:
diff changeset
307 {
e78566595089 initial import
mandel
parents:
diff changeset
308 ArgumentModelItem arg = model()->create<ArgumentModelItem>();
e78566595089 initial import
mandel
parents:
diff changeset
309 arg->setType(qualifyType(p.type, _M_context));
e78566595089 initial import
mandel
parents:
diff changeset
310 arg->setName(p.name);
e78566595089 initial import
mandel
parents:
diff changeset
311 arg->setDefaultValue(p.defaultValue);
e78566595089 initial import
mandel
parents:
diff changeset
312 if (p.defaultValue)
e78566595089 initial import
mandel
parents:
diff changeset
313 arg->setDefaultValueExpression(p.defaultValueExpression);
e78566595089 initial import
mandel
parents:
diff changeset
314 fun->addArgument(arg);
e78566595089 initial import
mandel
parents:
diff changeset
315 }
e78566595089 initial import
mandel
parents:
diff changeset
316
e78566595089 initial import
mandel
parents:
diff changeset
317 fun->setScope(symbolScope->qualifiedName());
e78566595089 initial import
mandel
parents:
diff changeset
318 symbolScope->addFunction(fun);
e78566595089 initial import
mandel
parents:
diff changeset
319 }
e78566595089 initial import
mandel
parents:
diff changeset
320 else
e78566595089 initial import
mandel
parents:
diff changeset
321 {
e78566595089 initial import
mandel
parents:
diff changeset
322 VariableModelItem var = model()->create<VariableModelItem>();
e78566595089 initial import
mandel
parents:
diff changeset
323 updateItemPosition (var->toItem(), node);
e78566595089 initial import
mandel
parents:
diff changeset
324 var->setTemplateParameters(_M_current_template_parameters);
e78566595089 initial import
mandel
parents:
diff changeset
325 var->setAccessPolicy(_M_current_access);
e78566595089 initial import
mandel
parents:
diff changeset
326 name_cc.run(id->unqualified_name);
e78566595089 initial import
mandel
parents:
diff changeset
327 var->setName(name_cc.name());
e78566595089 initial import
mandel
parents:
diff changeset
328 TypeInfo typeInfo = CompilerUtils::typeDescription(node->type_specifier,
e78566595089 initial import
mandel
parents:
diff changeset
329 declarator,
e78566595089 initial import
mandel
parents:
diff changeset
330 this);
e78566595089 initial import
mandel
parents:
diff changeset
331 if (declarator != init_declarator->declarator
e78566595089 initial import
mandel
parents:
diff changeset
332 && init_declarator->declarator->parameter_declaration_clause != 0)
e78566595089 initial import
mandel
parents:
diff changeset
333 {
e78566595089 initial import
mandel
parents:
diff changeset
334 typeInfo.setFunctionPointer (true);
e78566595089 initial import
mandel
parents:
diff changeset
335 decl_cc.run (init_declarator->declarator);
e78566595089 initial import
mandel
parents:
diff changeset
336 foreach (DeclaratorCompiler::Parameter p, decl_cc.parameters())
e78566595089 initial import
mandel
parents:
diff changeset
337 typeInfo.addArgument(p.type);
e78566595089 initial import
mandel
parents:
diff changeset
338 }
e78566595089 initial import
mandel
parents:
diff changeset
339
e78566595089 initial import
mandel
parents:
diff changeset
340 var->setType(qualifyType(typeInfo, _M_context));
e78566595089 initial import
mandel
parents:
diff changeset
341 applyStorageSpecifiers(node->storage_specifiers, model_static_cast<MemberModelItem>(var));
e78566595089 initial import
mandel
parents:
diff changeset
342
e78566595089 initial import
mandel
parents:
diff changeset
343 var->setScope(symbolScope->qualifiedName());
e78566595089 initial import
mandel
parents:
diff changeset
344 symbolScope->addVariable(var);
e78566595089 initial import
mandel
parents:
diff changeset
345 }
e78566595089 initial import
mandel
parents:
diff changeset
346 }
e78566595089 initial import
mandel
parents:
diff changeset
347
e78566595089 initial import
mandel
parents:
diff changeset
348 void Binder::visitFunctionDefinition(FunctionDefinitionAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
349 {
e78566595089 initial import
mandel
parents:
diff changeset
350 Q_ASSERT(node->init_declarator != 0);
e78566595089 initial import
mandel
parents:
diff changeset
351
e78566595089 initial import
mandel
parents:
diff changeset
352 ScopeModelItem scope = currentScope();
e78566595089 initial import
mandel
parents:
diff changeset
353
e78566595089 initial import
mandel
parents:
diff changeset
354 InitDeclaratorAST *init_declarator = node->init_declarator;
e78566595089 initial import
mandel
parents:
diff changeset
355 DeclaratorAST *declarator = init_declarator->declarator;
e78566595089 initial import
mandel
parents:
diff changeset
356
e78566595089 initial import
mandel
parents:
diff changeset
357 // in the case of "void (func)()" or "void ((func))()" we need to
e78566595089 initial import
mandel
parents:
diff changeset
358 // skip to the inner most. This is in line with how the declarator
e78566595089 initial import
mandel
parents:
diff changeset
359 // node is generated in 'parser.cpp'
e78566595089 initial import
mandel
parents:
diff changeset
360 while (declarator && declarator->sub_declarator)
e78566595089 initial import
mandel
parents:
diff changeset
361 declarator = declarator->sub_declarator;
e78566595089 initial import
mandel
parents:
diff changeset
362 Q_ASSERT(declarator->id);
e78566595089 initial import
mandel
parents:
diff changeset
363
e78566595089 initial import
mandel
parents:
diff changeset
364 CodeModelFinder finder(model(), this);
e78566595089 initial import
mandel
parents:
diff changeset
365
e78566595089 initial import
mandel
parents:
diff changeset
366 ScopeModelItem functionScope = finder.resolveScope(declarator->id, scope);
e78566595089 initial import
mandel
parents:
diff changeset
367 if (! functionScope)
e78566595089 initial import
mandel
parents:
diff changeset
368 {
e78566595089 initial import
mandel
parents:
diff changeset
369 name_cc.run(declarator->id);
e78566595089 initial import
mandel
parents:
diff changeset
370 _M_message_handler(std::string("** WARNING scope not found for function definition:")
e78566595089 initial import
mandel
parents:
diff changeset
371 + qPrintable(name_cc.name())
e78566595089 initial import
mandel
parents:
diff changeset
372 + std::string(" - definition *ignored*"));
e78566595089 initial import
mandel
parents:
diff changeset
373 return;
e78566595089 initial import
mandel
parents:
diff changeset
374 }
e78566595089 initial import
mandel
parents:
diff changeset
375
e78566595089 initial import
mandel
parents:
diff changeset
376 decl_cc.run(declarator);
e78566595089 initial import
mandel
parents:
diff changeset
377
e78566595089 initial import
mandel
parents:
diff changeset
378 Q_ASSERT(! decl_cc.id().isEmpty());
e78566595089 initial import
mandel
parents:
diff changeset
379
e78566595089 initial import
mandel
parents:
diff changeset
380 FunctionDefinitionModelItem
e78566595089 initial import
mandel
parents:
diff changeset
381 old = changeCurrentFunction(_M_model->create<FunctionDefinitionModelItem>());
e78566595089 initial import
mandel
parents:
diff changeset
382 _M_current_function->setScope(functionScope->qualifiedName());
e78566595089 initial import
mandel
parents:
diff changeset
383 updateItemPosition (_M_current_function->toItem(), node);
e78566595089 initial import
mandel
parents:
diff changeset
384
e78566595089 initial import
mandel
parents:
diff changeset
385 Q_ASSERT(declarator->id->unqualified_name != 0);
e78566595089 initial import
mandel
parents:
diff changeset
386 name_cc.run(declarator->id->unqualified_name);
e78566595089 initial import
mandel
parents:
diff changeset
387 QString unqualified_name = name_cc.name();
e78566595089 initial import
mandel
parents:
diff changeset
388
e78566595089 initial import
mandel
parents:
diff changeset
389 _M_current_function->setName(unqualified_name);
e78566595089 initial import
mandel
parents:
diff changeset
390 TypeInfo tmp_type = CompilerUtils::typeDescription(node->type_specifier,
e78566595089 initial import
mandel
parents:
diff changeset
391 declarator, this);
e78566595089 initial import
mandel
parents:
diff changeset
392
e78566595089 initial import
mandel
parents:
diff changeset
393 _M_current_function->setType(qualifyType(tmp_type, _M_context));
e78566595089 initial import
mandel
parents:
diff changeset
394 _M_current_function->setAccessPolicy(_M_current_access);
e78566595089 initial import
mandel
parents:
diff changeset
395 _M_current_function->setFunctionType(_M_current_function_type);
e78566595089 initial import
mandel
parents:
diff changeset
396 _M_current_function->setConstant(declarator->fun_cv != 0);
e78566595089 initial import
mandel
parents:
diff changeset
397 _M_current_function->setTemplateParameters(_M_current_template_parameters);
e78566595089 initial import
mandel
parents:
diff changeset
398
e78566595089 initial import
mandel
parents:
diff changeset
399 applyStorageSpecifiers(node->storage_specifiers,
e78566595089 initial import
mandel
parents:
diff changeset
400 model_static_cast<MemberModelItem>(_M_current_function));
e78566595089 initial import
mandel
parents:
diff changeset
401 applyFunctionSpecifiers(node->function_specifiers,
e78566595089 initial import
mandel
parents:
diff changeset
402 model_static_cast<FunctionModelItem>(_M_current_function));
e78566595089 initial import
mandel
parents:
diff changeset
403
e78566595089 initial import
mandel
parents:
diff changeset
404 _M_current_function->setVariadics (decl_cc.isVariadics ());
e78566595089 initial import
mandel
parents:
diff changeset
405
e78566595089 initial import
mandel
parents:
diff changeset
406 foreach (DeclaratorCompiler::Parameter p, decl_cc.parameters())
e78566595089 initial import
mandel
parents:
diff changeset
407 {
e78566595089 initial import
mandel
parents:
diff changeset
408 ArgumentModelItem arg = model()->create<ArgumentModelItem>();
e78566595089 initial import
mandel
parents:
diff changeset
409 arg->setType(qualifyType(p.type, functionScope->qualifiedName()));
e78566595089 initial import
mandel
parents:
diff changeset
410 arg->setName(p.name);
e78566595089 initial import
mandel
parents:
diff changeset
411 arg->setDefaultValue(p.defaultValue);
e78566595089 initial import
mandel
parents:
diff changeset
412 if (p.defaultValue)
e78566595089 initial import
mandel
parents:
diff changeset
413 arg->setDefaultValueExpression(p.defaultValueExpression);
e78566595089 initial import
mandel
parents:
diff changeset
414 _M_current_function->addArgument(arg);
e78566595089 initial import
mandel
parents:
diff changeset
415 }
e78566595089 initial import
mandel
parents:
diff changeset
416
e78566595089 initial import
mandel
parents:
diff changeset
417 functionScope->addFunctionDefinition(_M_current_function);
e78566595089 initial import
mandel
parents:
diff changeset
418
e78566595089 initial import
mandel
parents:
diff changeset
419 FunctionModelItem prototype = model_static_cast<FunctionModelItem>(_M_current_function);
e78566595089 initial import
mandel
parents:
diff changeset
420 FunctionModelItem declared = functionScope->declaredFunction(prototype);
e78566595089 initial import
mandel
parents:
diff changeset
421
e78566595089 initial import
mandel
parents:
diff changeset
422 // try to find a function declaration for this definition..
e78566595089 initial import
mandel
parents:
diff changeset
423 if (! declared)
e78566595089 initial import
mandel
parents:
diff changeset
424 {
e78566595089 initial import
mandel
parents:
diff changeset
425 functionScope->addFunction(prototype);
e78566595089 initial import
mandel
parents:
diff changeset
426 }
e78566595089 initial import
mandel
parents:
diff changeset
427 else
e78566595089 initial import
mandel
parents:
diff changeset
428 {
e78566595089 initial import
mandel
parents:
diff changeset
429 applyFunctionSpecifiers(node->function_specifiers, declared);
e78566595089 initial import
mandel
parents:
diff changeset
430
e78566595089 initial import
mandel
parents:
diff changeset
431 // fix the function type and the access policy
e78566595089 initial import
mandel
parents:
diff changeset
432 _M_current_function->setAccessPolicy(declared->accessPolicy());
e78566595089 initial import
mandel
parents:
diff changeset
433 _M_current_function->setFunctionType(declared->functionType());
e78566595089 initial import
mandel
parents:
diff changeset
434 }
e78566595089 initial import
mandel
parents:
diff changeset
435
e78566595089 initial import
mandel
parents:
diff changeset
436 changeCurrentFunction(old);
e78566595089 initial import
mandel
parents:
diff changeset
437 }
e78566595089 initial import
mandel
parents:
diff changeset
438
e78566595089 initial import
mandel
parents:
diff changeset
439 void Binder::visitTemplateDeclaration(TemplateDeclarationAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
440 {
e78566595089 initial import
mandel
parents:
diff changeset
441 const ListNode<TemplateParameterAST*> *it = node->template_parameters;
e78566595089 initial import
mandel
parents:
diff changeset
442 if (it == 0)
e78566595089 initial import
mandel
parents:
diff changeset
443 return;
e78566595089 initial import
mandel
parents:
diff changeset
444
e78566595089 initial import
mandel
parents:
diff changeset
445 TemplateParameterList savedTemplateParameters = changeTemplateParameters(TemplateParameterList());
e78566595089 initial import
mandel
parents:
diff changeset
446
e78566595089 initial import
mandel
parents:
diff changeset
447 it = it->toFront();
e78566595089 initial import
mandel
parents:
diff changeset
448 const ListNode<TemplateParameterAST*> *end = it;
e78566595089 initial import
mandel
parents:
diff changeset
449
e78566595089 initial import
mandel
parents:
diff changeset
450 TemplateParameterList templateParameters;
e78566595089 initial import
mandel
parents:
diff changeset
451 do {
e78566595089 initial import
mandel
parents:
diff changeset
452 TemplateParameterAST *parameter = it->element;
e78566595089 initial import
mandel
parents:
diff changeset
453 TypeParameterAST *type_parameter = parameter->type_parameter;
e78566595089 initial import
mandel
parents:
diff changeset
454
e78566595089 initial import
mandel
parents:
diff changeset
455 NameAST *name;
e78566595089 initial import
mandel
parents:
diff changeset
456 if (!type_parameter) {
e78566595089 initial import
mandel
parents:
diff changeset
457 // A hacky hack to work around missing support for parameter declarations in
e78566595089 initial import
mandel
parents:
diff changeset
458 // templates. We just need the to get the name of the variable, since we
e78566595089 initial import
mandel
parents:
diff changeset
459 // aren't actually compiling these anyway. We are still not supporting much
e78566595089 initial import
mandel
parents:
diff changeset
460 // more, but we are refusing to fail for a few more declarations
e78566595089 initial import
mandel
parents:
diff changeset
461 if (parameter->parameter_declaration == 0 ||
e78566595089 initial import
mandel
parents:
diff changeset
462 parameter->parameter_declaration->declarator == 0 ||
e78566595089 initial import
mandel
parents:
diff changeset
463 parameter->parameter_declaration->declarator->id == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
464
e78566595089 initial import
mandel
parents:
diff changeset
465 /*std::cerr << "** WARNING template declaration not supported ``";
e78566595089 initial import
mandel
parents:
diff changeset
466 Token const &tk = _M_token_stream->token ((int) node->start_token);
e78566595089 initial import
mandel
parents:
diff changeset
467 Token const &end_tk = _M_token_stream->token ((int) node->declaration->start_token);
e78566595089 initial import
mandel
parents:
diff changeset
468
e78566595089 initial import
mandel
parents:
diff changeset
469 std::cerr << std::string (&tk.text[tk.position], (end_tk.position) - tk.position) << "''"
e78566595089 initial import
mandel
parents:
diff changeset
470 << std::endl << std::endl;*/
e78566595089 initial import
mandel
parents:
diff changeset
471
e78566595089 initial import
mandel
parents:
diff changeset
472 changeTemplateParameters(savedTemplateParameters);
e78566595089 initial import
mandel
parents:
diff changeset
473 return;
e78566595089 initial import
mandel
parents:
diff changeset
474
e78566595089 initial import
mandel
parents:
diff changeset
475 }
e78566595089 initial import
mandel
parents:
diff changeset
476
e78566595089 initial import
mandel
parents:
diff changeset
477 name = parameter->parameter_declaration->declarator->id;
e78566595089 initial import
mandel
parents:
diff changeset
478 } else {
e78566595089 initial import
mandel
parents:
diff changeset
479 int tk = decode_token(type_parameter->type);
e78566595089 initial import
mandel
parents:
diff changeset
480 if (tk != Token_typename && tk != Token_class)
e78566595089 initial import
mandel
parents:
diff changeset
481 {
e78566595089 initial import
mandel
parents:
diff changeset
482 /*std::cerr << "** WARNING template declaration not supported ``";
e78566595089 initial import
mandel
parents:
diff changeset
483 Token const &tk = _M_token_stream->token ((int) node->start_token);
e78566595089 initial import
mandel
parents:
diff changeset
484 Token const &end_tk = _M_token_stream->token ((int) node->declaration->start_token);
e78566595089 initial import
mandel
parents:
diff changeset
485
e78566595089 initial import
mandel
parents:
diff changeset
486 std::cerr << std::string (&tk.text[tk.position], (end_tk.position) - tk.position) << "''"
e78566595089 initial import
mandel
parents:
diff changeset
487 << std::endl << std::endl;*/
e78566595089 initial import
mandel
parents:
diff changeset
488
e78566595089 initial import
mandel
parents:
diff changeset
489 changeTemplateParameters(savedTemplateParameters);
e78566595089 initial import
mandel
parents:
diff changeset
490 return;
e78566595089 initial import
mandel
parents:
diff changeset
491 }
e78566595089 initial import
mandel
parents:
diff changeset
492 assert(tk == Token_typename || tk == Token_class);
e78566595089 initial import
mandel
parents:
diff changeset
493
e78566595089 initial import
mandel
parents:
diff changeset
494 name = type_parameter->name;
e78566595089 initial import
mandel
parents:
diff changeset
495 }
e78566595089 initial import
mandel
parents:
diff changeset
496
e78566595089 initial import
mandel
parents:
diff changeset
497 TemplateParameterModelItem p = model()->create<TemplateParameterModelItem>();
e78566595089 initial import
mandel
parents:
diff changeset
498 name_cc.run(name);
e78566595089 initial import
mandel
parents:
diff changeset
499 p->setName(name_cc.name());
e78566595089 initial import
mandel
parents:
diff changeset
500
e78566595089 initial import
mandel
parents:
diff changeset
501 _M_current_template_parameters.append(p);
e78566595089 initial import
mandel
parents:
diff changeset
502 it = it->next;
e78566595089 initial import
mandel
parents:
diff changeset
503 } while (it != end);
e78566595089 initial import
mandel
parents:
diff changeset
504
e78566595089 initial import
mandel
parents:
diff changeset
505 visit(node->declaration);
e78566595089 initial import
mandel
parents:
diff changeset
506
e78566595089 initial import
mandel
parents:
diff changeset
507 changeTemplateParameters(savedTemplateParameters);
e78566595089 initial import
mandel
parents:
diff changeset
508 }
e78566595089 initial import
mandel
parents:
diff changeset
509
e78566595089 initial import
mandel
parents:
diff changeset
510 void Binder::visitTypedef(TypedefAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
511 {
e78566595089 initial import
mandel
parents:
diff changeset
512 const ListNode<InitDeclaratorAST*> *it = node->init_declarators;
e78566595089 initial import
mandel
parents:
diff changeset
513 if (it == 0)
e78566595089 initial import
mandel
parents:
diff changeset
514 return;
e78566595089 initial import
mandel
parents:
diff changeset
515
e78566595089 initial import
mandel
parents:
diff changeset
516 it = it->toFront();
e78566595089 initial import
mandel
parents:
diff changeset
517 const ListNode<InitDeclaratorAST*> *end = it;
e78566595089 initial import
mandel
parents:
diff changeset
518
e78566595089 initial import
mandel
parents:
diff changeset
519 do
e78566595089 initial import
mandel
parents:
diff changeset
520 {
e78566595089 initial import
mandel
parents:
diff changeset
521 InitDeclaratorAST *init_declarator = it->element;
e78566595089 initial import
mandel
parents:
diff changeset
522 it = it->next;
e78566595089 initial import
mandel
parents:
diff changeset
523
e78566595089 initial import
mandel
parents:
diff changeset
524 Q_ASSERT(init_declarator->declarator != 0);
e78566595089 initial import
mandel
parents:
diff changeset
525
e78566595089 initial import
mandel
parents:
diff changeset
526 // the name
e78566595089 initial import
mandel
parents:
diff changeset
527 decl_cc.run (init_declarator->declarator);
e78566595089 initial import
mandel
parents:
diff changeset
528 QString alias_name = decl_cc.id ();
e78566595089 initial import
mandel
parents:
diff changeset
529
e78566595089 initial import
mandel
parents:
diff changeset
530 if (alias_name.isEmpty ())
e78566595089 initial import
mandel
parents:
diff changeset
531 {
e78566595089 initial import
mandel
parents:
diff changeset
532 _M_message_handler("** WARNING anonymous typedef not supported! ``");
e78566595089 initial import
mandel
parents:
diff changeset
533 Token const &tk = _M_token_stream->token ((int) node->start_token);
e78566595089 initial import
mandel
parents:
diff changeset
534 Token const &end_tk = _M_token_stream->token ((int) node->end_token);
e78566595089 initial import
mandel
parents:
diff changeset
535
e78566595089 initial import
mandel
parents:
diff changeset
536 _M_message_handler(std::string(&tk.text[tk.position], end_tk.position - tk.position));
e78566595089 initial import
mandel
parents:
diff changeset
537 continue;
e78566595089 initial import
mandel
parents:
diff changeset
538 }
e78566595089 initial import
mandel
parents:
diff changeset
539
e78566595089 initial import
mandel
parents:
diff changeset
540 // build the type
e78566595089 initial import
mandel
parents:
diff changeset
541 TypeInfo typeInfo = CompilerUtils::typeDescription (node->type_specifier,
e78566595089 initial import
mandel
parents:
diff changeset
542 init_declarator->declarator,
e78566595089 initial import
mandel
parents:
diff changeset
543 this);
e78566595089 initial import
mandel
parents:
diff changeset
544 DeclaratorAST *decl = init_declarator->declarator;
e78566595089 initial import
mandel
parents:
diff changeset
545 while (decl && decl->sub_declarator)
e78566595089 initial import
mandel
parents:
diff changeset
546 decl = decl->sub_declarator;
e78566595089 initial import
mandel
parents:
diff changeset
547
e78566595089 initial import
mandel
parents:
diff changeset
548 if (decl != init_declarator->declarator
e78566595089 initial import
mandel
parents:
diff changeset
549 && init_declarator->declarator->parameter_declaration_clause != 0)
e78566595089 initial import
mandel
parents:
diff changeset
550 {
e78566595089 initial import
mandel
parents:
diff changeset
551 typeInfo.setFunctionPointer (true);
e78566595089 initial import
mandel
parents:
diff changeset
552 decl_cc.run (init_declarator->declarator);
e78566595089 initial import
mandel
parents:
diff changeset
553 foreach (DeclaratorCompiler::Parameter p, decl_cc.parameters())
e78566595089 initial import
mandel
parents:
diff changeset
554 typeInfo.addArgument(p.type);
e78566595089 initial import
mandel
parents:
diff changeset
555 }
e78566595089 initial import
mandel
parents:
diff changeset
556
e78566595089 initial import
mandel
parents:
diff changeset
557 ScopeModelItem scope = currentScope();
e78566595089 initial import
mandel
parents:
diff changeset
558 DeclaratorAST *declarator = init_declarator->declarator;
e78566595089 initial import
mandel
parents:
diff changeset
559 CodeModelFinder finder(model(), this);
e78566595089 initial import
mandel
parents:
diff changeset
560 ScopeModelItem typedefScope = finder.resolveScope(declarator->id, scope);
e78566595089 initial import
mandel
parents:
diff changeset
561
e78566595089 initial import
mandel
parents:
diff changeset
562 TypeAliasModelItem typeAlias = model ()->create<TypeAliasModelItem> ();
e78566595089 initial import
mandel
parents:
diff changeset
563 updateItemPosition (typeAlias->toItem (), node);
e78566595089 initial import
mandel
parents:
diff changeset
564 typeAlias->setName (alias_name);
e78566595089 initial import
mandel
parents:
diff changeset
565 typeAlias->setType (qualifyType (typeInfo, currentScope ()->qualifiedName ()));
e78566595089 initial import
mandel
parents:
diff changeset
566 typeAlias->setScope (typedefScope->qualifiedName());
e78566595089 initial import
mandel
parents:
diff changeset
567 _M_qualified_types[typeAlias->qualifiedName().join(".")] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
568 currentScope ()->addTypeAlias (typeAlias);
e78566595089 initial import
mandel
parents:
diff changeset
569 }
e78566595089 initial import
mandel
parents:
diff changeset
570 while (it != end);
e78566595089 initial import
mandel
parents:
diff changeset
571 }
e78566595089 initial import
mandel
parents:
diff changeset
572
e78566595089 initial import
mandel
parents:
diff changeset
573 void Binder::visitNamespace(NamespaceAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
574 {
e78566595089 initial import
mandel
parents:
diff changeset
575 bool anonymous = (node->namespace_name == 0);
e78566595089 initial import
mandel
parents:
diff changeset
576
e78566595089 initial import
mandel
parents:
diff changeset
577 ScopeModelItem scope = currentScope();
e78566595089 initial import
mandel
parents:
diff changeset
578
e78566595089 initial import
mandel
parents:
diff changeset
579 NamespaceModelItem old;
e78566595089 initial import
mandel
parents:
diff changeset
580 if (! anonymous)
e78566595089 initial import
mandel
parents:
diff changeset
581 {
e78566595089 initial import
mandel
parents:
diff changeset
582 QString name = decode_symbol(node->namespace_name)->as_string();
e78566595089 initial import
mandel
parents:
diff changeset
583
e78566595089 initial import
mandel
parents:
diff changeset
584 QStringList qualified_name = scope->qualifiedName();
e78566595089 initial import
mandel
parents:
diff changeset
585 qualified_name += name;
e78566595089 initial import
mandel
parents:
diff changeset
586 NamespaceModelItem ns =
e78566595089 initial import
mandel
parents:
diff changeset
587 model_safe_cast<NamespaceModelItem>(_M_model->findItem(qualified_name,
e78566595089 initial import
mandel
parents:
diff changeset
588 _M_current_file->toItem()));
e78566595089 initial import
mandel
parents:
diff changeset
589 if (!ns)
e78566595089 initial import
mandel
parents:
diff changeset
590 {
e78566595089 initial import
mandel
parents:
diff changeset
591 ns = _M_model->create<NamespaceModelItem>();
e78566595089 initial import
mandel
parents:
diff changeset
592 updateItemPosition (ns->toItem(), node);
e78566595089 initial import
mandel
parents:
diff changeset
593 ns->setName(name);
e78566595089 initial import
mandel
parents:
diff changeset
594 ns->setScope(scope->qualifiedName());
e78566595089 initial import
mandel
parents:
diff changeset
595 }
e78566595089 initial import
mandel
parents:
diff changeset
596 old = changeCurrentNamespace(ns);
e78566595089 initial import
mandel
parents:
diff changeset
597
e78566595089 initial import
mandel
parents:
diff changeset
598 _M_context.append(name);
e78566595089 initial import
mandel
parents:
diff changeset
599 }
e78566595089 initial import
mandel
parents:
diff changeset
600
e78566595089 initial import
mandel
parents:
diff changeset
601 DefaultVisitor::visitNamespace(node);
e78566595089 initial import
mandel
parents:
diff changeset
602
e78566595089 initial import
mandel
parents:
diff changeset
603 if (! anonymous)
e78566595089 initial import
mandel
parents:
diff changeset
604 {
e78566595089 initial import
mandel
parents:
diff changeset
605 Q_ASSERT(scope->kind() == _CodeModelItem::Kind_Namespace
e78566595089 initial import
mandel
parents:
diff changeset
606 || scope->kind() == _CodeModelItem::Kind_File);
e78566595089 initial import
mandel
parents:
diff changeset
607
e78566595089 initial import
mandel
parents:
diff changeset
608 _M_context.removeLast();
e78566595089 initial import
mandel
parents:
diff changeset
609
e78566595089 initial import
mandel
parents:
diff changeset
610 if (NamespaceModelItem ns = model_static_cast<NamespaceModelItem>(scope))
e78566595089 initial import
mandel
parents:
diff changeset
611 {
e78566595089 initial import
mandel
parents:
diff changeset
612 ns->addNamespace(_M_current_namespace);
e78566595089 initial import
mandel
parents:
diff changeset
613 }
e78566595089 initial import
mandel
parents:
diff changeset
614
e78566595089 initial import
mandel
parents:
diff changeset
615 changeCurrentNamespace(old);
e78566595089 initial import
mandel
parents:
diff changeset
616 }
e78566595089 initial import
mandel
parents:
diff changeset
617 }
e78566595089 initial import
mandel
parents:
diff changeset
618
e78566595089 initial import
mandel
parents:
diff changeset
619 void Binder::visitForwardDeclarationSpecifier(ForwardDeclarationSpecifierAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
620 {
e78566595089 initial import
mandel
parents:
diff changeset
621 name_cc.run(node->name);
e78566595089 initial import
mandel
parents:
diff changeset
622 if (name_cc.name().isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
623 return;
e78566595089 initial import
mandel
parents:
diff changeset
624
e78566595089 initial import
mandel
parents:
diff changeset
625 ScopeModelItem scope = currentScope();
e78566595089 initial import
mandel
parents:
diff changeset
626 _M_qualified_types[(scope->qualifiedName() + name_cc.qualifiedName()).join(".") ] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
627 }
e78566595089 initial import
mandel
parents:
diff changeset
628
e78566595089 initial import
mandel
parents:
diff changeset
629 void Binder::visitClassSpecifier(ClassSpecifierAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
630 {
e78566595089 initial import
mandel
parents:
diff changeset
631 ClassCompiler class_cc(this);
e78566595089 initial import
mandel
parents:
diff changeset
632 class_cc.run(node);
e78566595089 initial import
mandel
parents:
diff changeset
633
e78566595089 initial import
mandel
parents:
diff changeset
634 if (class_cc.name().isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
635 {
e78566595089 initial import
mandel
parents:
diff changeset
636 // anonymous not supported
e78566595089 initial import
mandel
parents:
diff changeset
637 return;
e78566595089 initial import
mandel
parents:
diff changeset
638 }
e78566595089 initial import
mandel
parents:
diff changeset
639
e78566595089 initial import
mandel
parents:
diff changeset
640 Q_ASSERT(node->name != 0 && node->name->unqualified_name != 0);
e78566595089 initial import
mandel
parents:
diff changeset
641
e78566595089 initial import
mandel
parents:
diff changeset
642 ScopeModelItem scope = currentScope();
e78566595089 initial import
mandel
parents:
diff changeset
643
e78566595089 initial import
mandel
parents:
diff changeset
644 ClassModelItem old = changeCurrentClass(_M_model->create<ClassModelItem>());
e78566595089 initial import
mandel
parents:
diff changeset
645 updateItemPosition (_M_current_class->toItem(), node);
e78566595089 initial import
mandel
parents:
diff changeset
646 _M_current_class->setName(class_cc.name());
e78566595089 initial import
mandel
parents:
diff changeset
647
e78566595089 initial import
mandel
parents:
diff changeset
648 QStringList baseClasses = class_cc.baseClasses(); TypeInfo info;
e78566595089 initial import
mandel
parents:
diff changeset
649 for (int i=0; i<baseClasses.size(); ++i)
e78566595089 initial import
mandel
parents:
diff changeset
650 {
e78566595089 initial import
mandel
parents:
diff changeset
651 info.setQualifiedName(baseClasses.at(i).split("::"));
e78566595089 initial import
mandel
parents:
diff changeset
652 baseClasses[i] = qualifyType(info, scope->qualifiedName()).qualifiedName().join("::");
e78566595089 initial import
mandel
parents:
diff changeset
653 }
e78566595089 initial import
mandel
parents:
diff changeset
654
e78566595089 initial import
mandel
parents:
diff changeset
655 _M_current_class->setBaseClasses(baseClasses);
e78566595089 initial import
mandel
parents:
diff changeset
656 _M_current_class->setClassType(decode_class_type(node->class_key));
e78566595089 initial import
mandel
parents:
diff changeset
657 _M_current_class->setTemplateParameters(_M_current_template_parameters);
e78566595089 initial import
mandel
parents:
diff changeset
658
e78566595089 initial import
mandel
parents:
diff changeset
659 if (! _M_current_template_parameters.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
660 {
e78566595089 initial import
mandel
parents:
diff changeset
661 QString name = _M_current_class->name();
e78566595089 initial import
mandel
parents:
diff changeset
662 name += "<";
e78566595089 initial import
mandel
parents:
diff changeset
663 for (int i = 0; i<_M_current_template_parameters.size(); ++i)
e78566595089 initial import
mandel
parents:
diff changeset
664 {
e78566595089 initial import
mandel
parents:
diff changeset
665 if (i != 0)
e78566595089 initial import
mandel
parents:
diff changeset
666 name += ",";
e78566595089 initial import
mandel
parents:
diff changeset
667
e78566595089 initial import
mandel
parents:
diff changeset
668 name += _M_current_template_parameters.at(i)->name();
e78566595089 initial import
mandel
parents:
diff changeset
669 }
e78566595089 initial import
mandel
parents:
diff changeset
670
e78566595089 initial import
mandel
parents:
diff changeset
671 name += ">";
e78566595089 initial import
mandel
parents:
diff changeset
672 _M_current_class->setName(name);
e78566595089 initial import
mandel
parents:
diff changeset
673 }
e78566595089 initial import
mandel
parents:
diff changeset
674
e78566595089 initial import
mandel
parents:
diff changeset
675 CodeModel::AccessPolicy oldAccessPolicy = changeCurrentAccess(decode_access_policy(node->class_key));
e78566595089 initial import
mandel
parents:
diff changeset
676 CodeModel::FunctionType oldFunctionType = changeCurrentFunctionType(CodeModel::Normal);
e78566595089 initial import
mandel
parents:
diff changeset
677
e78566595089 initial import
mandel
parents:
diff changeset
678 _M_current_class->setScope(scope->qualifiedName());
e78566595089 initial import
mandel
parents:
diff changeset
679 _M_qualified_types[_M_current_class->qualifiedName().join(".")] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
680
e78566595089 initial import
mandel
parents:
diff changeset
681 scope->addClass(_M_current_class);
e78566595089 initial import
mandel
parents:
diff changeset
682
e78566595089 initial import
mandel
parents:
diff changeset
683 name_cc.run(node->name->unqualified_name);
e78566595089 initial import
mandel
parents:
diff changeset
684 _M_context.append(name_cc.name());
e78566595089 initial import
mandel
parents:
diff changeset
685 visitNodes(this, node->member_specs);
e78566595089 initial import
mandel
parents:
diff changeset
686 _M_context.removeLast();
e78566595089 initial import
mandel
parents:
diff changeset
687
e78566595089 initial import
mandel
parents:
diff changeset
688 changeCurrentClass(old);
e78566595089 initial import
mandel
parents:
diff changeset
689 changeCurrentAccess(oldAccessPolicy);
e78566595089 initial import
mandel
parents:
diff changeset
690 changeCurrentFunctionType(oldFunctionType);
e78566595089 initial import
mandel
parents:
diff changeset
691 }
e78566595089 initial import
mandel
parents:
diff changeset
692
e78566595089 initial import
mandel
parents:
diff changeset
693 void Binder::visitLinkageSpecification(LinkageSpecificationAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
694 {
e78566595089 initial import
mandel
parents:
diff changeset
695 DefaultVisitor::visitLinkageSpecification(node);
e78566595089 initial import
mandel
parents:
diff changeset
696 }
e78566595089 initial import
mandel
parents:
diff changeset
697
e78566595089 initial import
mandel
parents:
diff changeset
698 void Binder::visitUsing(UsingAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
699 {
e78566595089 initial import
mandel
parents:
diff changeset
700 DefaultVisitor::visitUsing(node);
e78566595089 initial import
mandel
parents:
diff changeset
701 }
e78566595089 initial import
mandel
parents:
diff changeset
702
e78566595089 initial import
mandel
parents:
diff changeset
703 void Binder::visitEnumSpecifier(EnumSpecifierAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
704 {
e78566595089 initial import
mandel
parents:
diff changeset
705 CodeModelFinder finder(model(), this);
e78566595089 initial import
mandel
parents:
diff changeset
706 ScopeModelItem scope = currentScope();
e78566595089 initial import
mandel
parents:
diff changeset
707 ScopeModelItem enumScope = finder.resolveScope(node->name, scope);
e78566595089 initial import
mandel
parents:
diff changeset
708
e78566595089 initial import
mandel
parents:
diff changeset
709 name_cc.run(node->name);
e78566595089 initial import
mandel
parents:
diff changeset
710 QString name = name_cc.name();
e78566595089 initial import
mandel
parents:
diff changeset
711
e78566595089 initial import
mandel
parents:
diff changeset
712 if (name.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
713 {
e78566595089 initial import
mandel
parents:
diff changeset
714 // anonymous enum
e78566595089 initial import
mandel
parents:
diff changeset
715 QString key = _M_context.join("::");
e78566595089 initial import
mandel
parents:
diff changeset
716 int current = ++_M_anonymous_enums[key];
e78566595089 initial import
mandel
parents:
diff changeset
717 name += QLatin1String("enum_");
e78566595089 initial import
mandel
parents:
diff changeset
718 name += QString::number(current);
e78566595089 initial import
mandel
parents:
diff changeset
719 }
e78566595089 initial import
mandel
parents:
diff changeset
720
e78566595089 initial import
mandel
parents:
diff changeset
721 _M_current_enum = model()->create<EnumModelItem>();
e78566595089 initial import
mandel
parents:
diff changeset
722 _M_current_enum->setAccessPolicy(_M_current_access);
e78566595089 initial import
mandel
parents:
diff changeset
723 updateItemPosition (_M_current_enum->toItem(), node);
e78566595089 initial import
mandel
parents:
diff changeset
724 _M_current_enum->setName(name);
e78566595089 initial import
mandel
parents:
diff changeset
725 _M_current_enum->setScope(enumScope->qualifiedName());
e78566595089 initial import
mandel
parents:
diff changeset
726
e78566595089 initial import
mandel
parents:
diff changeset
727 _M_qualified_types[_M_current_enum->qualifiedName().join(".")] = QString();
e78566595089 initial import
mandel
parents:
diff changeset
728
e78566595089 initial import
mandel
parents:
diff changeset
729 enumScope->addEnum(_M_current_enum);
e78566595089 initial import
mandel
parents:
diff changeset
730
e78566595089 initial import
mandel
parents:
diff changeset
731 DefaultVisitor::visitEnumSpecifier(node);
e78566595089 initial import
mandel
parents:
diff changeset
732
e78566595089 initial import
mandel
parents:
diff changeset
733 _M_current_enum = 0;
e78566595089 initial import
mandel
parents:
diff changeset
734 }
e78566595089 initial import
mandel
parents:
diff changeset
735
e78566595089 initial import
mandel
parents:
diff changeset
736 static QString strip_preprocessor_lines(const QString &name)
e78566595089 initial import
mandel
parents:
diff changeset
737 {
e78566595089 initial import
mandel
parents:
diff changeset
738 QStringList lst = name.split("\n");
e78566595089 initial import
mandel
parents:
diff changeset
739 QString s;
e78566595089 initial import
mandel
parents:
diff changeset
740 for (int i=0; i<lst.size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
741 if (!lst.at(i).startsWith('#'))
e78566595089 initial import
mandel
parents:
diff changeset
742 s += lst.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
743 }
e78566595089 initial import
mandel
parents:
diff changeset
744 return s.trimmed();
e78566595089 initial import
mandel
parents:
diff changeset
745 }
e78566595089 initial import
mandel
parents:
diff changeset
746
e78566595089 initial import
mandel
parents:
diff changeset
747 void Binder::visitEnumerator(EnumeratorAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
748 {
e78566595089 initial import
mandel
parents:
diff changeset
749 Q_ASSERT(_M_current_enum != 0);
e78566595089 initial import
mandel
parents:
diff changeset
750 EnumeratorModelItem e = model()->create<EnumeratorModelItem>();
e78566595089 initial import
mandel
parents:
diff changeset
751 updateItemPosition (e->toItem(), node);
e78566595089 initial import
mandel
parents:
diff changeset
752 e->setName(decode_symbol(node->id)->as_string());
e78566595089 initial import
mandel
parents:
diff changeset
753
e78566595089 initial import
mandel
parents:
diff changeset
754 if (ExpressionAST *expr = node->expression)
e78566595089 initial import
mandel
parents:
diff changeset
755 {
e78566595089 initial import
mandel
parents:
diff changeset
756 const Token &start_token = _M_token_stream->token((int) expr->start_token);
e78566595089 initial import
mandel
parents:
diff changeset
757 const Token &end_token = _M_token_stream->token((int) expr->end_token);
e78566595089 initial import
mandel
parents:
diff changeset
758
e78566595089 initial import
mandel
parents:
diff changeset
759 e->setValue(strip_preprocessor_lines(QString::fromUtf8(&start_token.text[start_token.position],
e78566595089 initial import
mandel
parents:
diff changeset
760 (int) (end_token.position - start_token.position)).trimmed()).remove(' '));
e78566595089 initial import
mandel
parents:
diff changeset
761 }
e78566595089 initial import
mandel
parents:
diff changeset
762
e78566595089 initial import
mandel
parents:
diff changeset
763 _M_current_enum->addEnumerator(e);
e78566595089 initial import
mandel
parents:
diff changeset
764 }
e78566595089 initial import
mandel
parents:
diff changeset
765
e78566595089 initial import
mandel
parents:
diff changeset
766 void Binder::visitUsingDirective(UsingDirectiveAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
767 {
e78566595089 initial import
mandel
parents:
diff changeset
768 DefaultVisitor::visitUsingDirective(node);
e78566595089 initial import
mandel
parents:
diff changeset
769 }
e78566595089 initial import
mandel
parents:
diff changeset
770
e78566595089 initial import
mandel
parents:
diff changeset
771 void Binder::visitQEnums(QEnumsAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
772 {
e78566595089 initial import
mandel
parents:
diff changeset
773 const Token &start = _M_token_stream->token((int) node->start_token);
e78566595089 initial import
mandel
parents:
diff changeset
774 const Token &end = _M_token_stream->token((int) node->end_token);
e78566595089 initial import
mandel
parents:
diff changeset
775 QStringList enum_list = QString::fromLatin1(start.text + start.position,
e78566595089 initial import
mandel
parents:
diff changeset
776 end.position - start.position).split(' ');
e78566595089 initial import
mandel
parents:
diff changeset
777
e78566595089 initial import
mandel
parents:
diff changeset
778 ScopeModelItem scope = currentScope();
e78566595089 initial import
mandel
parents:
diff changeset
779 for (int i=0; i<enum_list.size(); ++i)
e78566595089 initial import
mandel
parents:
diff changeset
780 scope->addEnumsDeclaration(enum_list.at(i));
e78566595089 initial import
mandel
parents:
diff changeset
781 }
e78566595089 initial import
mandel
parents:
diff changeset
782
e78566595089 initial import
mandel
parents:
diff changeset
783 void Binder::visitQProperty(QPropertyAST *node)
e78566595089 initial import
mandel
parents:
diff changeset
784 {
e78566595089 initial import
mandel
parents:
diff changeset
785 const Token &start = _M_token_stream->token((int) node->start_token);
e78566595089 initial import
mandel
parents:
diff changeset
786 const Token &end = _M_token_stream->token((int) node->end_token);
e78566595089 initial import
mandel
parents:
diff changeset
787 QString property = QString::fromLatin1(start.text + start.position,
e78566595089 initial import
mandel
parents:
diff changeset
788 end.position - start.position);
e78566595089 initial import
mandel
parents:
diff changeset
789 _M_current_class->addPropertyDeclaration(property);
e78566595089 initial import
mandel
parents:
diff changeset
790 }
e78566595089 initial import
mandel
parents:
diff changeset
791
e78566595089 initial import
mandel
parents:
diff changeset
792 void Binder::applyStorageSpecifiers(const ListNode<std::size_t> *it, MemberModelItem item)
e78566595089 initial import
mandel
parents:
diff changeset
793 {
e78566595089 initial import
mandel
parents:
diff changeset
794 if (it == 0)
e78566595089 initial import
mandel
parents:
diff changeset
795 return;
e78566595089 initial import
mandel
parents:
diff changeset
796
e78566595089 initial import
mandel
parents:
diff changeset
797 it = it->toFront();
e78566595089 initial import
mandel
parents:
diff changeset
798 const ListNode<std::size_t> *end = it;
e78566595089 initial import
mandel
parents:
diff changeset
799
e78566595089 initial import
mandel
parents:
diff changeset
800 do
e78566595089 initial import
mandel
parents:
diff changeset
801 {
e78566595089 initial import
mandel
parents:
diff changeset
802 switch (decode_token(it->element))
e78566595089 initial import
mandel
parents:
diff changeset
803 {
e78566595089 initial import
mandel
parents:
diff changeset
804 default:
e78566595089 initial import
mandel
parents:
diff changeset
805 break;
e78566595089 initial import
mandel
parents:
diff changeset
806
e78566595089 initial import
mandel
parents:
diff changeset
807 case Token_friend:
e78566595089 initial import
mandel
parents:
diff changeset
808 item->setFriend(true);
e78566595089 initial import
mandel
parents:
diff changeset
809 break;
e78566595089 initial import
mandel
parents:
diff changeset
810 case Token_auto:
e78566595089 initial import
mandel
parents:
diff changeset
811 item->setAuto(true);
e78566595089 initial import
mandel
parents:
diff changeset
812 break;
e78566595089 initial import
mandel
parents:
diff changeset
813 case Token_register:
e78566595089 initial import
mandel
parents:
diff changeset
814 item->setRegister(true);
e78566595089 initial import
mandel
parents:
diff changeset
815 break;
e78566595089 initial import
mandel
parents:
diff changeset
816 case Token_static:
e78566595089 initial import
mandel
parents:
diff changeset
817 item->setStatic(true);
e78566595089 initial import
mandel
parents:
diff changeset
818 break;
e78566595089 initial import
mandel
parents:
diff changeset
819 case Token_extern:
e78566595089 initial import
mandel
parents:
diff changeset
820 item->setExtern(true);
e78566595089 initial import
mandel
parents:
diff changeset
821 break;
e78566595089 initial import
mandel
parents:
diff changeset
822 case Token_mutable:
e78566595089 initial import
mandel
parents:
diff changeset
823 item->setMutable(true);
e78566595089 initial import
mandel
parents:
diff changeset
824 break;
e78566595089 initial import
mandel
parents:
diff changeset
825 }
e78566595089 initial import
mandel
parents:
diff changeset
826 it = it->next;
e78566595089 initial import
mandel
parents:
diff changeset
827 }
e78566595089 initial import
mandel
parents:
diff changeset
828 while (it != end);
e78566595089 initial import
mandel
parents:
diff changeset
829 }
e78566595089 initial import
mandel
parents:
diff changeset
830
e78566595089 initial import
mandel
parents:
diff changeset
831 void Binder::applyFunctionSpecifiers(const ListNode<std::size_t> *it, FunctionModelItem item)
e78566595089 initial import
mandel
parents:
diff changeset
832 {
e78566595089 initial import
mandel
parents:
diff changeset
833 if (it == 0)
e78566595089 initial import
mandel
parents:
diff changeset
834 return;
e78566595089 initial import
mandel
parents:
diff changeset
835
e78566595089 initial import
mandel
parents:
diff changeset
836 it = it->toFront();
e78566595089 initial import
mandel
parents:
diff changeset
837 const ListNode<std::size_t> *end = it;
e78566595089 initial import
mandel
parents:
diff changeset
838
e78566595089 initial import
mandel
parents:
diff changeset
839 do
e78566595089 initial import
mandel
parents:
diff changeset
840 {
e78566595089 initial import
mandel
parents:
diff changeset
841 switch (decode_token(it->element))
e78566595089 initial import
mandel
parents:
diff changeset
842 {
e78566595089 initial import
mandel
parents:
diff changeset
843 default:
e78566595089 initial import
mandel
parents:
diff changeset
844 break;
e78566595089 initial import
mandel
parents:
diff changeset
845
e78566595089 initial import
mandel
parents:
diff changeset
846 case Token_inline:
e78566595089 initial import
mandel
parents:
diff changeset
847 item->setInline(true);
e78566595089 initial import
mandel
parents:
diff changeset
848 break;
e78566595089 initial import
mandel
parents:
diff changeset
849
e78566595089 initial import
mandel
parents:
diff changeset
850 case Token_virtual:
e78566595089 initial import
mandel
parents:
diff changeset
851 item->setVirtual(true);
e78566595089 initial import
mandel
parents:
diff changeset
852 break;
e78566595089 initial import
mandel
parents:
diff changeset
853
e78566595089 initial import
mandel
parents:
diff changeset
854 case Token_explicit:
e78566595089 initial import
mandel
parents:
diff changeset
855 item->setExplicit(true);
e78566595089 initial import
mandel
parents:
diff changeset
856 break;
e78566595089 initial import
mandel
parents:
diff changeset
857
e78566595089 initial import
mandel
parents:
diff changeset
858 case Token_Q_INVOKABLE:
e78566595089 initial import
mandel
parents:
diff changeset
859 item->setInvokable(true);
e78566595089 initial import
mandel
parents:
diff changeset
860 break;
e78566595089 initial import
mandel
parents:
diff changeset
861 }
e78566595089 initial import
mandel
parents:
diff changeset
862 it = it->next;
e78566595089 initial import
mandel
parents:
diff changeset
863 }
e78566595089 initial import
mandel
parents:
diff changeset
864 while (it != end);
e78566595089 initial import
mandel
parents:
diff changeset
865 }
e78566595089 initial import
mandel
parents:
diff changeset
866
e78566595089 initial import
mandel
parents:
diff changeset
867 TypeInfo Binder::qualifyType(const TypeInfo &type, const QStringList &context) const
e78566595089 initial import
mandel
parents:
diff changeset
868 {
e78566595089 initial import
mandel
parents:
diff changeset
869 // ### Potentially improve to use string list in the name table to
e78566595089 initial import
mandel
parents:
diff changeset
870 if (context.size() == 0)
e78566595089 initial import
mandel
parents:
diff changeset
871 {
e78566595089 initial import
mandel
parents:
diff changeset
872 // ### We can assume that this means global namespace for now...
e78566595089 initial import
mandel
parents:
diff changeset
873 return type;
e78566595089 initial import
mandel
parents:
diff changeset
874 }
e78566595089 initial import
mandel
parents:
diff changeset
875 else if (_M_qualified_types.contains(type.qualifiedName().join(".")))
e78566595089 initial import
mandel
parents:
diff changeset
876 {
e78566595089 initial import
mandel
parents:
diff changeset
877 return type;
e78566595089 initial import
mandel
parents:
diff changeset
878 }
e78566595089 initial import
mandel
parents:
diff changeset
879 else
e78566595089 initial import
mandel
parents:
diff changeset
880 {
e78566595089 initial import
mandel
parents:
diff changeset
881 QStringList expanded = context;
e78566595089 initial import
mandel
parents:
diff changeset
882 expanded << type.qualifiedName();
e78566595089 initial import
mandel
parents:
diff changeset
883 if (_M_qualified_types.contains(expanded.join(".")))
e78566595089 initial import
mandel
parents:
diff changeset
884 {
e78566595089 initial import
mandel
parents:
diff changeset
885 TypeInfo modified_type = type;
e78566595089 initial import
mandel
parents:
diff changeset
886 modified_type.setQualifiedName(expanded);
e78566595089 initial import
mandel
parents:
diff changeset
887 return modified_type;
e78566595089 initial import
mandel
parents:
diff changeset
888 }
e78566595089 initial import
mandel
parents:
diff changeset
889 else
e78566595089 initial import
mandel
parents:
diff changeset
890 {
e78566595089 initial import
mandel
parents:
diff changeset
891 CodeModelItem scope = model ()->findItem (context, _M_current_file->toItem ());
e78566595089 initial import
mandel
parents:
diff changeset
892
e78566595089 initial import
mandel
parents:
diff changeset
893 if (ClassModelItem klass = model_dynamic_cast<ClassModelItem> (scope))
e78566595089 initial import
mandel
parents:
diff changeset
894 {
e78566595089 initial import
mandel
parents:
diff changeset
895 foreach (QString base, klass->baseClasses ())
e78566595089 initial import
mandel
parents:
diff changeset
896 {
e78566595089 initial import
mandel
parents:
diff changeset
897 QStringList ctx = context;
e78566595089 initial import
mandel
parents:
diff changeset
898 ctx.removeLast();
e78566595089 initial import
mandel
parents:
diff changeset
899 ctx.append (base);
e78566595089 initial import
mandel
parents:
diff changeset
900
e78566595089 initial import
mandel
parents:
diff changeset
901 TypeInfo qualified = qualifyType (type, ctx);
e78566595089 initial import
mandel
parents:
diff changeset
902 if (qualified != type)
e78566595089 initial import
mandel
parents:
diff changeset
903 return qualified;
e78566595089 initial import
mandel
parents:
diff changeset
904 }
e78566595089 initial import
mandel
parents:
diff changeset
905 }
e78566595089 initial import
mandel
parents:
diff changeset
906
e78566595089 initial import
mandel
parents:
diff changeset
907 QStringList copy = context;
e78566595089 initial import
mandel
parents:
diff changeset
908 copy.removeLast();
e78566595089 initial import
mandel
parents:
diff changeset
909 return qualifyType(type, copy);
e78566595089 initial import
mandel
parents:
diff changeset
910 }
e78566595089 initial import
mandel
parents:
diff changeset
911 }
e78566595089 initial import
mandel
parents:
diff changeset
912 }
e78566595089 initial import
mandel
parents:
diff changeset
913
e78566595089 initial import
mandel
parents:
diff changeset
914 void Binder::updateItemPosition(CodeModelItem item, AST *node)
e78566595089 initial import
mandel
parents:
diff changeset
915 {
e78566595089 initial import
mandel
parents:
diff changeset
916 QString filename;
e78566595089 initial import
mandel
parents:
diff changeset
917 int line, column;
e78566595089 initial import
mandel
parents:
diff changeset
918
e78566595089 initial import
mandel
parents:
diff changeset
919 assert (node != 0);
e78566595089 initial import
mandel
parents:
diff changeset
920 _M_location.positionAt (_M_token_stream->position(node->start_token), &line, &column, &filename);
e78566595089 initial import
mandel
parents:
diff changeset
921 item->setFileName (filename);
e78566595089 initial import
mandel
parents:
diff changeset
922 }
e78566595089 initial import
mandel
parents:
diff changeset
923
e78566595089 initial import
mandel
parents:
diff changeset
924 void Binder::installMessageHandler(MessageHandler handler)
e78566595089 initial import
mandel
parents:
diff changeset
925 {
e78566595089 initial import
mandel
parents:
diff changeset
926 _M_message_handler = handler;
e78566595089 initial import
mandel
parents:
diff changeset
927 }
e78566595089 initial import
mandel
parents:
diff changeset
928
e78566595089 initial import
mandel
parents:
diff changeset
929 // kate: space-indent on; indent-width 2; replace-tabs on;