aboutsummaryrefslogtreecommitdiffhomepage
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
commit207f288dc07c5ed7fc93a45486519da48c068209 (patch)
tree18233d9e9fc450c829adab1de8a97e8b0ecd5846
parentf30bd7465e5fdbd996e42a22cf9a7a3001712629 (diff)
downloadscintilla-mirror-207f288dc07c5ed7fc93a45486519da48c068209.tar.gz
Bug [#1809]. Rust: Handle new-style Unicode escape sequences
https://doc.rust-lang.org/reference.html#unicode-escapes
-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);