summaryrefslogtreecommitdiff
path: root/src/plugins/texteditor/snippets/snippet.cpp
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2021-04-20 14:25:18 +0200
committerDavid Schulz <david.schulz@qt.io>2021-04-28 07:37:24 +0000
commitc8f8513c8da858d214da5d241282289bd524f427 (patch)
tree15153582b37ea047ef8af1356decb2ac347d2011 /src/plugins/texteditor/snippets/snippet.cpp
parentd9862a767be219d37b3d5722da6291eb28b4d057 (diff)
downloadqt-creator-c8f8513c8da858d214da5d241282289bd524f427.tar.gz
Snippets: Split error messages out of the parsed snippet
Change-Id: Ic5d6664c86405c558e8bb133b854521e4eaef58a Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/texteditor/snippets/snippet.cpp')
-rw-r--r--src/plugins/texteditor/snippets/snippet.cpp77
1 files changed, 47 insertions, 30 deletions
diff --git a/src/plugins/texteditor/snippets/snippet.cpp b/src/plugins/texteditor/snippets/snippet.cpp
index 4d2c1a54ef..ea4671596c 100644
--- a/src/plugins/texteditor/snippets/snippet.cpp
+++ b/src/plugins/texteditor/snippets/snippet.cpp
@@ -70,6 +70,22 @@ public:
}
};
+QString SnippetParseError::htmlMessage() const
+{
+ QString message = errorMessage;
+ if (pos < 0 || pos > 50)
+ return message;
+ QString detail = text.left(50);
+ if (detail != text)
+ detail.append("...");
+ detail.replace(QChar::Space, "&nbsp;");
+ message.append("<br><code>" + detail + "<br>");
+ for (int i = 0; i < pos; ++i)
+ message.append("&nbsp;");
+ message.append("^</code>");
+ return message;
+}
+
// --------------------------------------------------------------------
// Snippet:
// --------------------------------------------------------------------
@@ -189,7 +205,12 @@ QString Snippet::generateTip() const
{'<', "&lt;"},
{'>', "&gt;"}};
- ParsedSnippet parsedSnippet = Snippet::parse(m_content);
+ SnippetParseResult result = Snippet::parse(m_content);
+
+ if (Utils::holds_alternative<SnippetParseError>(result))
+ return Utils::get<SnippetParseError>(result).htmlMessage();
+ QTC_ASSERT(Utils::holds_alternative<ParsedSnippet>(result), return {});
+ auto parsedSnippet = Utils::get<ParsedSnippet>(result);
QString tip("<nobr>");
int pos = 0;
@@ -215,7 +236,7 @@ QString Snippet::generateTip() const
return tip;
}
-ParsedSnippet Snippet::parse(const QString &snippet)
+SnippetParseResult Snippet::parse(const QString &snippet)
{
static UppercaseMangler ucMangler;
static LowercaseMangler lcMangler;
@@ -228,15 +249,10 @@ ParsedSnippet Snippet::parse(const QString &snippet)
= Utils::TemplateEngine::processText(Utils::globalMacroExpander(), snippet,
&errorMessage);
- result.success = errorMessage.isEmpty();
- if (!result.success) {
- result.text = snippet;
- result.errorMessage = errorMessage;
- return result;
- }
+ if (!errorMessage.isEmpty())
+ return {SnippetParseError{errorMessage, {}, -1}};
const int count = preprocessedSnippet.count();
- bool success = true;
int start = -1;
NameMangler *mangler = nullptr;
@@ -260,8 +276,9 @@ ParsedSnippet Snippet::parse(const QString &snippet)
}
if (mangler) {
- success = false;
- break;
+ return SnippetParseResult{SnippetParseError{tr("Expected delimiter after mangler id"),
+ preprocessedSnippet,
+ i}};
}
if (current == QLatin1Char(':') && start >= 0) {
@@ -272,8 +289,11 @@ ParsedSnippet Snippet::parse(const QString &snippet)
} else if (next == QLatin1Char('c')) {
mangler = &tcMangler;
} else {
- success = false;
- break;
+ return SnippetParseResult{
+ SnippetParseError{tr("Expected mangler id 'l'(lowercase), 'u'(uppercase), "
+ "or 'c'(titlecase) after colon"),
+ preprocessedSnippet,
+ i}};
}
++i;
continue;
@@ -288,17 +308,12 @@ ParsedSnippet Snippet::parse(const QString &snippet)
result.text.append(current);
}
- if (start >= 0)
- success = false;
-
- result.success = success;
-
- if (!success) {
- result.ranges.clear();
- result.text = preprocessedSnippet;
+ if (start >= 0) {
+ return SnippetParseResult{
+ SnippetParseError{tr("Missing closing variable delimiter"), result.text, start}};
}
- return result;
+ return SnippetParseResult(result);
}
#ifdef WITH_TESTS
@@ -418,17 +433,19 @@ void Internal::TextEditorPlugin::testSnippetParsing()
Q_ASSERT(ranges_start.count() == ranges_length.count()); // sanity check for the test data
Q_ASSERT(ranges_start.count() == ranges_mangler.count()); // sanity check for the test data
- ParsedSnippet result = Snippet::parse(input);
+ SnippetParseResult result = Snippet::parse(input);
+ QCOMPARE(Utils::holds_alternative<ParsedSnippet>(result), success);
+
+ ParsedSnippet snippet = Utils::get<ParsedSnippet>(result);
- QCOMPARE(result.text, text);
- QCOMPARE(result.success, success);
- QCOMPARE(result.ranges.count(), ranges_start.count());
+ QCOMPARE(snippet.text, text);
+ QCOMPARE(snippet.ranges.count(), ranges_start.count());
for (int i = 0; i < ranges_start.count(); ++i) {
- QCOMPARE(result.ranges.at(i).start, ranges_start.at(i));
- QCOMPARE(result.ranges.at(i).length, ranges_length.at(i));
+ QCOMPARE(snippet.ranges.at(i).start, ranges_start.at(i));
+ QCOMPARE(snippet.ranges.at(i).length, ranges_length.at(i));
Utils::Id id = NOMANGLER_ID;
- if (result.ranges.at(i).mangler)
- id = result.ranges.at(i).mangler->id();
+ if (snippet.ranges.at(i).mangler)
+ id = snippet.ranges.at(i).mangler->id();
QCOMPARE(id, ranges_mangler.at(i));
}
}