diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index dacce4a180abaf819e52b4ab96d672f769fca13f..af81980578e4e6db07ec39cecd2dc4ad2533f51b 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -829,33 +829,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; - 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<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); diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h index 79f580236f9f50cba34befdec1dc261e8b646d6f..3c1be57bd5d8bacf337a020cf4043602b068428d 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<QString> *processed, + QSet<QString> *definedMacros); void addCompletionItem(CPlusPlus::Symbol *symbol); bool completeConstructorOrFunction(CPlusPlus::FullySpecifiedType exprTy, 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; }