diff --git a/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp b/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp
index cae1e00fbb2..93a004a1ea4 100644
--- a/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp
+++ b/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp
@@ -182,7 +182,7 @@ void CompletionChunksToTextConverter::parseDependendOnTheOptionalState(
void CompletionChunksToTextConverter::parseResultType(const Utf8String &resultTypeText)
{
if (m_addResultType)
- m_text += resultTypeText.toString() + QChar(QChar::Space);
+ m_text += resultTypeText.toString().toHtmlEscaped() + QChar(QChar::Space);
}
void CompletionChunksToTextConverter::parseText(const Utf8String &text)
@@ -192,7 +192,7 @@ void CompletionChunksToTextConverter::parseText(const Utf8String &text)
m_text += QChar(QChar::Space);
}
- m_text += text.toString();
+ m_text += text.toString().toHtmlEscaped();
}
void CompletionChunksToTextConverter::wrapInCursiveTagIfOptional(
@@ -211,8 +211,10 @@ void CompletionChunksToTextConverter::wrapInCursiveTagIfOptional(
void CompletionChunksToTextConverter::parsePlaceHolder(
const ClangBackEnd::CodeCompletionChunk &codeCompletionChunk)
{
- if (m_addPlaceHolderText)
- appendText(codeCompletionChunk.text().toString(), emphasizeCurrentPlaceHolder());
+ if (m_addPlaceHolderText) {
+ appendText(codeCompletionChunk.text().toString().toHtmlEscaped(),
+ emphasizeCurrentPlaceHolder());
+ }
if (m_addPlaceHolderPositions)
m_placeholderPositions.push_back(m_text.size());
diff --git a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp
index 929608c2c39..7d40cc9596b 100644
--- a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp
+++ b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp
@@ -961,11 +961,11 @@ void ClangCodeCompletionTest::testCompleteFunctions()
QVERIFY(hasItem(t.proposal, "void f()"));
QVERIFY(hasItem(t.proposal, "void f(int a)"));
- QVERIFY(hasItem(t.proposal, "void f(const QString &s)"));
+ QVERIFY(hasItem(t.proposal, "void f(const QString &s)"));
QVERIFY(hasItem(t.proposal, "void f(char c, int optional)")); // TODO: No default argument?
QVERIFY(hasItem(t.proposal, "void f(char c, int optional1, int optional2)")); // TODO: No default argument?
- QVERIFY(hasItem(t.proposal, "void f(const TType *t)"));
- QVERIFY(hasItem(t.proposal, "TType f(bool)"));
+ QVERIFY(hasItem(t.proposal, "void f(const TType<QString> *t)"));
+ QVERIFY(hasItem(t.proposal, "TType<QString> f(bool)"));
}
void ClangCodeCompletionTest::testCompleteConstructorAndFallbackToGlobalCompletion()
diff --git a/tests/unit/unittest/completionchunkstotextconvertertest.cpp b/tests/unit/unittest/completionchunkstotextconvertertest.cpp
index 20008fe8477..42ec87768a0 100644
--- a/tests/unit/unittest/completionchunkstotextconvertertest.cpp
+++ b/tests/unit/unittest/completionchunkstotextconvertertest.cpp
@@ -50,6 +50,7 @@ protected:
protected:
Converter converter;
CodeCompletionChunk integerResultType{CodeCompletionChunk::ResultType, Utf8StringLiteral("int")};
+ CodeCompletionChunk templateResultType{CodeCompletionChunk::ResultType, Utf8StringLiteral("Foo")};
CodeCompletionChunk enumerationResultType{CodeCompletionChunk::ResultType, Utf8StringLiteral("Enumeration")};
CodeCompletionChunk functionName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Function")};
CodeCompletionChunk variableName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Variable")};
@@ -63,6 +64,7 @@ protected:
CodeCompletionChunk functionArgumentX{CodeCompletionChunk::Placeholder, Utf8StringLiteral("char x")};
CodeCompletionChunk functionArgumentY{CodeCompletionChunk::Placeholder, Utf8StringLiteral("int y")};
CodeCompletionChunk functionArgumentZ{CodeCompletionChunk::Placeholder, Utf8StringLiteral("int z")};
+ CodeCompletionChunk functionArgumentTemplate{CodeCompletionChunk::Placeholder, Utf8StringLiteral("const Foo &foo")};
CodeCompletionChunk switchName{CodeCompletionChunk::TypedText, Utf8StringLiteral("switch")};
CodeCompletionChunk condition{CodeCompletionChunk::Placeholder, Utf8StringLiteral("condition")};
CodeCompletionChunk leftBrace{CodeCompletionChunk::LeftBrace, Utf8StringLiteral("{")};
@@ -185,6 +187,34 @@ TEST_F(CompletionChunksToTextConverter, ConvertToFunctionSignatureWithTwoParamet
QStringLiteral("int Function(char x, int y)"));
}
+TEST_F(CompletionChunksToTextConverter, ConvertToFunctionSignatureWithTemplateReturnType)
+{
+ CodeCompletionChunks completionChunks({templateResultType,
+ functionName,
+ leftParen,
+ functionArgumentX,
+ rightParen});
+
+ using ClangCodeModel::Internal::CompletionChunksToTextConverter;
+
+ ASSERT_THAT(CompletionChunksToTextConverter::convertToFunctionSignature(completionChunks),
+ QStringLiteral("Foo<int> Function(char x)"));
+}
+
+TEST_F(CompletionChunksToTextConverter, ConvertToFunctionSignatureWithTemplateArgument)
+{
+ CodeCompletionChunks completionChunks({integerResultType,
+ functionName,
+ leftParen,
+ functionArgumentTemplate,
+ rightParen});
+
+ using ClangCodeModel::Internal::CompletionChunksToTextConverter;
+
+ ASSERT_THAT(CompletionChunksToTextConverter::convertToFunctionSignature(completionChunks),
+ QStringLiteral("int Function(const Foo<int> &foo)"));
+}
+
TEST_F(CompletionChunksToTextConverter, ConvertFunctionWithOptionalParameter)
{
CodeCompletionChunks completionChunks({integerResultType,
@@ -280,7 +310,7 @@ TEST_F(CompletionChunksToTextConverter, const_cast)
converter.parseChunks(completionChunks);
- ASSERT_THAT(converter.text(), QStringLiteral("const_cast<>()"));
+ ASSERT_THAT(converter.text(), QStringLiteral("const_cast<>()"));
}
TEST_F(CompletionChunksToTextConverter, Throw)
@@ -322,7 +352,7 @@ TEST_F(CompletionChunksToTextConverter, EnableIfT)
converter.parseChunks(completionChunks);
- ASSERT_THAT(converter.text(), QStringLiteral("enable_if_t<>"));
+ ASSERT_THAT(converter.text(), QStringLiteral("enable_if_t<>"));
}
void CompletionChunksToTextConverter::setupConverterForKeywords()