diff options
-rw-r--r-- | lexers/LexRust.cxx | 26 |
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); |