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..f9e5374deacc6226d0fe173486627e4ec169007e 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 ??= defaultRecoveryStrategy; |
+ tokens = recover(bytes, tokens, scanner.lineStarts); |
+ } |
+ return new ScannerResult(tokens, scanner.lineStarts); |
} |