Clang: Fix displaying template parameters II

...in the function call completion tooltip.

Task-number: QTCREATORBUG-15286
Change-Id: Ie24576f98ee4ba8f954de394f3596093323a2c35
Reviewed-by: Marco Bubke <marco.bubke@theqtcompany.com>
This commit is contained in:
Nikolai Kosjar
2015-12-09 17:51:14 +01:00
parent 4382274ba4
commit c0e1b1581b
3 changed files with 41 additions and 9 deletions

View File

@@ -182,7 +182,7 @@ void CompletionChunksToTextConverter::parseDependendOnTheOptionalState(
void CompletionChunksToTextConverter::parseResultType(const Utf8String &resultTypeText) void CompletionChunksToTextConverter::parseResultType(const Utf8String &resultTypeText)
{ {
if (m_addResultType) if (m_addResultType)
m_text += resultTypeText.toString() + QChar(QChar::Space); m_text += resultTypeText.toString().toHtmlEscaped() + QChar(QChar::Space);
} }
void CompletionChunksToTextConverter::parseText(const Utf8String &text) void CompletionChunksToTextConverter::parseText(const Utf8String &text)
@@ -192,7 +192,7 @@ void CompletionChunksToTextConverter::parseText(const Utf8String &text)
m_text += QChar(QChar::Space); m_text += QChar(QChar::Space);
} }
m_text += text.toString(); m_text += text.toString().toHtmlEscaped();
} }
void CompletionChunksToTextConverter::wrapInCursiveTagIfOptional( void CompletionChunksToTextConverter::wrapInCursiveTagIfOptional(
@@ -211,8 +211,10 @@ void CompletionChunksToTextConverter::wrapInCursiveTagIfOptional(
void CompletionChunksToTextConverter::parsePlaceHolder( void CompletionChunksToTextConverter::parsePlaceHolder(
const ClangBackEnd::CodeCompletionChunk &codeCompletionChunk) const ClangBackEnd::CodeCompletionChunk &codeCompletionChunk)
{ {
if (m_addPlaceHolderText) if (m_addPlaceHolderText) {
appendText(codeCompletionChunk.text().toString(), emphasizeCurrentPlaceHolder()); appendText(codeCompletionChunk.text().toString().toHtmlEscaped(),
emphasizeCurrentPlaceHolder());
}
if (m_addPlaceHolderPositions) if (m_addPlaceHolderPositions)
m_placeholderPositions.push_back(m_text.size()); m_placeholderPositions.push_back(m_text.size());

View File

@@ -961,11 +961,11 @@ void ClangCodeCompletionTest::testCompleteFunctions()
QVERIFY(hasItem(t.proposal, "void f()")); QVERIFY(hasItem(t.proposal, "void f()"));
QVERIFY(hasItem(t.proposal, "void f(int a)")); 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 &amp;s)"));
QVERIFY(hasItem(t.proposal, "void f(char c<i>, int optional</i>)")); // TODO: No default argument? QVERIFY(hasItem(t.proposal, "void f(char c<i>, int optional</i>)")); // TODO: No default argument?
QVERIFY(hasItem(t.proposal, "void f(char c<i>, int optional1, int optional2</i>)")); // TODO: No default argument? QVERIFY(hasItem(t.proposal, "void f(char c<i>, int optional1, int optional2</i>)")); // TODO: No default argument?
QVERIFY(hasItem(t.proposal, "void f(const TType<QString> *t)")); QVERIFY(hasItem(t.proposal, "void f(const TType&lt;QString&gt; *t)"));
QVERIFY(hasItem(t.proposal, "TType<QString> f(bool)")); QVERIFY(hasItem(t.proposal, "TType&lt;QString&gt; f(bool)"));
} }
void ClangCodeCompletionTest::testCompleteConstructorAndFallbackToGlobalCompletion() void ClangCodeCompletionTest::testCompleteConstructorAndFallbackToGlobalCompletion()

View File

@@ -50,6 +50,7 @@ protected:
protected: protected:
Converter converter; Converter converter;
CodeCompletionChunk integerResultType{CodeCompletionChunk::ResultType, Utf8StringLiteral("int")}; CodeCompletionChunk integerResultType{CodeCompletionChunk::ResultType, Utf8StringLiteral("int")};
CodeCompletionChunk templateResultType{CodeCompletionChunk::ResultType, Utf8StringLiteral("Foo<int>")};
CodeCompletionChunk enumerationResultType{CodeCompletionChunk::ResultType, Utf8StringLiteral("Enumeration")}; CodeCompletionChunk enumerationResultType{CodeCompletionChunk::ResultType, Utf8StringLiteral("Enumeration")};
CodeCompletionChunk functionName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Function")}; CodeCompletionChunk functionName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Function")};
CodeCompletionChunk variableName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Variable")}; CodeCompletionChunk variableName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Variable")};
@@ -63,6 +64,7 @@ protected:
CodeCompletionChunk functionArgumentX{CodeCompletionChunk::Placeholder, Utf8StringLiteral("char x")}; CodeCompletionChunk functionArgumentX{CodeCompletionChunk::Placeholder, Utf8StringLiteral("char x")};
CodeCompletionChunk functionArgumentY{CodeCompletionChunk::Placeholder, Utf8StringLiteral("int y")}; CodeCompletionChunk functionArgumentY{CodeCompletionChunk::Placeholder, Utf8StringLiteral("int y")};
CodeCompletionChunk functionArgumentZ{CodeCompletionChunk::Placeholder, Utf8StringLiteral("int z")}; CodeCompletionChunk functionArgumentZ{CodeCompletionChunk::Placeholder, Utf8StringLiteral("int z")};
CodeCompletionChunk functionArgumentTemplate{CodeCompletionChunk::Placeholder, Utf8StringLiteral("const Foo<int> &foo")};
CodeCompletionChunk switchName{CodeCompletionChunk::TypedText, Utf8StringLiteral("switch")}; CodeCompletionChunk switchName{CodeCompletionChunk::TypedText, Utf8StringLiteral("switch")};
CodeCompletionChunk condition{CodeCompletionChunk::Placeholder, Utf8StringLiteral("condition")}; CodeCompletionChunk condition{CodeCompletionChunk::Placeholder, Utf8StringLiteral("condition")};
CodeCompletionChunk leftBrace{CodeCompletionChunk::LeftBrace, Utf8StringLiteral("{")}; CodeCompletionChunk leftBrace{CodeCompletionChunk::LeftBrace, Utf8StringLiteral("{")};
@@ -185,6 +187,34 @@ TEST_F(CompletionChunksToTextConverter, ConvertToFunctionSignatureWithTwoParamet
QStringLiteral("int Function(char x<i>, <b>int y</b></i>)")); QStringLiteral("int Function(char x<i>, <b>int y</b></i>)"));
} }
TEST_F(CompletionChunksToTextConverter, ConvertToFunctionSignatureWithTemplateReturnType)
{
CodeCompletionChunks completionChunks({templateResultType,
functionName,
leftParen,
functionArgumentX,
rightParen});
using ClangCodeModel::Internal::CompletionChunksToTextConverter;
ASSERT_THAT(CompletionChunksToTextConverter::convertToFunctionSignature(completionChunks),
QStringLiteral("Foo&lt;int&gt; 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&lt;int&gt; &amp;foo)"));
}
TEST_F(CompletionChunksToTextConverter, ConvertFunctionWithOptionalParameter) TEST_F(CompletionChunksToTextConverter, ConvertFunctionWithOptionalParameter)
{ {
CodeCompletionChunks completionChunks({integerResultType, CodeCompletionChunks completionChunks({integerResultType,
@@ -280,7 +310,7 @@ TEST_F(CompletionChunksToTextConverter, const_cast)
converter.parseChunks(completionChunks); converter.parseChunks(completionChunks);
ASSERT_THAT(converter.text(), QStringLiteral("const_cast<>()")); ASSERT_THAT(converter.text(), QStringLiteral("const_cast&lt;&gt;()"));
} }
TEST_F(CompletionChunksToTextConverter, Throw) TEST_F(CompletionChunksToTextConverter, Throw)
@@ -322,7 +352,7 @@ TEST_F(CompletionChunksToTextConverter, EnableIfT)
converter.parseChunks(completionChunks); converter.parseChunks(completionChunks);
ASSERT_THAT(converter.text(), QStringLiteral("enable_if_t<>")); ASSERT_THAT(converter.text(), QStringLiteral("enable_if_t&lt;&gt;"));
} }
void CompletionChunksToTextConverter::setupConverterForKeywords() void CompletionChunksToTextConverter::setupConverterForKeywords()