diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index b9dc55f0b99b9dfe9b6b05f1de6ecf62ce9c87cd..81cc4741b5e31a822406f2c0f383050bda807071 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<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,