diff --git a/src/plugins/clangcodemodel/clangcompletion.cpp b/src/plugins/clangcodemodel/clangcompletion.cpp index b7727de3175..a9ad07a75ae 100644 --- a/src/plugins/clangcodemodel/clangcompletion.cpp +++ b/src/plugins/clangcodemodel/clangcompletion.cpp @@ -680,6 +680,7 @@ int ClangCompletionAssistProcessor::startCompletionHelper() return startCompletionInternal(fileName, line, column, endOfOperator); } +// TODO: Extract duplicated logic from InternalCppCompletionAssistProcessor::startOfOperator int ClangCompletionAssistProcessor::startOfOperator(int pos, unsigned *kind, bool wantFunctionCall) const @@ -724,8 +725,9 @@ int ClangCompletionAssistProcessor::startOfOperator(int pos, start = pos; } // Don't complete in comments or strings, but still check for include completion - else if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT) || - (tk.isLiteral() && (*kind != T_STRING_LITERAL + else if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT) + || tk.is(T_CPP_DOXY_COMMENT) || tk.is(T_DOXY_COMMENT) + || (tk.isLiteral() && (*kind != T_STRING_LITERAL && *kind != T_ANGLE_STRING_LITERAL && *kind != T_SLASH))) { *kind = T_EOF_SYMBOL; diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index f15950bc71c..baa0f784d73 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -341,25 +341,48 @@ void CppToolsPlugin::test_global_completion_data() { QTest::addColumn("code"); QTest::addColumn("prefix"); + QTest::addColumn("requiredCompletionItems"); // Check that special completion after '&' for Qt5 signal/slots does not // interfere global completion after '&' QTest::newRow("global completion after & in return expression") << _("void f() { foo(myObject, @); }\n") - << _("&"); + << _("&") + << QStringList(); QTest::newRow("global completion after & in function argument") << _("int f() { return @; }\n") - << _("&"); + << _("&") + << QStringList(); + + // Check global completion after one line comments + const QByteArray codeTemplate = "int myGlobal;\n" + "\n" + "@\n"; + const QStringList replacements = QStringList() + << QLatin1String("// text") + << QLatin1String("// text.") + << QLatin1String("/// text") + << QLatin1String("/// text.") + ; + foreach (const QString &replacement, replacements) { + QByteArray code = codeTemplate; + code.replace("", replacement.toUtf8()); + const QByteArray tag = _("completion after comment: ") + replacement.toUtf8(); + QTest::newRow(tag) << code << QByteArray() << QStringList(QLatin1String("myGlobal")); + } } void CppToolsPlugin::test_global_completion() { QFETCH(QByteArray, code); QFETCH(QByteArray, prefix); + QFETCH(QStringList, requiredCompletionItems); CompletionTestCase test(code, prefix); QVERIFY(test.succeededSoFar()); - QVERIFY(isProbablyGlobalCompletion(test.getCompletions())); + const QStringList completions = test.getCompletions(); + QVERIFY(isProbablyGlobalCompletion(completions)); + QVERIFY(completions.toSet().contains(requiredCompletionItems.toSet())); } static void enumTestCase(const QByteArray &tag, const QByteArray &source, diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index 8811ae5132c..b6fd792f73d 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -974,8 +974,9 @@ int InternalCppCompletionAssistProcessor::startOfOperator(int pos, start = pos; } // Don't complete in comments or strings, but still check for include completion - else if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT) || - (tk.isLiteral() && (*kind != T_STRING_LITERAL + else if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT) + || tk.is(T_CPP_DOXY_COMMENT) || tk.is(T_DOXY_COMMENT) + || (tk.isLiteral() && (*kind != T_STRING_LITERAL && *kind != T_ANGLE_STRING_LITERAL && *kind != T_SLASH && *kind != T_DOT))) {