From fca3ec1f3288ac4bcbfaed7f6c613af5cc762dda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Wed, 4 Feb 2009 16:40:42 +0100 Subject: [PATCH 1/2] Completion for constructors used on initialization Deals with cases like "QString s(", but for the moment doesn't handle yet "QString const s(". Done with Roberto Raggi. --- src/plugins/cpptools/cppcodecompletion.cpp | 85 ++++++++++++++++------ src/plugins/cpptools/cppcodecompletion.h | 4 +- 2 files changed, 65 insertions(+), 24 deletions(-) diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index bca1d576e9f..40b73996183 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -432,7 +432,7 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) return -1; m_editor = editor; - m_startPosition = findStartOfName(editor); + m_startPosition = findStartOfName(); m_completionOperator = T_EOF_SYMBOL; int endOfOperator = m_startPosition; @@ -520,7 +520,7 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) if (m_completionOperator == T_LPAREN && completeFunction(exprTy, resolvedTypes, context)) { return m_startPosition; - } if ((m_completionOperator == T_DOT || m_completionOperator == T_ARROW) && + } else if ((m_completionOperator == T_DOT || m_completionOperator == T_ARROW) && completeMember(resolvedTypes, context)) { return m_startPosition; } else if (m_completionOperator == T_COLON_COLON && completeScope(resolvedTypes, context)) { @@ -531,6 +531,32 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) return m_startPosition; } } + + if (m_completionOperator == T_LPAREN) { + // Find the expression that precedes the current name + int index = endOfExpression; + while (m_editor->characterAt(index - 1).isSpace()) + --index; + index = findStartOfName(index); + + QTextCursor tc(edit->document()); + tc.setPosition(index); + QString baseExpression = expressionUnderCursor(tc); + + // Resolve the type of this expression + QList results = + typeOfExpression(baseExpression, thisDocument, symbol, TypeOfExpression::Preprocess); + + // If it's a class, add completions for the constructors + foreach (const TypeOfExpression::Result &result, results) { + if (result.first->isClass()) { + FullySpecifiedType exprTy = result.first; + if (completeConstructors(exprTy->asClass())) + return m_startPosition; + break; + } + } + } } // nothing to do. @@ -541,26 +567,14 @@ bool CppCodeCompletion::completeFunction(FullySpecifiedType exprTy, const QList &resolvedTypes, const LookupContext &) { - ConvertToCompletionItem toCompletionItem(this); - Overview o; - o.setShowReturnTypes(true); - o.setShowArgumentNames(true); - if (Class *klass = exprTy->asClass()) { - for (unsigned i = 0; i < klass->memberCount(); ++i) { - Symbol *member = klass->memberAt(i); - if (! member->type()->isFunction()) - continue; - else if (! member->identity()) - continue; - else if (! member->identity()->isEqualTo(klass->identity())) - continue; - if (TextEditor::CompletionItem item = toCompletionItem(member)) { - item.m_text = o(member->type(), member->name()); - m_completions.append(item); - } - } + completeConstructors(klass); } else { + ConvertToCompletionItem toCompletionItem(this); + Overview o; + o.setShowReturnTypes(true); + o.setShowArgumentNames(true); + QSet signatures; foreach (TypeOfExpression::Result p, resolvedTypes) { FullySpecifiedType ty = p.first; @@ -873,6 +887,30 @@ void CppCodeCompletion::completeClass(const QList &candidates, } } +bool CppCodeCompletion::completeConstructors(Class *klass) +{ + ConvertToCompletionItem toCompletionItem(this); + Overview o; + o.setShowReturnTypes(true); + o.setShowArgumentNames(true); + + for (unsigned i = 0; i < klass->memberCount(); ++i) { + Symbol *member = klass->memberAt(i); + if (! member->type()->isFunction()) + continue; + else if (! member->identity()) + continue; + else if (! member->identity()->isEqualTo(klass->identity())) + continue; + if (TextEditor::CompletionItem item = toCompletionItem(member)) { + item.m_text = o(member->type(), member->name()); + m_completions.append(item); + } + } + + return ! m_completions.isEmpty(); +} + bool CppCodeCompletion::completeQtMethod(CPlusPlus::FullySpecifiedType, const QList &results, const LookupContext &context, @@ -1135,14 +1173,15 @@ void CppCodeCompletion::cleanup() typeOfExpression.setSnapshot(Snapshot()); } -int CppCodeCompletion::findStartOfName(const TextEditor::ITextEditor *editor) +int CppCodeCompletion::findStartOfName(int pos) const { - int pos = editor->position(); + if (pos == -1) + pos = m_editor->position(); QChar chr; // Skip to the start of a name do { - chr = editor->characterAt(--pos); + chr = m_editor->characterAt(--pos); } while (chr.isLetterOrNumber() || chr == QLatin1Char('_')); return pos + 1; diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h index 08a767ea6ce..02bcdc0f524 100644 --- a/src/plugins/cpptools/cppcodecompletion.h +++ b/src/plugins/cpptools/cppcodecompletion.h @@ -103,6 +103,8 @@ private: const CPlusPlus::LookupContext &context, bool staticLookup = true); + bool completeConstructors(CPlusPlus::Class *klass); + bool completeQtMethod(CPlusPlus::FullySpecifiedType exprTy, const QList &, const CPlusPlus::LookupContext &context, @@ -118,7 +120,7 @@ private: const CPlusPlus::LookupContext &context) { return completeQtMethod(exprTy, results, context, false); } - static int findStartOfName(const TextEditor::ITextEditor *editor); + int findStartOfName(int pos = -1) const; QList m_completions; From 2216cda2fc754ead37b7e4594cefd2749534a6cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Wed, 4 Feb 2009 17:03:43 +0100 Subject: [PATCH 2/2] Fixed the sizehints of the editor or splitters Done with mae. --- .../coreplugin/editormanager/editormanager.cpp | 13 ++++--------- .../coreplugin/editormanager/editormanager.h | 2 -- src/plugins/coreplugin/editormanager/editorview.cpp | 7 +++++++ src/plugins/coreplugin/editormanager/editorview.h | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index a88ca731f94..359bdb1c0f1 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -140,7 +140,6 @@ struct EditorManagerPrivate { Internal::SplitterOrView *m_splitter; QPointer m_currentEditor; QPointer m_currentView; - QStackedLayout *m_stackedLayout; ICore *m_core; @@ -182,7 +181,6 @@ struct EditorManagerPrivate { EditorManagerPrivate::EditorManagerPrivate(ICore *core, QWidget *parent) : m_view(0), m_splitter(0), - m_stackedLayout(0), m_core(core), m_revertToSavedAction(new QAction(EditorManager::tr("Revert to Saved"), parent)), m_saveAction(new QAction(parent)), @@ -388,8 +386,10 @@ EditorManager::EditorManager(ICore *core, QWidget *parent) : m_d->m_view = m_d->m_splitter->view(); - m_d->m_stackedLayout = new QStackedLayout(this); - m_d->m_stackedLayout->addWidget(m_d->m_splitter); + QHBoxLayout *layout = new QHBoxLayout(this); + layout->setMargin(0); + layout->setSpacing(0); + layout->addWidget(m_d->m_splitter); updateActions(); @@ -423,11 +423,6 @@ void EditorManager::init() pluginManager()->addObject(m_d->m_openEditorsFactory); } -QSize EditorManager::minimumSizeHint() const -{ - return QSize(400, 300); -} - QString EditorManager::defaultExternalEditor() const { #ifdef Q_OS_MAC diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h index 9e6bb4f1ac2..761bde24696 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.h +++ b/src/plugins/coreplugin/editormanager/editormanager.h @@ -151,8 +151,6 @@ public: void saveSettings(QSettings *settings); void readSettings(QSettings *settings); - QSize minimumSizeHint() const; - Internal::OpenEditorsWindow *windowPopup() const; void showWindowPopup() const; diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index 15652872ded..98224d9f82d 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -656,6 +656,13 @@ SplitterOrView *SplitterOrView::findNextView_helper(SplitterOrView *view, bool * return 0; } +QSize SplitterOrView::minimumSizeHint() const +{ + if (m_splitter) + return m_splitter->minimumSizeHint(); + return QSize(64, 64); +} + void SplitterOrView::split(Qt::Orientation orientation) { Q_ASSERT(m_view && m_splitter == 0); diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h index 37f0ea6a5a6..7387d1c85f9 100644 --- a/src/plugins/coreplugin/editormanager/editorview.h +++ b/src/plugins/coreplugin/editormanager/editorview.h @@ -179,8 +179,8 @@ public: SplitterOrView *findNextView(SplitterOrView *view); - QSize sizeHint() const { return QSize(32, 32); } - QSize minimumSizeHint() const { return QSize(32, 32); } + QSize sizeHint() const { return minimumSizeHint(); } + QSize minimumSizeHint() const; protected: void focusInEvent(QFocusEvent *);