[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