diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp index 363aac03c38..af964f5be95 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp @@ -568,7 +568,7 @@ void ClangCompletionAssistProcessor::completeIncludePath(const QString &realPath bool ClangCompletionAssistProcessor::completePreprocessorDirectives() { - foreach (const QString &preprocessorCompletion, m_preprocessorCompletions) + foreach (const QString &preprocessorCompletion, preprocessorCompletions()) addCompletionItem(preprocessorCompletion, Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::Macro)); diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 72c80a75e9f..6103fada825 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -654,25 +655,47 @@ public: { insert("publishDiagnostics", caps); } }; -class DoxygenAssistProcessor : public IAssistProcessor + +enum class CustomAssistMode { Doxygen, Preprocessor }; +class CustomAssistProcessor : public IAssistProcessor { public: - DoxygenAssistProcessor(ClangdClient *client, int position, unsigned completionOperator) + CustomAssistProcessor(ClangdClient *client, int position, unsigned completionOperator, + CustomAssistMode mode) : m_client(client) , m_position(position) , m_completionOperator(completionOperator) + , m_mode(mode) {} private: - IAssistProposal *perform(const AssistInterface *) override + IAssistProposal *perform(const AssistInterface *interface) override { QList completions; - for (int i = 1; i < CppEditor::T_DOXY_LAST_TAG; ++i) { - const auto item = new ClangPreprocessorAssistProposalItem; - item->setText(QLatin1String(CppEditor::doxygenTagSpell(i))); - item->setIcon(CPlusPlus::Icons::keywordIcon()); - item->setCompletionOperator(m_completionOperator); - completions.append(item); + switch (m_mode) { + case CustomAssistMode::Doxygen: + for (int i = 1; i < CppEditor::T_DOXY_LAST_TAG; ++i) { + completions << createItem(QLatin1String(CppEditor::doxygenTagSpell(i)), + CPlusPlus::Icons::keywordIcon()); + } + break; + case CustomAssistMode::Preprocessor: + static QIcon macroIcon = Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::Macro); + for (const QString &completion + : CppEditor::CppCompletionAssistProcessor::preprocessorCompletions()) + completions << createItem(completion, macroIcon); + const CppEditor::ProjectFile::Kind fileType + = CppEditor::ProjectFile::classify(interface->filePath().toString()); + switch (fileType) { + case CppEditor::ProjectFile::ObjCHeader: + case CppEditor::ProjectFile::ObjCXXHeader: + case CppEditor::ProjectFile::ObjCSource: + case CppEditor::ProjectFile::ObjCXXSource: + completions << createItem("import", macroIcon); + break; + default: + break; + } } GenericProposalModelPtr model(new GenericProposalModel); model->loadContent(completions); @@ -684,12 +707,21 @@ private: return proposal; } + AssistProposalItemInterface *createItem(const QString &text, const QIcon &icon) const + { + const auto item = new ClangPreprocessorAssistProposalItem; + item->setText(text); + item->setIcon(icon); + item->setCompletionOperator(m_completionOperator); + return item; + } + ClangdClient * const m_client; const int m_position; const unsigned m_completionOperator; + const CustomAssistMode m_mode; }; - static qint64 getRevision(const TextDocument *doc) { return doc->document()->revision(); @@ -2813,9 +2845,15 @@ IAssistProcessor *ClangdClient::ClangdCompletionAssistProvider::createProcessor( qCDebug(clangdLog) << "completion changed to function hint"; return new ClangdFunctionHintProcessor(m_client); case ClangCompletionContextAnalyzer::CompleteDoxygenKeyword: - return new DoxygenAssistProcessor(m_client, - contextAnalyzer.positionForProposal(), - contextAnalyzer.completionOperator()); + return new CustomAssistProcessor(m_client, + contextAnalyzer.positionForProposal(), + contextAnalyzer.completionOperator(), + CustomAssistMode::Doxygen); + case ClangCompletionContextAnalyzer::CompletePreprocessorDirective: + return new CustomAssistProcessor(m_client, + contextAnalyzer.positionForProposal(), + contextAnalyzer.completionOperator(), + CustomAssistMode::Preprocessor); default: break; } diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index 858128ad1a6..965af2dd4ce 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -1462,20 +1462,19 @@ void ClangdTestCompletion::testCompletePreprocessorKeywords() ProposalModelPtr proposal; getProposal("preprocessorKeywordsCompletion.cpp", proposal); QVERIFY(proposal); - QVERIFY(hasItem(proposal, " ifdef macro")); + QVERIFY(hasItem(proposal, "ifdef")); QVERIFY(!hasSnippet(proposal, "class ")); proposal.clear(); getProposal("preprocessorKeywordsCompletion2.cpp", proposal); QVERIFY(proposal); - QVERIFY(hasItem(proposal, " endif")); + QVERIFY(hasItem(proposal, "endif")); QVERIFY(!hasSnippet(proposal, "class ")); proposal.clear(); getProposal("preprocessorKeywordsCompletion3.cpp", proposal); QVERIFY(proposal); - QEXPECT_FAIL("", "TODO: Fix in clangd", Continue); - QVERIFY(hasItem(proposal, " endif")); + QVERIFY(hasItem(proposal, "endif")); QVERIFY(!hasSnippet(proposal, "class ")); } diff --git a/src/plugins/cppeditor/cppcompletionassist.cpp b/src/plugins/cppeditor/cppcompletionassist.cpp index 595a6c85d23..cd2c70b78c3 100644 --- a/src/plugins/cppeditor/cppcompletionassist.cpp +++ b/src/plugins/cppeditor/cppcompletionassist.cpp @@ -1302,7 +1302,7 @@ void InternalCppCompletionAssistProcessor::completeInclude(const QString &realPa void InternalCppCompletionAssistProcessor::completePreprocessor() { - foreach (const QString &preprocessorCompletion, m_preprocessorCompletions) + foreach (const QString &preprocessorCompletion, preprocessorCompletions()) addCompletionItem(preprocessorCompletion); if (objcKeywordsWanted()) diff --git a/src/plugins/cppeditor/cppcompletionassistprocessor.cpp b/src/plugins/cppeditor/cppcompletionassistprocessor.cpp index d6ff7acb117..a222ce49a08 100644 --- a/src/plugins/cppeditor/cppcompletionassistprocessor.cpp +++ b/src/plugins/cppeditor/cppcompletionassistprocessor.cpp @@ -41,20 +41,24 @@ using namespace CPlusPlus; namespace CppEditor { CppCompletionAssistProcessor::CppCompletionAssistProcessor(int snippetItemOrder) - : m_preprocessorCompletions( - QStringList({"define", "error", "include", "line", "pragma", "pragma once", - "pragma omp atomic", "pragma omp parallel", "pragma omp for", - "pragma omp ordered", "pragma omp parallel for", "pragma omp section", - "pragma omp sections", "pragma omp parallel sections", "pragma omp single", - "pragma omp master", "pragma omp critical", "pragma omp barrier", - "pragma omp flush", "pragma omp threadprivate", "undef", "if", "ifdef", - "ifndef", "elif", "else", "endif"})) - , m_snippetCollector(QLatin1String(CppEditor::Constants::CPP_SNIPPETS_GROUP_ID), + : m_snippetCollector(QLatin1String(CppEditor::Constants::CPP_SNIPPETS_GROUP_ID), QIcon(QLatin1String(":/texteditor/images/snippet.png")), snippetItemOrder) { } +const QStringList CppCompletionAssistProcessor::preprocessorCompletions() +{ + static QStringList list{"define", "error", "include", "line", "pragma", "pragma once", + "pragma omp atomic", "pragma omp parallel", "pragma omp for", + "pragma omp ordered", "pragma omp parallel for", "pragma omp section", + "pragma omp sections", "pragma omp parallel sections", "pragma omp single", + "pragma omp master", "pragma omp critical", "pragma omp barrier", + "pragma omp flush", "pragma omp threadprivate", "undef", "if", "ifdef", + "ifndef", "elif", "else", "endif"}; + return list; +} + void CppCompletionAssistProcessor::addSnippets() { m_completions.append(m_snippetCollector.collect()); diff --git a/src/plugins/cppeditor/cppcompletionassistprocessor.h b/src/plugins/cppeditor/cppcompletionassistprocessor.h index 5a94c6cdd90..87d8527e111 100644 --- a/src/plugins/cppeditor/cppcompletionassistprocessor.h +++ b/src/plugins/cppeditor/cppcompletionassistprocessor.h @@ -45,6 +45,8 @@ class CPPEDITOR_EXPORT CppCompletionAssistProcessor : public TextEditor::IAssist public: explicit CppCompletionAssistProcessor(int snippetItemOrder = 0); + static const QStringList preprocessorCompletions(); + protected: void addSnippets(); @@ -60,7 +62,6 @@ protected: int m_positionForProposal = -1; QList m_completions; - QStringList m_preprocessorCompletions; TextEditor::IAssistProposal *m_hintProposal = nullptr; private: