diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 9815b6f2c1622f9c4bec20ba1277ecef0d93a0bd..382ff50b2b565b47e0a57854a247656cbb9594d2 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<TypeOfExpression::Result>())) + if (completeConstructorOrFunction(results)) return m_startPosition; break; } @@ -563,32 +561,41 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) return -1; } -bool CppCodeCompletion::completeConstructorOrFunction(FullySpecifiedType exprTy, - const QList<TypeOfExpression::Result> &resolvedTypes) +bool CppCodeCompletion::completeConstructorOrFunction(const QList<TypeOfExpression::Result> &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<QString> 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; @@ -819,33 +826,45 @@ void CppCodeCompletion::addKeywords() void CppCodeCompletion::addMacros(const LookupContext &context) { - // macro completion items. - QSet<QByteArray> macroNames; QSet<QString> processed; - QList<QString> 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<QString> definedMacros; + + addMacros_helper(context, context.thisDocument()->fileName(), + &processed, &definedMacros); - foreach (const QByteArray ¯oName, macroNames) { + 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<QString> *processed, + QSet<QString> *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); @@ -902,8 +921,7 @@ void CppCodeCompletion::completeClass(const QList<Symbol *> &candidates, } } -bool CppCodeCompletion::completeQtMethod(CPlusPlus::FullySpecifiedType, - const QList<TypeOfExpression::Result> &results, +bool CppCodeCompletion::completeQtMethod(const QList<TypeOfExpression::Result> &results, const LookupContext &context, bool wantSignals) { @@ -919,7 +937,7 @@ bool CppCodeCompletion::completeQtMethod(CPlusPlus::FullySpecifiedType, o.setShowFunctionSignatures(true); QSet<QString> 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 79f580236f9f50cba34befdec1dc261e8b646d6f..4e257ed674e9f57e877e0e0ee32d81887d252c0b 100644 --- a/src/plugins/cpptools/cppcodecompletion.h +++ b/src/plugins/cpptools/cppcodecompletion.h @@ -84,10 +84,13 @@ public: private: void addKeywords(); void addMacros(const CPlusPlus::LookupContext &context); + void addMacros_helper(const CPlusPlus::LookupContext &context, + const QString &fileName, + QSet<QString> *processed, + QSet<QString> *definedMacros); void addCompletionItem(CPlusPlus::Symbol *symbol); - bool completeConstructorOrFunction(CPlusPlus::FullySpecifiedType exprTy, - const QList<CPlusPlus::TypeOfExpression::Result> &); + bool completeConstructorOrFunction(const QList<CPlusPlus::TypeOfExpression::Result> &); bool completeMember(const QList<CPlusPlus::TypeOfExpression::Result> &, const CPlusPlus::LookupContext &context); @@ -104,20 +107,17 @@ private: bool completeConstructors(CPlusPlus::Class *klass); - bool completeQtMethod(CPlusPlus::FullySpecifiedType exprTy, - const QList<CPlusPlus::TypeOfExpression::Result> &, + bool completeQtMethod(const QList<CPlusPlus::TypeOfExpression::Result> &, const CPlusPlus::LookupContext &context, bool wantSignals); - bool completeSignal(CPlusPlus::FullySpecifiedType exprTy, - const QList<CPlusPlus::TypeOfExpression::Result> &results, + bool completeSignal(const QList<CPlusPlus::TypeOfExpression::Result> &results, const CPlusPlus::LookupContext &context) - { return completeQtMethod(exprTy, results, context, true); } + { return completeQtMethod(results, context, true); } - bool completeSlot(CPlusPlus::FullySpecifiedType exprTy, - const QList<CPlusPlus::TypeOfExpression::Result> &results, + bool completeSlot(const QList<CPlusPlus::TypeOfExpression::Result> &results, const CPlusPlus::LookupContext &context) - { return completeQtMethod(exprTy, results, context, false); } + { return completeQtMethod(results, context, false); } int findStartOfName(int pos = -1) const; diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp index 4c01fb756ead5ee3cd1b782465080641e5d3e95b..a310fd69a1a1ac0b858b66e7886e234aea5fda03 100644 --- a/src/plugins/debugger/gdbengine.cpp +++ b/src/plugins/debugger/gdbengine.cpp @@ -1130,7 +1130,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 reloadSourceFiles(); tryLoadCustomDumpers(); diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp index fddfd525689a439a4b5a1e9d51cdf62be16ee7a5..d345e41ba9c65bce02b384947251d2067daa1fa9 100644 --- a/src/shared/cplusplus/CheckSpecifier.cpp +++ b/src/shared/cplusplus/CheckSpecifier.cpp @@ -388,8 +388,9 @@ bool CheckSpecifier::visit(TypeofSpecifierAST *ast) return false; } -bool CheckSpecifier::visit(AttributeSpecifierAST *) +bool CheckSpecifier::visit(AttributeSpecifierAST *ast) { + accept(ast->next); return false; }