[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdevplatform/language/duchain
From: David Nolden <david.nolden.kde () art-master ! de>
Date: 2008-10-31 23:04:23
Message-ID: 1225494263.052751.15564.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 878333 by zwabel:
- Make the inheriter-computation respect when there is multiple parsed versions of the same class.
- Move some useful functions to DUChainUtils
M +38 -0 duchainutils.cpp
M +9 -1 duchainutils.h
M +3 -28 navigation/abstractdeclarationnavigationcontext.cpp
--- trunk/KDE/kdevplatform/language/duchain/duchainutils.cpp #878332:878333
@@ -39,6 +39,7 @@
#include "classmemberdeclaration.h"
#include "functiondefinition.h"
#include "specializationstore.h"
+#include "persistentsymboltable.h"
using namespace KDevelop;
using namespace KTextEditor;
@@ -374,3 +375,40 @@
}
return 0;
}
+
+///For a class, returns all classes that inherit it
+QList<Declaration*> DUChainUtils::getInheriters(const Declaration* decl, bool collectVersions)
+{
+ QList<Declaration*> ret;
+
+ if(decl->internalContext() && decl->internalContext()->type() == DUContext::Class)
+ foreach(DUContext* importer, decl->internalContext()->importers())
+ if(importer->type() == DUContext::Class && importer->owner())
+ ret << importer->owner();
+
+ if(collectVersions && decl->inSymbolTable()) {
+ uint count;
+ const IndexedDeclaration* allDeclarations;
+ PersistentSymbolTable::self().declarations(decl->qualifiedIdentifier(), count, allDeclarations);
+ for(int a = 0; a < count; ++a) {
+ if(allDeclarations[a].data() && allDeclarations[a].data() != decl) {
+ ret += getInheriters(allDeclarations[a].data(), false);
+ }
+ }
+ }
+
+ return ret;
+}
+
+QList<Declaration*> DUChainUtils::getOverriders(const Declaration* currentClass, const Declaration* \
overriddenDeclaration) { + QList<Declaration*> ret;
+
+ if(currentClass != overriddenDeclaration->context()->owner() && currentClass->internalContext())
+ ret += currentClass->internalContext()->findLocalDeclarations(overriddenDeclaration->identifier(), \
SimpleCursor::invalid(), currentClass->topContext(), overriddenDeclaration->abstractType()); +
+ foreach(Declaration* inheriter, getInheriters(currentClass))
+ ret += getOverriders(inheriter, overriddenDeclaration);
+
+ return ret;
+}
+
--- trunk/KDE/kdevplatform/language/duchain/duchainutils.h #878332:878333
@@ -38,6 +38,7 @@
class SimpleCursor;
class HashedString;
class TopDUContext;
+class IndexedDUContext;
/**
* A namespace which contains convenience utilities for navigating definition-use chains.
@@ -70,7 +71,14 @@
KDEVPLATFORMLANGUAGE_EXPORT void collectItems( DUContext* context, DUChainItemFilter& filter );
KDEVPLATFORMLANGUAGE_EXPORT DUContext* getArgumentContext(Declaration* decl);
-
+
+ ///If the given declaration is a class, this gets all classes that inherit this one
+ ///@param collectVersions If this is true, the persistent symbol table is used to first find all \
registered + /// versions of this class, and then get the inheriters from them all \
together. This is neded for C++. + KDEVPLATFORMLANGUAGE_EXPORT QList<Declaration*> getInheriters(const \
Declaration* decl, bool collectVersions = true); +
+ ///Gets all functions that override the function @param overriddenDeclaration, starting the search at \
@param currentClass + KDEVPLATFORMLANGUAGE_EXPORT QList<Declaration*> getOverriders(const Declaration* \
currentClass, const Declaration* overriddenDeclaration); }
}
--- trunk/KDE/kdevplatform/language/duchain/navigation/abstractdeclarationnavigationcontext.cpp \
#878332:878333 @@ -34,6 +34,7 @@
#include "../types/pointertype.h"
#include "../types/referencetype.h"
#include "../types/typeutils.h"
+#include "../persistentsymboltable.h"
namespace KDevelop {
AbstractDeclarationNavigationContext::AbstractDeclarationNavigationContext( DeclarationPointer decl, \
KDevelop::TopDUContextPointer topContext, AbstractNavigationContext* previousContext) @@ -267,32 +268,6 \
@@ m_currentText += "<br />";
}
-///For a class, returns all classes that inherit it
-///@todo Respect different parsed versions of headers here. The same class may have multiple \
Declarations.
-QList<Declaration*> getInheriters(const Declaration* decl)
-{
- QList<Declaration*> ret;
-
- if(decl->internalContext() && decl->internalContext()->type() == DUContext::Class)
- foreach(DUContext* importer, decl->internalContext()->importers())
- if(importer->type() == DUContext::Class && importer->owner())
- ret << importer->owner();
-
- return ret;
-}
-
-QList<Declaration*> getOverriders(const Declaration* currentClass, const Declaration* \
overriddenDeclaration) {
- QList<Declaration*> ret;
-
- if(currentClass != overriddenDeclaration->context()->owner() && currentClass->internalContext())
- ret += currentClass->internalContext()->findLocalDeclarations(overriddenDeclaration->identifier(), \
SimpleCursor::invalid(), currentClass->topContext(), \
overriddenDeclaration->abstractType());
-
- foreach(Declaration* inheriter, getInheriters(currentClass))
- ret += getOverriders(inheriter, overriddenDeclaration);
-
- return ret;
-}
-
void AbstractDeclarationNavigationContext::htmlAdditionalNavigation()
{
///Check if the function overrides or hides another one
@@ -338,7 +313,7 @@
if(classFunDecl->isVirtual()) {
Declaration* classDecl = m_declaration->context()->owner();
if(classDecl) {
- QList<Declaration*> overriders = getOverriders(classDecl, classFunDecl);
+ QList<Declaration*> overriders = DUChainUtils::getOverriders(classDecl, classFunDecl);
if(!overriders.isEmpty()) {
m_currentText += i18n("Overridden in") + " ";
@@ -358,7 +333,7 @@
}
///Show all classes that inherit this one
- QList<Declaration*> inheriters = getInheriters(m_declaration.data());
+ QList<Declaration*> inheriters = DUChainUtils::getInheriters(m_declaration.data());
if(!inheriters.isEmpty()) {
m_currentText += i18n("Inherited by") + " ";
bool first = true;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic