aboutsummaryrefslogtreecommitdiffhomepage
path: root/lexers/LexRust.cxx
diff options
context:
space:
mode:
authorColomban Wendling <ban@herbesfolles.org>2016-02-14 02:40:24 +0100
committerColomban Wendling <ban@herbesfolles.org>2016-02-14 02:40:24 +0100
commitaf5bf0da6f1b78ae83a8bc0cbbb6b8bfe9dbcc57 (patch)
tree9bc851be4cedaafa3b60ab06957de26103097696 /lexers/LexRust.cxx
parent1e4b9fa23f3818b5d89ad6b4cbb8f24e888a10e7 (diff)
downloadscintilla-mirror-af5bf0da6f1b78ae83a8bc0cbbb6b8bfe9dbcc57.tar.gz
Bug [#1809]. Rust: Handle new-style Unicode escape sequences
https://doc.rust-lang.org/reference.html#unicode-escapes
Diffstat (limited to 'lexers/LexRust.cxx')
-rw-r--r--lexers/LexRust.cxx26
1 files changed, 24 insertions, 2 deletions
diff --git a/lexers/LexRust.cxx b/lexers/LexRust.cxx
index ca5f3c7f1..0d40de2cf 100644
--- a/lexers/LexRust.cxx
+++ b/lexers/LexRust.cxx
@@ -407,7 +407,18 @@ static void ScanCharacterLiteralOrLifetime(Accessor &styler, Sci_Position& pos,
valid_char = ScanNumericEscape(styler, pos, 2, false);
} else if (n == 'u' && !ascii_only) {
pos += 2;
- valid_char = ScanNumericEscape(styler, pos, 4, false);
+ if (styler.SafeGetCharAt(pos, '\0') != '{') {
+ // old-style
+ valid_char = ScanNumericEscape(styler, pos, 4, false);
+ } else {
+ int n_digits = 0;
+ while (IsADigit(styler.SafeGetCharAt(++pos, '\0'), 16) && n_digits++ < 6) {
+ }
+ if (n_digits > 0 && styler.SafeGetCharAt(pos, '\0') == '}')
+ pos++;
+ else
+ valid_char = false;
+ }
} else if (n == 'U' && !ascii_only) {
pos += 2;
valid_char = ScanNumericEscape(styler, pos, 8, false);
@@ -579,7 +590,18 @@ static void ResumeString(Accessor &styler, Sci_Position& pos, Sci_Position max,
error = !ScanNumericEscape(styler, pos, 2, true);
} else if (n == 'u' && !ascii_only) {
pos += 2;
- error = !ScanNumericEscape(styler, pos, 4, true);
+ if (styler.SafeGetCharAt(pos, '\0') != '{') {
+ // old-style
+ error = !ScanNumericEscape(styler, pos, 4, true);
+ } else {
+ int n_digits = 0;
+ while (IsADigit(styler.SafeGetCharAt(++pos, '\0'), 16) && n_digits++ < 6) {
+ }
+ if (n_digits > 0 && styler.SafeGetCharAt(pos, '\0') == '}')
+ pos++;
+ else
+ error = true;
+ }
} else if (n == 'U' && !ascii_only) {
pos += 2;
error = !ScanNumericEscape(styler, pos, 8, true);