aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/texteditor/snippets
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2020-09-17 08:34:02 +0200
committerDavid Schulz <david.schulz@qt.io>2020-09-21 10:36:47 +0000
commitc8a35714263baf01d33d5885993cd2a3b5150fe7 (patch)
tree6095142785e17b5de3b1fab25a6db22dd1159b97 /src/plugins/texteditor/snippets
parentc229c667cf4d67bc8a84b58eb6234f4bbfe5c9a6 (diff)
Snippet: show mangled replacements in snippets tooltip
Fixes: QTCREATORBUG-24317 Change-Id: Ibaeacc13f49a933836ccf9c906309219e3533564 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/texteditor/snippets')
-rw-r--r--src/plugins/texteditor/snippets/snippet.cpp78
1 files changed, 53 insertions, 25 deletions
diff --git a/src/plugins/texteditor/snippets/snippet.cpp b/src/plugins/texteditor/snippets/snippet.cpp
index 826e569433d..986655ba4ee 100644
--- a/src/plugins/texteditor/snippets/snippet.cpp
+++ b/src/plugins/texteditor/snippets/snippet.cpp
@@ -26,6 +26,7 @@
#include "snippet.h"
#include <utils/algorithm.h>
+#include <utils/qtcassert.h>
#include <utils/templateengine.h>
#include <QTextDocument>
@@ -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[] = "<b>";
+ static const char kCloseBold[] = "</b>";
+
+ 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("<br>");
- static const QLatin1String kNbsp("&nbsp;");
- static const QLatin1String kNoBr("<nobr>");
- static const QLatin1String kOpenBold("<b>");
- static const QLatin1String kCloseBold("</b>");
- 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<QChar, QString> replacements = {{'\n', "<br>"},
+ {' ', "&nbsp;"},
+ {'"', "&quot;"},
+ {'&', "&amp;"},
+ {'<', "&lt;"},
+ {'>', "&gt;"}};
+
+ ParsedSnippet parsedSnippet = Snippet::parse(m_content);
+
+ QString tip("<nobr>");
+ 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 &currentChar = 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;
}