1
/* This file is part of KDevelop
2
Copyright (C) 2003 Roberto Raggi <roberto@kdevelop.org>
3
Copyright (C) 2003 Alexander Dymo <adymo@kdevelop.org>
4
Copyright (C) 2004 Jonas Jacobi <j.jacobi@gmx.de>
6
This library is free software; you can redistribute it and/or
7
modify it under the terms of the GNU Library General Public
8
License as published by the Free Software Foundation; either
9
version 2 of the License, or (at your option) any later version.
11
This library 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 GNU
14
Library General Public License for more details.
16
You should have received a copy of the GNU Library General Public License
17
along with this library; see the file COPYING.LIB. If not, write to
18
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19
Boston, MA 02111-1307, USA.
22
#include "codemodel_utils.h"
24
namespace CodeModelUtils
30
void processClasses(FunctionList &list, const ClassDom dom)
32
const ClassList cllist = dom->classList();
33
for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
35
processClasses(list, *it);
38
const FunctionList fnlist = dom->functionList();
39
for (FunctionList::ConstIterator it = fnlist.begin(); it != fnlist.end(); ++it)
45
void processNamespaces(FunctionList &list, const NamespaceDom dom)
47
const NamespaceList nslist = dom->namespaceList();
48
for (NamespaceList::ConstIterator it = nslist.begin(); it != nslist.end(); ++it)
50
processNamespaces(list, *it);
52
const ClassList cllist = dom->classList();
53
for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
55
processClasses(list, *it);
58
const FunctionList fnlist = dom->functionList();
59
for (FunctionList::ConstIterator it = fnlist.begin(); it != fnlist.end(); ++it)
65
void processNamespaces( FunctionList & list, const NamespaceDom dom, QMap< FunctionDom, Scope > & relations )
67
const NamespaceList nslist = dom->namespaceList();
68
for (NamespaceList::ConstIterator it = nslist.begin(); it != nslist.end(); ++it)
70
processNamespaces(list, *it, relations);
72
const ClassList cllist = dom->classList();
73
for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
75
processClasses(list, *it, relations, dom);
78
const FunctionList fnlist = dom->functionList();
79
for (FunctionList::ConstIterator it = fnlist.begin(); it != fnlist.end(); ++it)
82
relations[*it].ns = dom;
86
void processClasses( FunctionList & list, const ClassDom dom, QMap< FunctionDom, Scope > & relations )
88
const ClassList cllist = dom->classList();
89
for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
91
processClasses(list, *it, relations);
94
const FunctionList fnlist = dom->functionList();
95
for (FunctionList::ConstIterator it = fnlist.begin(); it != fnlist.end(); ++it)
98
relations[*it].klass = dom;
102
void processClasses( FunctionList & list, const ClassDom dom, QMap< FunctionDom, Scope > & relations, const NamespaceDom & nsdom )
104
const ClassList cllist = dom->classList();
105
for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
107
processClasses(list, *it, relations, nsdom);
110
const FunctionList fnlist = dom->functionList();
111
for (FunctionList::ConstIterator it = fnlist.begin(); it != fnlist.end(); ++it)
114
relations[*it].klass = dom;
115
relations[*it].ns = nsdom;
119
} // end of Functions namespace
123
namespace FunctionDefinitions
126
void processClasses(FunctionDefinitionList &list, const ClassDom dom)
128
const ClassList cllist = dom->classList();
129
for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
131
processClasses(list, *it);
134
const FunctionDefinitionList fnlist = dom->functionDefinitionList();
135
for (FunctionDefinitionList::ConstIterator it = fnlist.begin(); it != fnlist.end(); ++it)
141
void processNamespaces(FunctionDefinitionList &list, const NamespaceDom dom)
143
const NamespaceList nslist = dom->namespaceList();
144
for (NamespaceList::ConstIterator it = nslist.begin(); it != nslist.end(); ++it)
146
processNamespaces(list, *it);
148
const ClassList cllist = dom->classList();
149
for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
151
processClasses(list, *it);
154
const FunctionDefinitionList fnlist = dom->functionDefinitionList();
155
for (FunctionDefinitionList::ConstIterator it = fnlist.begin(); it != fnlist.end(); ++it)
161
void processNamespaces( FunctionDefinitionList & list, const NamespaceDom dom, QMap< FunctionDefinitionDom, Scope > & relations )
163
const NamespaceList nslist = dom->namespaceList();
164
for (NamespaceList::ConstIterator it = nslist.begin(); it != nslist.end(); ++it)
166
processNamespaces(list, *it, relations);
168
const ClassList cllist = dom->classList();
169
for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
171
processClasses(list, *it, relations, dom);
174
const FunctionDefinitionList fnlist = dom->functionDefinitionList();
175
for (FunctionDefinitionList::ConstIterator it = fnlist.begin(); it != fnlist.end(); ++it)
178
relations[*it].ns = dom;
182
void processClasses( FunctionDefinitionList & list, const ClassDom dom, QMap< FunctionDefinitionDom, Scope > & relations )
184
const ClassList cllist = dom->classList();
185
for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
187
processClasses(list, *it, relations);
190
const FunctionDefinitionList fnlist = dom->functionDefinitionList();
191
for (FunctionDefinitionList::ConstIterator it = fnlist.begin(); it != fnlist.end(); ++it)
194
relations[*it].klass = dom;
198
void processClasses( FunctionDefinitionList & list, const ClassDom dom, QMap< FunctionDefinitionDom, Scope > & relations, const NamespaceDom & nsdom )
200
const ClassList cllist = dom->classList();
201
for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
203
processClasses(list, *it, relations, nsdom);
206
const FunctionDefinitionList fnlist = dom->functionDefinitionList();
207
for (FunctionDefinitionList::ConstIterator it = fnlist.begin(); it != fnlist.end(); ++it)
210
relations[*it].klass = dom;
211
relations[*it].ns = nsdom;
215
} // end of FunctionDefinitions namespace
219
FunctionList allFunctions(const FileDom &dom)
221
using namespace Functions;
224
const NamespaceList nslist = dom->namespaceList();
225
for (NamespaceList::ConstIterator it = nslist.begin(); it != nslist.end(); ++it)
227
processNamespaces(list, *it);
230
const ClassList cllist = dom->classList();
231
for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
233
processClasses(list, *it);
236
const FunctionList fnlist = dom->functionList();
237
for (FunctionList::ConstIterator it = fnlist.begin(); it != fnlist.end(); ++it)
245
AllFunctions allFunctionsDetailed( const FileDom & dom )
247
using namespace Functions;
250
const NamespaceList nslist = dom->namespaceList();
251
for (NamespaceList::ConstIterator it = nslist.begin(); it != nslist.end(); ++it)
253
processNamespaces(list.functionList, *it, list.relations);
256
const ClassList cllist = dom->classList();
257
for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
259
processClasses(list.functionList, *it, list.relations);
262
const FunctionList fnlist = dom->functionList();
263
for (FunctionList::ConstIterator it = fnlist.begin(); it != fnlist.end(); ++it)
265
list.functionList.append(*it);
271
AllFunctionDefinitions allFunctionDefinitionsDetailed( const FileDom & dom )
273
using namespace FunctionDefinitions;
274
AllFunctionDefinitions list;
276
const NamespaceList nslist = dom->namespaceList();
277
for (NamespaceList::ConstIterator it = nslist.begin(); it != nslist.end(); ++it)
279
processNamespaces(list.functionList, *it, list.relations);
282
const ClassList cllist = dom->classList();
283
for (ClassList::ConstIterator it = cllist.begin(); it != cllist.end(); ++it)
285
processClasses(list.functionList, *it, list.relations);
288
const FunctionDefinitionList fnlist = dom->functionDefinitionList();
289
for (FunctionDefinitionList::ConstIterator it = fnlist.begin(); it != fnlist.end(); ++it)
291
list.functionList.append(*it);
297
bool compareDeclarationToDefinition( const FunctionDom & dec, const FunctionDefinitionDom & def )
299
if (dec->scope() == def->scope() && dec->name() == def->name() && dec->resultType() == def->resultType() && dec->isConstant() == def->isConstant())
301
const ArgumentList defList = def->argumentList(), decList = dec->argumentList();
302
if (defList.size() != decList.size())
305
size_t n = defList.size();
306
for(size_t i = 0; i < n; ++i)
307
if (defList[i]->type() != decList[i]->type())
315
ClassDom findClassByPosition( NamespaceModel* nameSpace, int line, int col )
320
NamespaceList nsList = nameSpace->namespaceList();
321
for (NamespaceList::iterator i = nsList.begin(); i != nsList.end(); ++i)
323
ClassDom result = findClassByPosition(*i, line, col);
328
ClassList classes = nameSpace->classList();
329
for(ClassList::iterator i = classes.begin(); i != classes.end(); ++i)
331
ClassDom result = findClassByPosition( *i, line, col );
339
ClassDom findClassByPosition( ClassModel* aClass, int line, int col )
344
ClassList classes = aClass->classList();
345
for(ClassList::iterator i = classes.begin(); i != classes.end(); ++i)
347
ClassDom result = findClassByPosition( *i, line, col );
352
int startLine, startCol;
353
aClass->getStartPosition(&startLine, &startCol);
355
if (startLine <= line)
358
aClass->getEndPosition(&endLine, &endCol);
366
int findLastMethodLine( ClassDom aClass, CodeModelItem::Access access )
370
const FunctionList functionList = aClass->functionList();
371
for( FunctionList::ConstIterator it=functionList.begin(); it!=functionList.end(); ++it )
373
int funEndLine, funEndColumn;
374
(*it)->getEndPosition( &funEndLine, &funEndColumn );
376
if ((*it)->access() == access && point < funEndLine)
383
int findLastVariableLine( ClassDom aClass, CodeModelItem::Access access )
387
const VariableList varList = aClass->variableList();
388
for( VariableList::ConstIterator it= varList.begin(); it!= varList.end(); ++it )
390
int varEndLine, varEndColumn;
391
(*it)->getEndPosition( &varEndLine, &varEndColumn );
393
if ((*it)->access() == access && point < varEndLine)
400
QString accessSpecifierToString( CodeModelItem::Access access )
404
case CodeModelItem::Public: return "public";
405
case CodeModelItem::Protected: return "protected";
406
case CodeModelItem::Private: return "private";
407
default: return "unknown";
411
}//end of namespace CodeModeUtils