aboutsummaryrefslogtreecommitdiffhomepage
path: root/lexers/LexRust.cxx
diff options
context:
space:
mode:
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);