diff options
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); | 
