From 114a878c64ce6f8223cfd22d76a20eb16d177e5e Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdevelop@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- languages/cpp/cppsupport_utils.cpp | 139 +++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 languages/cpp/cppsupport_utils.cpp (limited to 'languages/cpp/cppsupport_utils.cpp') diff --git a/languages/cpp/cppsupport_utils.cpp b/languages/cpp/cppsupport_utils.cpp new file mode 100644 index 00000000..e6f80abc --- /dev/null +++ b/languages/cpp/cppsupport_utils.cpp @@ -0,0 +1,139 @@ +#include + +#include +#include +#include + +#include + +#include "cppsupport_utils.h" + +static void typeNameList( QStringList& path, QStringList & lst, const CodeModel * model ); +static void typeNameList( QStringList& path, QStringList & lst, NamespaceDom ns ); +static void typeNameList( QStringList & path, QStringList & lst, ClassDom klass ); + +QStringList typeNameList( const CodeModel* model ) +{ + QStringList lst; + QStringList path; + typeNameList( path, lst, model ); + return lst; +} + +static void typeNameList( QStringList& path, QStringList & lst, const CodeModel * model ) +{ + const FileList fileList = model->fileList(); + for( FileList::ConstIterator it=fileList.begin(); it!=fileList.end(); ++it ) + typeNameList( path, lst, model_cast(*it) ); +} + +static void typeNameList( QStringList& path, QStringList & lst, NamespaceDom ns ) +{ + if( !ns->isFile() ) + path.push_back( ns->name() ); + + const NamespaceList namespaceList = ns->namespaceList(); + for( NamespaceList::ConstIterator it=namespaceList.begin(); it!=namespaceList.end(); ++it ) + typeNameList( path, lst, *it ); + + const ClassList classList = ns->classList(); + for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it ) + typeNameList( path, lst, *it ); + + if( !ns->isFile() ) + path.pop_back(); +} + +static void typeNameList( QStringList & path, QStringList & lst, ClassDom klass ) +{ + path.push_back( klass->name() ); + + lst << path.join( "::" ); + + const ClassList classList = klass->classList(); + for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it ) + typeNameList( path, lst, *it ); + + path.pop_back(); +} + +static void typedefMap( QMap & map, const CodeModel * model ); +static void typedefMap( QMap & map, NamespaceDom ns ); +static void typedefMap( QMap & map, ClassDom klass ); + +QMap typedefMap( const CodeModel* model ) +{ + QMap map; + typedefMap( map, model ); + + /*We need to flatten the typedefs to avoid circular aliases. + Example: + map["Foo"] = "int"; + map["Bar"] = "Foo"; + map["Baz"] = "Bar";*/ + + QMap::iterator it = map.begin(); + for ( ; it != map.end(); ++it ) + { + while ( map.contains( map[ it.key() ] ) && + it.key() != map[ it.key() ] ) + { + map[ it.key() ] = map[ map[ it.key() ] ]; + } + } + + return map; +} + +static void typedefMap( QMap & map, const CodeModel * model ) +{ + const FileList fileList = model->fileList(); + for( FileList::ConstIterator it=fileList.begin(); it!=fileList.end(); ++it ) + typedefMap( map, model_cast(*it) ); +} + +static void typedefMap( QMap & map, NamespaceDom ns ) +{ + const TypeAliasList aliasList = ns->typeAliasList(); + for( TypeAliasList::ConstIterator it=aliasList.begin(); it!=aliasList.end(); ++it ) + map[ ( *it )->name() ] = ( *it )->type(); + + const NamespaceList namespaceList = ns->namespaceList(); + for( NamespaceList::ConstIterator it=namespaceList.begin(); it!=namespaceList.end(); ++it ) + typedefMap( map, *it ); + + const ClassList classList = ns->classList(); + for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it ) + typedefMap( map, *it ); +} + +static void typedefMap( QMap & map, ClassDom klass ) +{ + const TypeAliasList aliasList = klass->typeAliasList(); + for( TypeAliasList::ConstIterator it=aliasList.begin(); it!=aliasList.end(); ++it ) + map[ ( *it )->name() ] = ( *it )->type(); + + const ClassList classList = klass->classList(); + for( ClassList::ConstIterator it=classList.begin(); it!=classList.end(); ++it ) + typedefMap( map, *it ); +} + +QString formattedOpeningParenthesis(bool suppressSpace) +{ + KConfig * config = kapp->config(); + config->setGroup("AStyle"); + bool use_spaces = config->readBoolEntry("PadParentheses", false); + if (not use_spaces or suppressSpace) return "("; + return "( "; +} + +QString formattedClosingParenthesis(bool suppressSpace) +{ + KConfig * config = kapp->config(); + config->setGroup("AStyle"); + bool use_spaces = config->readBoolEntry("PadParentheses", false); + if (not use_spaces or suppressSpace) return ")"; + return " )"; +} + +//kate: indent-mode csands; tab-width 4; space-indent off; -- cgit v1.2.1