Chromium Code Reviews| Index: pkg/dart_scanner/lib/dart_scanner.dart |
| diff --git a/pkg/dart_scanner/lib/dart_scanner.dart b/pkg/dart_scanner/lib/dart_scanner.dart |
| index 7b48626de29a3878bf527ab57761ab6f9e80497a..aeeba020f17b5719a90f43264e34810327bc3bca 100644 |
| --- a/pkg/dart_scanner/lib/dart_scanner.dart |
| +++ b/pkg/dart_scanner/lib/dart_scanner.dart |
| @@ -10,6 +10,9 @@ import 'src/token.dart' show |
| import 'src/utf8_bytes_scanner.dart' show |
| Utf8BytesScanner; |
| +import 'src/recover.dart' show |
| + defaultRecoveryStrategy; |
| + |
| export 'src/token.dart' show |
| BeginGroupToken, |
| ErrorToken, |
| @@ -35,8 +38,14 @@ export 'src/string_scanner.dart' show |
| export 'src/keyword.dart' show |
| Keyword; |
| +typedef Token Recover(List<int> bytes, Token tokens, List<int> lineStarts); |
| + |
| abstract class Scanner { |
| + /// Returns true if an error occured during [tokenize]. |
| + bool get hasErrors; |
| + |
| List<int> get lineStarts; |
| + |
| Token tokenize(); |
| } |
| @@ -47,11 +56,17 @@ class ScannerResult { |
| ScannerResult(this.tokens, this.lineStarts); |
| } |
| -ScannerResult scan(List<int> bytes, {bool includeComments: false}) { |
| +ScannerResult scan(List<int> bytes, |
| + {bool includeComments: false, Recover recover}) { |
| if (bytes.last != 0) { |
| throw new ArgumentError("[bytes]: the last byte must be null."); |
| } |
| Scanner scanner = |
| new Utf8BytesScanner(bytes, includeComments: includeComments); |
| - return new ScannerResult(scanner.tokenize(), scanner.lineStarts); |
| + Token tokens = scanner.tokenize(); |
| + if (scanner.hasErrors && recover != null) { |
|
Johnni Winther
2017/01/25 10:33:59
Remove `recover != null` or `recover ??= ...`.
ahe
2017/01/25 10:36:20
Great catch!
|
| + recover ??= defaultRecoveryStrategy; |
| + tokens = recover(bytes, tokens, scanner.lineStarts); |
| + } |
| + return new ScannerResult(tokens, scanner.lineStarts); |
| } |