~ubuntu-branches/debian/sid/kdevelop/sid

« back to all changes in this revision

Viewing changes to languages/cpp/cppsupport_utils.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jeremy Lainé
  • Date: 2006-05-23 18:39:42 UTC
  • Revision ID: james.westby@ubuntu.com-20060523183942-hucifbvh68k2bwz7
Tags: upstream-3.3.2
Import upstream version 3.3.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
#include "cppsupport_utils.h"
 
3
#include <codemodel.h>
 
4
#include <qdir.h>
 
5
 
 
6
#include <kdebug.h>
 
7
 
 
8
static void typeNameList( QStringList& path, QStringList & lst, const CodeModel * model );
 
9
static void typeNameList( QStringList& path, QStringList & lst, NamespaceDom ns );
 
10
static void typeNameList( QStringList & path, QStringList & lst, ClassDom klass );
 
11
 
 
12
QStringList typeNameList( const CodeModel* model )
 
13
{
 
14
        QStringList lst;
 
15
        QStringList path;
 
16
        typeNameList( path, lst, model );
 
17
        return lst;
 
18
}
 
19
 
 
20
static void typeNameList( QStringList& path, QStringList & lst, const CodeModel * model )
 
21
{
 
22
        const FileList fileList = model->fileList();
 
23
        for( FileList::ConstIterator it=fileList.begin(); it!=fileList.end(); ++it )
 
24
                typeNameList( path, lst, model_cast<NamespaceDom>(*it) );
 
25
}
 
26
 
 
27
static void typeNameList( QStringList& path, QStringList & lst, NamespaceDom ns )
 
28
{
 
29
        if( !ns->isFile() )
 
30
                path.push_back( ns->name() );
 
31
        
 
32
        const NamespaceList namespaceList = ns->namespaceList();
 
33
        for( NamespaceList::ConstIterator it=namespaceList.begin(); it!=namespaceList.end(); ++it )
 
34
                typeNameList( path, lst, *it );
 
35
        
 
36
        const ClassList classList = ns->classList();
 
37
        for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it )
 
38
                typeNameList( path, lst, *it );
 
39
        
 
40
        if( !ns->isFile() )
 
41
                path.pop_back();
 
42
}
 
43
 
 
44
static void typeNameList( QStringList & path, QStringList & lst, ClassDom klass )
 
45
{
 
46
        path.push_back( klass->name() );
 
47
        
 
48
        lst << path.join( "::" );
 
49
        
 
50
        const ClassList classList = klass->classList();
 
51
        for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it )
 
52
                typeNameList( path, lst, *it );
 
53
        
 
54
        path.pop_back();
 
55
}
 
56
 
 
57
static void typedefMap( QMap<QString, QString> & map, const CodeModel * model );
 
58
static void typedefMap( QMap<QString, QString> & map, NamespaceDom ns );
 
59
static void typedefMap( QMap<QString, QString> & map, ClassDom klass );
 
60
 
 
61
QMap<QString, QString> typedefMap( const CodeModel* model )
 
62
{
 
63
        QMap<QString, QString> map;
 
64
        typedefMap( map, model );
 
65
        
 
66
        /*We need to flatten the typedefs to avoid circular aliases. 
 
67
      Example:
 
68
                map["Foo"] = "int";
 
69
                map["Bar"] = "Foo";
 
70
                map["Baz"] = "Bar";*/
 
71
        
 
72
        QMap<QString, QString>::iterator it = map.begin();
 
73
        for ( ; it != map.end(); ++it )
 
74
        {
 
75
                while ( map.contains( map[ it.key() ] ) && 
 
76
                        it.key() != map[ it.key() ] )
 
77
                {
 
78
                        map[ it.key() ] = map[ map[ it.key() ] ];
 
79
                }
 
80
        }
 
81
        
 
82
        return map;
 
83
}
 
84
 
 
85
static void typedefMap( QMap<QString, QString> & map, const CodeModel * model )
 
86
{
 
87
        const FileList fileList = model->fileList();
 
88
        for( FileList::ConstIterator it=fileList.begin(); it!=fileList.end(); ++it )
 
89
                typedefMap( map, model_cast<NamespaceDom>(*it) );
 
90
}
 
91
 
 
92
static void typedefMap( QMap<QString, QString> & map, NamespaceDom ns )
 
93
{
 
94
        const TypeAliasList aliasList = ns->typeAliasList();
 
95
        for( TypeAliasList::ConstIterator it=aliasList.begin(); it!=aliasList.end(); ++it )
 
96
                map[ ( *it )->name() ] = ( *it )->type();
 
97
        
 
98
        const NamespaceList namespaceList = ns->namespaceList();
 
99
        for( NamespaceList::ConstIterator it=namespaceList.begin(); it!=namespaceList.end(); ++it )
 
100
                typedefMap( map, *it );
 
101
        
 
102
        const ClassList classList = ns->classList();
 
103
        for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it )
 
104
                typedefMap( map, *it );
 
105
}
 
106
 
 
107
static void typedefMap( QMap<QString, QString> & map, ClassDom klass )
 
108
{
 
109
        const TypeAliasList aliasList = klass->typeAliasList();
 
110
        for( TypeAliasList::ConstIterator it=aliasList.begin(); it!=aliasList.end(); ++it )
 
111
                map[ ( *it )->name() ] = ( *it )->type();
 
112
        
 
113
        const ClassList classList = klass->classList();
 
114
        for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it )
 
115
                typedefMap( map, *it );
 
116
}
 
117
 
 
118
//kate: indent-mode csands; tab-width 4; space-indent off;