diff options
author | Colomban Wendling <ban@herbesfolles.org> | 2016-02-14 02:40:24 +0100 |
---|---|---|
committer | Colomban Wendling <ban@herbesfolles.org> | 2016-02-14 02:40:24 +0100 |
commit | af5bf0da6f1b78ae83a8bc0cbbb6b8bfe9dbcc57 (patch) | |
tree | 9bc851be4cedaafa3b60ab06957de26103097696 /lexers/LexRust.cxx | |
parent | 1e4b9fa23f3818b5d89ad6b4cbb8f24e888a10e7 (diff) | |
download | scintilla-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.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); |