diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/clangcodemodel/clangcompletion.cpp | 6 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcompletion_test.cpp | 29 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcompletionassist.cpp | 5 |
3 files changed, 33 insertions, 7 deletions
diff --git a/src/plugins/clangcodemodel/clangcompletion.cpp b/src/plugins/clangcodemodel/clangcompletion.cpp index b7727de317..a9ad07a75a 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 f15950bc71..baa0f784d7 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<QByteArray>("code"); QTest::addColumn<QByteArray>("prefix"); + QTest::addColumn<QStringList>("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" + "<REPLACEMENT>\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>", 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 8811ae5132..b6fd792f73 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))) { |