From c0e1b1581bee0851483cf232c4d526e891cc659b Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 9 Dec 2015 17:51:14 +0100 Subject: [PATCH] Clang: Fix displaying template parameters II ...in the function call completion tooltip. Task-number: QTCREATORBUG-15286 Change-Id: Ie24576f98ee4ba8f954de394f3596093323a2c35 Reviewed-by: Marco Bubke --- .../clangcompletionchunkstotextconverter.cpp | 10 +++--- .../test/clangcodecompletion_test.cpp | 6 ++-- .../completionchunkstotextconvertertest.cpp | 34 +++++++++++++++++-- 3 files changed, 41 insertions(+), 9 deletions(-) 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()