From c8a35714263baf01d33d5885993cd2a3b5150fe7 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 17 Sep 2020 08:34:02 +0200 Subject: Snippet: show mangled replacements in snippets tooltip Fixes: QTCREATORBUG-24317 Change-Id: Ibaeacc13f49a933836ccf9c906309219e3533564 Reviewed-by: Christian Stenger --- src/plugins/texteditor/snippets/snippet.cpp | 78 ++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 25 deletions(-) (limited to 'src/plugins/texteditor/snippets/snippet.cpp') diff --git a/src/plugins/texteditor/snippets/snippet.cpp b/src/plugins/texteditor/snippets/snippet.cpp index 826e569433..986655ba4e 100644 --- a/src/plugins/texteditor/snippets/snippet.cpp +++ b/src/plugins/texteditor/snippets/snippet.cpp @@ -26,6 +26,7 @@ #include "snippet.h" #include +#include #include #include @@ -153,37 +154,64 @@ bool Snippet::isModified() const return m_isModified; } +struct SnippetReplacement +{ + QString text; + int posDelta = 0; +}; + +static SnippetReplacement replacementAt(int pos, Snippet::ParsedSnippet &parsedSnippet) +{ + static const char kOpenBold[] = ""; + static const char kCloseBold[] = ""; + + auto mangledText = [](const QString &text, const Snippet::ParsedSnippet::Range &range) { + if (range.length == 0) + return QString("..."); + if (NameMangler *mangler = range.mangler) + return mangler->mangle(text.mid(range.start, range.length)); + return text.mid(range.start, range.length); + }; + + if (!parsedSnippet.ranges.isEmpty() && parsedSnippet.ranges.first().start == pos) { + Snippet::ParsedSnippet::Range range = parsedSnippet.ranges.takeFirst(); + return {kOpenBold + mangledText(parsedSnippet.text, range) + kCloseBold, range.length}; + } + return {}; +} + QString Snippet::generateTip() const { - static const QLatin1Char kNewLine('\n'); - static const QLatin1Char kSpace(' '); - static const QLatin1String kBr("
"); - static const QLatin1String kNbsp(" "); - static const QLatin1String kNoBr(""); - static const QLatin1String kOpenBold(""); - static const QLatin1String kCloseBold(""); - static const QLatin1String kEllipsis("..."); - - QString escapedContent(m_content.toHtmlEscaped()); - escapedContent.replace(kNewLine, kBr); - escapedContent.replace(kSpace, kNbsp); - - QString tip(kNoBr); - int count = 0; - for (int i = 0; i < escapedContent.count(); ++i) { - if (escapedContent.at(i) != kVariableDelimiter) { - tip += escapedContent.at(i); - continue; - } - if (++count % 2) { - tip += kOpenBold; + static const QHash replacements = {{'\n', "
"}, + {' ', " "}, + {'"', """}, + {'&', "&"}, + {'<', "<"}, + {'>', ">"}}; + + ParsedSnippet parsedSnippet = Snippet::parse(m_content); + + QString tip("
"); + int pos = 0; + for (int end = parsedSnippet.text.count(); pos < end;) { + const SnippetReplacement &replacement = replacementAt(pos, parsedSnippet); + if (!replacement.text.isEmpty()) { + tip += replacement.text; + pos += replacement.posDelta; } else { - if (escapedContent.at(i-1) == kVariableDelimiter) - tip += kEllipsis; - tip += kCloseBold; + const QChar ¤tChar = parsedSnippet.text.at(pos); + tip += replacements.value(currentChar, currentChar); + ++pos; } } + SnippetReplacement replacement = replacementAt(pos, parsedSnippet); + while (!replacement.text.isEmpty()) { + tip += replacement.text; + pos += replacement.posDelta; + replacement = replacementAt(pos, parsedSnippet); + } + QTC_CHECK(parsedSnippet.ranges.isEmpty()); return tip; } -- cgit v1.2.1