[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kdevelop-bugs
Subject:    [Bug 257740] Code completion empty after scrolling
From:       David Nolden <david.nolden.kde () art-master ! de>
Date:       2010-11-27 20:58:12
Message-ID: 20101127205812.B49C875718 () immanuel ! kde ! org
[Download RAW message or body]

https://bugs.kde.org/show_bug.cgi?id=257740


David Nolden <david.nolden.kde@art-master.de> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|                            |FIXED




--- Comment #1 from David Nolden <david nolden kde art-master de>  2010-11-27 21:58:11 ---
commit 6f7a1478dd5dc7e1ea6f34cd0f2d782b19925e8c
branch master
Author: David nolden <david.nolden.kde@art-master.de>
Date:   Sat Nov 27 21:54:13 2010 +0100

    - Always cache the name of completion-items in the "alternativeText"
member, so at least the text can still properly be returned when the
declaration disappears.
    - When executing a completion item with a disappeared declaration, at least
insert the stored name.
    - Copy in about 40 lines of code from the kdevplatform base class. This
split was non-logical and random (purely based on code similarity), and also
lead to twice as many duchain locks as required for code completion. Now the
base class function is not called any more from here.
    BUG: 257740

diff --git a/languages/cpp/codecompletion/item.cpp
b/languages/cpp/codecompletion/item.cpp
index 2d2374b..6122d7b 100644
--- a/languages/cpp/codecompletion/item.cpp
+++ b/languages/cpp/codecompletion/item.cpp
@@ -113,7 +113,10 @@ void
NormalDeclarationCompletionItem::execute(KTextEditor::Document* document, c
       newText = m_declaration->identifier().toString();
     } else {
       kDebug() << "Declaration disappeared";
-      return;
+      if(!alternativeText.isEmpty())
+        newText = alternativeText;
+      else
+        return;
     }
   }else{
     newText = alternativeText;
@@ -126,6 +129,10 @@ void
NormalDeclarationCompletionItem::execute(KTextEditor::Document* document, c
   bool jumpForbidden = false;

   KDevelop::DUChainReadLocker lock(KDevelop::DUChain::lock());
+  
+  if(!m_declaration.data())
+    return;
+  
   Cpp::TemplateDeclaration* templateDecl =
dynamic_cast<Cpp::TemplateDeclaration*>(m_declaration.data());
   if(templateDecl) {
     DUContext* context =
templateDecl->templateContext(m_declaration->topContext());
@@ -421,8 +428,42 @@ QVariant NormalDeclarationCompletionItem::data(const
QModelIndex& index, int rol
               }
             return QVariant();
           }
-          break;
+          if (m_declaration->abstractType()) {
+            if(EnumeratorType::Ptr enumerator =
m_declaration->type<EnumeratorType>()) {
+              if(m_declaration->context()->owner() &&
m_declaration->context()->owner()->abstractType()) {
+                if(!m_declaration->context()->owner()->identifier().isEmpty())
+                  return
shortenedTypeString(DeclarationPointer(m_declaration->context()->owner()),
desiredTypeLength);
+                else
+                  return "enum";
+              }
+            }
+            if (FunctionType::Ptr functionType =
m_declaration->type<FunctionType>()) {
+              ClassFunctionDeclaration* funDecl =
dynamic_cast<ClassFunctionDeclaration*>(m_declaration.data());
+
+              if (functionType->returnType()) {
+                QString ret = shortenedTypeString(m_declaration,
desiredTypeLength);
+                if(shortenArgumentHintReturnValues && argumentHintDepth() &&
ret.length() > maximumArgumentHintReturnValueLength)
+                  return QString("...");
+                else
+                  return ret;
+              }else if(argumentHintDepth()) {
+                return QString();//Don't show useless prefixes in the
argument-hints
+              }else if(funDecl && funDecl->isConstructor() )
+                return "<constructor>";
+              else if(funDecl && funDecl->isDestructor() )
+                return "<destructor>";
+              else
+                return "<incomplete type>";
+
+            } else {
+              return shortenedTypeString(m_declaration, desiredTypeLength);
+            }
+          } else {
+            return "<incomplete type>";
+          }
+          return QVariant();
         }
+        break;
         case CodeCompletionModel::Scope: {
           //The scopes are not needed
           return QVariant();
@@ -451,6 +492,20 @@ QVariant NormalDeclarationCompletionItem::data(const
QModelIndex& index, int rol
           return ret;
         }
         break;
+        case CodeCompletionModel::Name:
+        {
+          if(alternativeText.isEmpty())
+            alternativeText = declarationName();
+          return alternativeText;
+        }
+        case CodeCompletionModel::Postfix:
+        {
+            if (FunctionType::Ptr functionType =
m_declaration->type<FunctionType>()) {
+              // Retrieve const/volatile string
+              return functionType->AbstractType::toString();
+            }
+            return QVariant();
+        }
       }
       break;
     case CodeCompletionModel::HighlightingMethod:
@@ -504,10 +559,27 @@ QVariant NormalDeclarationCompletionItem::data(const
QModelIndex& index, int rol
       }
       break;
     }
-  }
-  lock.unlock();
+    case CodeCompletionModel::BestMatchesCount:
+      return QVariant(normalBestMatchesCount);
+    break;
+    case CodeCompletionModel::IsExpandable:
+      return QVariant(createsExpandingWidget());
+    case CodeCompletionModel::ExpandingWidget: {
+      QWidget* nav = createExpandingWidget(model);
+      Q_ASSERT(nav);
+      model->addNavigationWidget(this, nav);
+
+      QVariant v;
+      v.setValue<QWidget*>(nav);
+      return v;
+    }
+    case CodeCompletionModel::ScopeIndex:
+      return
static_cast<int>(reinterpret_cast<long>(m_declaration->context()));

-  return KDevelop::NormalDeclarationCompletionItem::data(index, role, model);
+    case CodeCompletionModel::CompletionRole:
+      return (int)completionProperties();
+  }
+  return QVariant();
 }

 void NormalDeclarationCompletionItem::needCachedArgumentList() const
diff --git a/languages/cpp/codecompletion/item.h
b/languages/cpp/codecompletion/item.h
index 08fda69..360e16e 100644
--- a/languages/cpp/codecompletion/item.h
+++ b/languages/cpp/codecompletion/item.h
@@ -70,7 +70,7 @@ public:

   bool completingTemplateParameters() const;

-  QString alternativeText; //Text shown when declaration is zero
+  mutable QString alternativeText; //Text shown when declaration is zero

   //If this is true, alternativeText will be shown in the list, and will be
inserted on execution.
   //Also the scope will be set to LocalScope when this attribute is true.

-- 
Configure bugmail: https://bugs.kde.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.

_______________________________________________
KDevelop-bugs mailing list
KDevelop-bugs@kdevelop.org
https://barney.cs.uni-potsdam.de/mailman/listinfo/kdevelop-bugs
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic