summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/cpptools/cppcodecompletion.cpp50
-rw-r--r--src/plugins/cpptools/cppcodecompletion.h4
-rw-r--r--src/shared/cplusplus/CheckSpecifier.cpp3
3 files changed, 37 insertions, 20 deletions
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index dacce4a180..af81980578 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 &macro, doc->definedMacros()) {
- macroNames.insert(macro.name());
- }
- todo += doc->includedFiles();
- }
- }
+ QSet<QString> definedMacros;
- foreach (const QByteArray &macroName, macroNames) {
+ addMacros_helper(context, context.thisDocument()->fileName(),
+ &processed, &definedMacros);
+
+ foreach (const QString &macroName, 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 &macro, 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 79f580236f..3c1be57bd5 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 fddfd52568..d345e41ba9 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;
}