From 738c50726deab938d9504df17d5fbd771c316b38 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Tue, 17 Feb 2009 11:25:44 +0100 Subject: [PATCH 1/5] Compile. --- src/plugins/debugger/gdbengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp index a9df09e5e93..f6df98327f2 100644 --- a/src/plugins/debugger/gdbengine.cpp +++ b/src/plugins/debugger/gdbengine.cpp @@ -1126,7 +1126,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data) sendCommand("info proc", GdbInfoProc); #endif #if defined(Q_OS_MAC) - sendCommand("info pid", GdbInfoProc, QVariant(), true); + sendCommand("info pid", GdbInfoProc); #endif sendCommand("-file-list-exec-source-files", GdbQuerySources); tryLoadCustomDumpers(); From a26bef5ff41ba4389fad3aacfa9d74d15e0423e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Tue, 17 Feb 2009 11:09:07 +0100 Subject: [PATCH 2/5] Ignore undefined macros in macro completion Done with Roberto Raggi --- src/plugins/cpptools/cppcodecompletion.cpp | 50 ++++++++++++++-------- src/plugins/cpptools/cppcodecompletion.h | 4 ++ 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index b9dc55f0b99..81cc4741b5e 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -819,33 +819,45 @@ void CppCodeCompletion::addKeywords() void CppCodeCompletion::addMacros(const LookupContext &context) { - // macro completion items. - QSet macroNames; QSet processed; - QList todo; - todo.append(context.thisDocument()->fileName()); - while (! todo.isEmpty()) { - QString fn = todo.last(); - todo.removeLast(); - if (processed.contains(fn)) - continue; - processed.insert(fn); - if (Document::Ptr doc = context.document(fn)) { - foreach (const Macro ¯o, doc->definedMacros()) { - macroNames.insert(macro.name()); - } - todo += doc->includedFiles(); - } - } + QSet definedMacros; - foreach (const QByteArray ¯oName, macroNames) { + addMacros_helper(context, context.thisDocument()->fileName(), + &processed, &definedMacros); + + foreach (const QString ¯oName, definedMacros) { TextEditor::CompletionItem item(this); - item.m_text = QString::fromUtf8(macroName.constData(), macroName.length()); + item.m_text = macroName; item.m_icon = m_icons.macroIcon(); m_completions.append(item); } } +void CppCodeCompletion::addMacros_helper(const LookupContext &context, + const QString &fileName, + QSet *processed, + QSet *definedMacros) +{ + Document::Ptr doc = context.document(fileName); + + if (! doc || processed->contains(doc->fileName())) + return; + + processed->insert(doc->fileName()); + + foreach (const Document::Include &i, doc->includes()) { + addMacros_helper(context, i.fileName(), processed, definedMacros); + } + + foreach (const Macro ¯o, doc->definedMacros()) { + const QString macroName = QString::fromUtf8(macro.name().constData(), macro.name().length()); + if (! macro.isHidden()) + definedMacros->insert(macroName); + else + definedMacros->remove(macroName); + } +} + void CppCodeCompletion::addCompletionItem(Symbol *symbol) { ConvertToCompletionItem toCompletionItem(this); diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h index 79f580236f9..3c1be57bd5d 100644 --- a/src/plugins/cpptools/cppcodecompletion.h +++ b/src/plugins/cpptools/cppcodecompletion.h @@ -84,6 +84,10 @@ public: private: void addKeywords(); void addMacros(const CPlusPlus::LookupContext &context); + void addMacros_helper(const CPlusPlus::LookupContext &context, + const QString &fileName, + QSet *processed, + QSet *definedMacros); void addCompletionItem(CPlusPlus::Symbol *symbol); bool completeConstructorOrFunction(CPlusPlus::FullySpecifiedType exprTy, From 7774977e5d506ea7f414daca362edd9a333f6de5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Tue, 17 Feb 2009 11:23:46 +0100 Subject: [PATCH 3/5] Fixed handling of attribute specifiers in front of declaration Done with Roberto Raggi --- src/shared/cplusplus/CheckSpecifier.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp index eeb59eebcc0..a001947ff50 100644 --- a/src/shared/cplusplus/CheckSpecifier.cpp +++ b/src/shared/cplusplus/CheckSpecifier.cpp @@ -384,8 +384,9 @@ bool CheckSpecifier::visit(TypeofSpecifierAST *ast) return false; } -bool CheckSpecifier::visit(AttributeSpecifierAST *) +bool CheckSpecifier::visit(AttributeSpecifierAST *ast) { + accept(ast->next); return false; } From c020250556d3ae210acb174901754452922356bd Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Tue, 17 Feb 2009 11:50:56 +0100 Subject: [PATCH 4/5] Fixes: Constructor completion. --- src/plugins/cpptools/cppcodecompletion.cpp | 42 +++++++++++++--------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 9815b6f2c16..dacce4a180a 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -563,32 +563,42 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) return -1; } -bool CppCodeCompletion::completeConstructorOrFunction(FullySpecifiedType exprTy, - const QList &resolvedTypes) +bool CppCodeCompletion::completeConstructorOrFunction(FullySpecifiedType, + const QList &results) { ConvertToCompletionItem toCompletionItem(this); Overview o; o.setShowReturnTypes(true); o.setShowArgumentNames(true); - if (Class *klass = exprTy->asClassType()) { - for (unsigned i = 0; i < klass->memberCount(); ++i) { - Symbol *member = klass->memberAt(i); - if (! member->type()->isFunctionType()) - 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); + foreach (const TypeOfExpression::Result &result, results) { + FullySpecifiedType exprTy = result.first; + + if (Class *klass = exprTy->asClassType()) { + for (unsigned i = 0; i < klass->memberCount(); ++i) { + Symbol *member = klass->memberAt(i); + if (! member->type()->isFunctionType()) + 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); + } } + + break; } - } else { + } + + if (m_completions.isEmpty()) { QSet signatures; - foreach (TypeOfExpression::Result p, resolvedTypes) { + + foreach (const TypeOfExpression::Result &p, results) { FullySpecifiedType ty = p.first; + if (Function *fun = ty->asFunctionType()) { if (TextEditor::CompletionItem item = toCompletionItem(fun)) { QString signature; From 7044809139350cd96e55b7ace829744edbb394b4 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Tue, 17 Feb 2009 12:12:14 +0100 Subject: [PATCH 5/5] Cleanup --- src/plugins/cpptools/cppcodecompletion.cpp | 28 ++++++++++------------ src/plugins/cpptools/cppcodecompletion.h | 16 +++++-------- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index af81980578e..382ff50b2b5 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -512,22 +512,21 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) context = typeOfExpression.lookupContext(); } - if (! resolvedTypes.isEmpty() && resolvedTypes.first().first) { - FullySpecifiedType exprTy = resolvedTypes.first().first; - - if (exprTy->isReferenceType()) - exprTy = exprTy->asReferenceType()->elementType(); - - if (m_completionOperator == T_LPAREN && completeConstructorOrFunction(exprTy, resolvedTypes)) { + if (! resolvedTypes.isEmpty()) { + if (m_completionOperator == T_LPAREN && completeConstructorOrFunction(resolvedTypes)) { return m_startPosition; + } 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)) { return m_startPosition; - } else if (m_completionOperator == T_SIGNAL && completeSignal(exprTy, resolvedTypes, context)) { + + } else if (m_completionOperator == T_SIGNAL && completeSignal(resolvedTypes, context)) { return m_startPosition; - } else if (m_completionOperator == T_SLOT && completeSlot(exprTy, resolvedTypes, context)) { + + } else if (m_completionOperator == T_SLOT && completeSlot(resolvedTypes, context)) { return m_startPosition; } } @@ -550,8 +549,7 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) // If it's a class, add completions for the constructors foreach (const TypeOfExpression::Result &result, results) { if (result.first->isClassType()) { - FullySpecifiedType exprTy = result.first; - if (completeConstructorOrFunction(exprTy, QList())) + if (completeConstructorOrFunction(results)) return m_startPosition; break; } @@ -563,8 +561,7 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) return -1; } -bool CppCodeCompletion::completeConstructorOrFunction(FullySpecifiedType, - const QList &results) +bool CppCodeCompletion::completeConstructorOrFunction(const QList &results) { ConvertToCompletionItem toCompletionItem(this); Overview o; @@ -924,8 +921,7 @@ void CppCodeCompletion::completeClass(const QList &candidates, } } -bool CppCodeCompletion::completeQtMethod(CPlusPlus::FullySpecifiedType, - const QList &results, +bool CppCodeCompletion::completeQtMethod(const QList &results, const LookupContext &context, bool wantSignals) { @@ -941,7 +937,7 @@ bool CppCodeCompletion::completeQtMethod(CPlusPlus::FullySpecifiedType, o.setShowFunctionSignatures(true); QSet signatures; - foreach (TypeOfExpression::Result p, results) { + foreach (const TypeOfExpression::Result &p, results) { FullySpecifiedType ty = p.first; if (ReferenceType *refTy = ty->asReferenceType()) ty = refTy->elementType(); diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h index 3c1be57bd5d..4e257ed674e 100644 --- a/src/plugins/cpptools/cppcodecompletion.h +++ b/src/plugins/cpptools/cppcodecompletion.h @@ -90,8 +90,7 @@ private: QSet *definedMacros); void addCompletionItem(CPlusPlus::Symbol *symbol); - bool completeConstructorOrFunction(CPlusPlus::FullySpecifiedType exprTy, - const QList &); + bool completeConstructorOrFunction(const QList &); bool completeMember(const QList &, const CPlusPlus::LookupContext &context); @@ -108,20 +107,17 @@ private: bool completeConstructors(CPlusPlus::Class *klass); - bool completeQtMethod(CPlusPlus::FullySpecifiedType exprTy, - const QList &, + bool completeQtMethod(const QList &, const CPlusPlus::LookupContext &context, bool wantSignals); - bool completeSignal(CPlusPlus::FullySpecifiedType exprTy, - const QList &results, + bool completeSignal(const QList &results, const CPlusPlus::LookupContext &context) - { return completeQtMethod(exprTy, results, context, true); } + { return completeQtMethod(results, context, true); } - bool completeSlot(CPlusPlus::FullySpecifiedType exprTy, - const QList &results, + bool completeSlot(const QList &results, const CPlusPlus::LookupContext &context) - { return completeQtMethod(exprTy, results, context, false); } + { return completeQtMethod(results, context, false); } int findStartOfName(int pos = -1) const;