OLD | NEW |
---|---|
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'package:front_end/src/base/errors.dart'; | 5 import 'package:front_end/src/base/errors.dart'; |
6 import 'package:front_end/src/fasta/scanner/error_token.dart'; | |
7 import 'package:front_end/src/fasta/scanner/token.dart'; | |
8 import 'package:front_end/src/fasta/scanner/token_constants.dart'; | |
6 | 9 |
7 /** | 10 /** |
8 * The error codes used for errors detected by the scanner. | 11 * The error codes used for errors detected by the scanner. |
9 */ | 12 */ |
10 class ScannerErrorCode extends ErrorCode { | 13 class ScannerErrorCode extends ErrorCode { |
11 /** | 14 /** |
12 * Parameters: | 15 * Parameters: |
13 * 0: the illegal character | 16 * 0: the illegal character |
14 */ | 17 */ |
15 static const ScannerErrorCode ILLEGAL_CHARACTER = | 18 static const ScannerErrorCode ILLEGAL_CHARACTER = |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
50 */ | 53 */ |
51 const ScannerErrorCode(String name, String message, [String correction]) | 54 const ScannerErrorCode(String name, String message, [String correction]) |
52 : super(name, message, correction); | 55 : super(name, message, correction); |
53 | 56 |
54 @override | 57 @override |
55 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR; | 58 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR; |
56 | 59 |
57 @override | 60 @override |
58 ErrorType get type => ErrorType.SYNTACTIC_ERROR; | 61 ErrorType get type => ErrorType.SYNTACTIC_ERROR; |
59 } | 62 } |
63 | |
64 /** | |
ahe
2017/03/23 11:52:36
Consistency: use either /// or /**
danrubel
2017/03/24 15:44:20
Good point. Changed /// to /** below to match the
| |
65 * Used to report a scan error at the given offset. | |
66 * The [errorCode] is the error code indicating the nature of the error. | |
67 * The [arguments] are any arguments needed to complete the error message | |
ahe
2017/03/23 11:52:36
Add a period to the end of this sentence.
danrubel
2017/03/24 15:44:20
Done.
| |
68 */ | |
69 typedef ReportError( | |
70 ScannerErrorCode errorCode, int offset, List<Object> arguments); | |
71 | |
72 /// Translates the given error [token] into an analyzer error and reports it | |
73 /// using [reportError]. | |
74 void translateErrorToken(ErrorToken token, ReportError reportError) { | |
75 int charOffset = token.charOffset; | |
76 // TODO(paulberry,ahe): why is endOffset sometimes null? | |
77 int endOffset = token.endOffset ?? charOffset; | |
78 void _makeError(ScannerErrorCode errorCode, List<Object> arguments) { | |
79 if (_isAtEnd(token, charOffset)) { | |
80 // Analyzer never generates an error message past the end of the input, | |
81 // since such an error would not be visible in an editor. | |
82 // TODO(paulberry,ahe): would it make sense to replicate this behavior | |
83 // in fasta, or move it elsewhere in analyzer? | |
84 charOffset--; | |
85 } | |
86 reportError(errorCode, charOffset, arguments); | |
87 } | |
88 | |
89 var errorCode = token.errorCode; | |
90 switch (errorCode) { | |
91 case ErrorKind.UnterminatedString: | |
92 // TODO(paulberry,ahe): Fasta reports the error location as the entire | |
93 // string; analyzer expects the end of the string. | |
94 charOffset = endOffset; | |
95 return _makeError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, null); | |
96 case ErrorKind.UnmatchedToken: | |
97 return null; | |
98 case ErrorKind.UnterminatedComment: | |
99 // TODO(paulberry,ahe): Fasta reports the error location as the entire | |
100 // comment; analyzer expects the end of the comment. | |
101 charOffset = endOffset; | |
102 return _makeError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, null); | |
103 case ErrorKind.MissingExponent: | |
104 // TODO(paulberry,ahe): Fasta reports the error location as the entire | |
105 // number; analyzer expects the end of the number. | |
106 charOffset = endOffset; | |
107 return _makeError(ScannerErrorCode.MISSING_DIGIT, null); | |
108 case ErrorKind.ExpectedHexDigit: | |
109 // TODO(paulberry,ahe): Fasta reports the error location as the entire | |
110 // number; analyzer expects the end of the number. | |
111 charOffset = endOffset; | |
112 return _makeError(ScannerErrorCode.MISSING_HEX_DIGIT, null); | |
113 case ErrorKind.NonAsciiIdentifier: | |
114 case ErrorKind.NonAsciiWhitespace: | |
115 return _makeError(ScannerErrorCode.ILLEGAL_CHARACTER, [token.character]); | |
116 case ErrorKind.UnexpectedDollarInString: | |
117 return null; | |
118 default: | |
119 throw new UnimplementedError('$errorCode'); | |
120 } | |
121 } | |
122 | |
123 /// Determines whether the given [charOffset], which came from the non-EOF token | |
124 /// [token], represents the end of the input. | |
125 bool _isAtEnd(Token token, int charOffset) { | |
126 while (true) { | |
127 // Skip to the next token. | |
128 token = token.next; | |
129 // If we've found an EOF token, its charOffset indicates where the end of | |
130 // the input is. | |
131 if (token.isEof) return token.charOffset == charOffset; | |
132 // If we've found a non-error token, then we know there is additional input | |
133 // text after [charOffset]. | |
134 if (token.info.kind != BAD_INPUT_TOKEN) return false; | |
135 // Otherwise keep looking. | |
136 } | |
137 } | |
OLD | NEW |