@@ -193,8 +193,9 @@ String unescapeCodeUnits(List<int> codeUnits, bool isRaw, Object location,
193193 code = $LF ;
194194 } else if (! isRaw && code == $BACKSLASH ) {
195195 if (codeUnits.length == ++ i) {
196+ // This should only be reachable in error cases.
196197 listener.handleUnescapeError (
197- codes.messageInvalidUnicodeEscape , location, i, /* length = */ 1 );
198+ codes.messageInvalidEscapeStarted , location, i, /* length = */ 1 );
198199 return new String .fromCharCodes (codeUnits);
199200 }
200201 code = codeUnits[i];
@@ -240,47 +241,78 @@ String unescapeCodeUnits(List<int> codeUnits, bool isRaw, Object location,
240241 } else if (code == $u) {
241242 int begin = i;
242243 if (codeUnits.length == i + 1 ) {
243- listener.handleUnescapeError (codes.messageInvalidUnicodeEscape,
244- location, begin, codeUnits.length + 1 - begin);
244+ listener.handleUnescapeError (
245+ codes.messageInvalidUnicodeEscapeUStarted,
246+ location,
247+ begin,
248+ codeUnits.length + 1 - begin);
245249 return new String .fromCharCodes (codeUnits);
246250 }
247251 code = codeUnits[i + 1 ];
252+ bool foundEndBracket = false ;
248253 if (code == $OPEN_CURLY_BRACKET ) {
249254 // Expect 1-6 hex digits followed by '}'.
250255 if (codeUnits.length == ++ i) {
251- listener.handleUnescapeError (codes.messageInvalidUnicodeEscape,
252- location, begin, i + 1 - begin);
256+ listener.handleUnescapeError (
257+ codes.messageInvalidUnicodeEscapeUBracket,
258+ location,
259+ begin,
260+ i + 1 - begin);
253261 return new String .fromCharCodes (codeUnits);
254262 }
255263 code = 0 ;
256264 for (int j = 0 ; j < 7 ; j++ ) {
257265 if (codeUnits.length == ++ i) {
258- listener.handleUnescapeError (codes.messageInvalidUnicodeEscape,
259- location, begin, i + 1 - begin);
266+ listener.handleUnescapeError (
267+ codes.messageInvalidUnicodeEscapeUBracket,
268+ location,
269+ begin,
270+ i + 1 - begin);
260271 return new String .fromCharCodes (codeUnits);
261272 }
262273 int digit = codeUnits[i];
263- if (j != 0 && digit == $CLOSE_CURLY_BRACKET ) break ;
274+ if (j != 0 && digit == $CLOSE_CURLY_BRACKET ) {
275+ foundEndBracket = true ;
276+ break ;
277+ } else if (j == 6 ) {
278+ break ;
279+ }
264280 if (! isHexDigit (digit)) {
265- listener.handleUnescapeError (codes.messageInvalidUnicodeEscape,
266- location, begin, i + 2 - begin);
281+ listener.handleUnescapeError (
282+ codes.messageInvalidUnicodeEscapeUBracket,
283+ location,
284+ begin,
285+ i + 2 - begin);
267286 return new String .fromCharCodes (codeUnits);
268287 }
269288 code = (code << 4 ) + hexDigitValue (digit);
270289 }
290+ if (! foundEndBracket) {
291+ listener.handleUnescapeError (
292+ codes.messageInvalidUnicodeEscapeUBracket,
293+ location,
294+ begin,
295+ i + 1 - begin);
296+ }
271297 } else {
272298 // Expect exactly 4 hex digits.
273299 if (codeUnits.length <= i + 4 ) {
274- listener.handleUnescapeError (codes.messageInvalidUnicodeEscape,
275- location, begin, codeUnits.length + 1 - begin);
300+ listener.handleUnescapeError (
301+ codes.messageInvalidUnicodeEscapeUNoBracket,
302+ location,
303+ begin,
304+ codeUnits.length + 1 - begin);
276305 return new String .fromCharCodes (codeUnits);
277306 }
278307 code = 0 ;
279308 for (int j = 0 ; j < 4 ; j++ ) {
280309 int digit = codeUnits[++ i];
281310 if (! isHexDigit (digit)) {
282- listener.handleUnescapeError (codes.messageInvalidUnicodeEscape,
283- location, begin, i + 1 - begin);
311+ listener.handleUnescapeError (
312+ codes.messageInvalidUnicodeEscapeUNoBracket,
313+ location,
314+ begin,
315+ i + 1 - begin);
284316 return new String .fromCharCodes (codeUnits);
285317 }
286318 code = (code << 4 ) + hexDigitValue (digit);
0 commit comments