aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs
diff options
context:
space:
mode:
authorChristian Stenger <christian.stenger@qt.io>2020-04-20 12:57:38 +0200
committerChristian Stenger <christian.stenger@qt.io>2020-04-24 10:34:25 +0000
commit63db0f271fd2f9d9136e30e49693a525d60f8549 (patch)
tree5b91461093e91a38a123727710f6a8956c1eb991 /src/libs
parentd84bbdb876aff758603e149bfa284ee05e999a35 (diff)
QmlJS: Fix lexer handling of escape sequences
Escape sequences inside strings need to get handled explicitly to avoid wrong length and offsets of tokens to avoid follow-up problems while highlighting or symbol interaction. Fixes: QTCREATORBUG-23830 Change-Id: I4ab0b166bbab22ef3b7b54071e128416a14e97e1 Reviewed-by: Eike Ziller <eike.ziller@qt.io> Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/qmljs/parser/qmljslexer.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/libs/qmljs/parser/qmljslexer.cpp b/src/libs/qmljs/parser/qmljslexer.cpp
index ec8bf60a2a..ef3718da02 100644
--- a/src/libs/qmljs/parser/qmljslexer.cpp
+++ b/src/libs/qmljs/parser/qmljslexer.cpp
@@ -872,6 +872,7 @@ int Lexer::scanString(ScanStringMode mode)
{
QChar quote = (mode == TemplateContinuation) ? QChar(TemplateHead) : QChar(mode);
bool multilineStringLiteral = false;
+ bool escaped = false;
const QChar *startCode = _codePtr - 1;
// in case we just parsed a \r, we need to reset this flag to get things working
@@ -880,6 +881,12 @@ int Lexer::scanString(ScanStringMode mode)
if (_engine) {
while (_codePtr <= _endPtr) {
+ if (escaped) { // former char started an escape sequence
+ escaped = false;
+ _char = *_codePtr++;
+ ++_currentColumnNumber;
+ continue;
+ }
if (isLineTerminator()) {
if ((quote == QLatin1Char('`') || qmlMode()))
break;
@@ -887,7 +894,10 @@ int Lexer::scanString(ScanStringMode mode)
_errorMessage = QCoreApplication::translate("QmlParser", "Stray newline in string literal");
return T_ERROR;
} else if (_char == QLatin1Char('\\')) {
- break;
+ if (mode != DoubleQuote && mode != SingleQuote)
+ break;
+ else // otherwise we need to handle an escape sequence
+ escaped = true;
} else if (_char == '$' && quote == QLatin1Char('`')) {
break;
} else if (_char == quote) {