OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 licenset hat can be found in the LICENSE file. | 3 // BSD-style licenset hat can be found in the LICENSE file. |
4 | 4 |
5 library dart_scanner.error_token; | 5 library dart_scanner.error_token; |
6 | 6 |
7 import '../../scanner/token.dart' show BeginToken, TokenType, TokenWithComment; | 7 import '../../scanner/token.dart' show BeginToken, TokenType, TokenWithComment; |
8 | 8 |
9 import '../fasta_codes.dart' | 9 import '../fasta_codes.dart' |
10 show | 10 show |
11 FastaCode, | 11 Code, |
12 codeAsciiControlCharacter, | 12 codeAsciiControlCharacter, |
13 codeEncoding, | 13 codeEncoding, |
14 codeExpectedHexDigit, | 14 codeExpectedHexDigit, |
15 codeMissingExponent, | 15 codeMissingExponent, |
16 codeNonAsciiIdentifier, | 16 codeNonAsciiIdentifier, |
17 codeNonAsciiWhitespace, | 17 codeNonAsciiWhitespace, |
18 codeUnexpectedDollarInString, | 18 codeUnexpectedDollarInString, |
19 codeUnmatchedToken, | 19 codeUnmatchedToken, |
20 codeUnterminatedComment, | 20 codeUnterminatedComment, |
21 codeUnterminatedString, | 21 codeUnterminatedString, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 | 70 |
71 /// This is a token that wraps around an error message. Return 1 | 71 /// This is a token that wraps around an error message. Return 1 |
72 /// instead of the size of the length of the error message. | 72 /// instead of the size of the length of the error message. |
73 @override | 73 @override |
74 int get length => 1; | 74 int get length => 1; |
75 | 75 |
76 String get lexeme => throw assertionMessage; | 76 String get lexeme => throw assertionMessage; |
77 | 77 |
78 String get assertionMessage; | 78 String get assertionMessage; |
79 | 79 |
80 FastaCode get errorCode; | 80 Code get errorCode; |
81 | 81 |
82 int get character => null; | 82 int get character => null; |
83 | 83 |
84 String get start => null; | 84 String get start => null; |
85 | 85 |
86 int get endOffset => null; | 86 int get endOffset => null; |
87 | 87 |
88 BeginToken get begin => null; | 88 BeginToken get begin => null; |
89 | 89 |
90 @override | 90 @override |
91 Token copy() { | 91 Token copy() { |
92 throw 'unsupported operation'; | 92 throw 'unsupported operation'; |
93 } | 93 } |
94 } | 94 } |
95 | 95 |
96 /// Represents an encoding error. | 96 /// Represents an encoding error. |
97 class EncodingErrorToken extends ErrorToken { | 97 class EncodingErrorToken extends ErrorToken { |
98 EncodingErrorToken(int charOffset) : super(charOffset); | 98 EncodingErrorToken(int charOffset) : super(charOffset); |
99 | 99 |
100 String toString() => "EncodingErrorToken()"; | 100 String toString() => "EncodingErrorToken()"; |
101 | 101 |
102 String get assertionMessage => "Unable to decode bytes as UTF-8."; | 102 String get assertionMessage => "Unable to decode bytes as UTF-8."; |
103 | 103 |
104 FastaCode get errorCode => codeEncoding; | 104 Code get errorCode => codeEncoding; |
105 } | 105 } |
106 | 106 |
107 /// Represents a non-ASCII character outside a string or comment. | 107 /// Represents a non-ASCII character outside a string or comment. |
108 class NonAsciiIdentifierToken extends ErrorToken { | 108 class NonAsciiIdentifierToken extends ErrorToken { |
109 final int character; | 109 final int character; |
110 | 110 |
111 NonAsciiIdentifierToken(this.character, int charOffset) : super(charOffset); | 111 NonAsciiIdentifierToken(this.character, int charOffset) : super(charOffset); |
112 | 112 |
113 String toString() => "NonAsciiIdentifierToken($character)"; | 113 String toString() => "NonAsciiIdentifierToken($character)"; |
114 | 114 |
115 String get assertionMessage { | 115 String get assertionMessage { |
116 String c = new String.fromCharCodes([character]); | 116 String c = new String.fromCharCodes([character]); |
117 String hex = character.toRadixString(16); | 117 String hex = character.toRadixString(16); |
118 String padding = "0000".substring(hex.length); | 118 String padding = "0000".substring(hex.length); |
119 hex = "$padding$hex"; | 119 hex = "$padding$hex"; |
120 return "The non-ASCII character '$c' (U+$hex) can't be used in identifiers," | 120 return "The non-ASCII character '$c' (U+$hex) can't be used in identifiers," |
121 " only in strings and comments.\n" | 121 " only in strings and comments.\n" |
122 "Try using an US-ASCII letter, a digit, '_' (an underscore)," | 122 "Try using an US-ASCII letter, a digit, '_' (an underscore)," |
123 " or '\$' (a dollar sign)."; | 123 " or '\$' (a dollar sign)."; |
124 } | 124 } |
125 | 125 |
126 FastaCode get errorCode => codeNonAsciiIdentifier; | 126 Code get errorCode => codeNonAsciiIdentifier; |
127 } | 127 } |
128 | 128 |
129 /// Represents a non-ASCII whitespace outside a string or comment. | 129 /// Represents a non-ASCII whitespace outside a string or comment. |
130 class NonAsciiWhitespaceToken extends ErrorToken { | 130 class NonAsciiWhitespaceToken extends ErrorToken { |
131 final int character; | 131 final int character; |
132 | 132 |
133 NonAsciiWhitespaceToken(this.character, int charOffset) : super(charOffset); | 133 NonAsciiWhitespaceToken(this.character, int charOffset) : super(charOffset); |
134 | 134 |
135 String toString() => "NonAsciiWhitespaceToken($character)"; | 135 String toString() => "NonAsciiWhitespaceToken($character)"; |
136 | 136 |
137 String get assertionMessage { | 137 String get assertionMessage { |
138 String hex = character.toRadixString(16); | 138 String hex = character.toRadixString(16); |
139 return "The non-ASCII space character U+$hex can only be used in strings " | 139 return "The non-ASCII space character U+$hex can only be used in strings " |
140 "and comments."; | 140 "and comments."; |
141 } | 141 } |
142 | 142 |
143 FastaCode get errorCode => codeNonAsciiWhitespace; | 143 Code get errorCode => codeNonAsciiWhitespace; |
144 } | 144 } |
145 | 145 |
146 /// Represents an ASCII control character outside a string or comment. | 146 /// Represents an ASCII control character outside a string or comment. |
147 class AsciiControlCharacterToken extends ErrorToken { | 147 class AsciiControlCharacterToken extends ErrorToken { |
148 final int character; | 148 final int character; |
149 | 149 |
150 AsciiControlCharacterToken(this.character, int charOffset) | 150 AsciiControlCharacterToken(this.character, int charOffset) |
151 : super(charOffset); | 151 : super(charOffset); |
152 | 152 |
153 String toString() => "AsciiControlCharacterToken($character)"; | 153 String toString() => "AsciiControlCharacterToken($character)"; |
154 | 154 |
155 String get assertionMessage { | 155 String get assertionMessage { |
156 String hex = character.toRadixString(16); | 156 String hex = character.toRadixString(16); |
157 return "The control character U+$hex can only be used in strings and " | 157 return "The control character U+$hex can only be used in strings and " |
158 "comments."; | 158 "comments."; |
159 } | 159 } |
160 | 160 |
161 FastaCode get errorCode => codeAsciiControlCharacter; | 161 Code get errorCode => codeAsciiControlCharacter; |
162 } | 162 } |
163 | 163 |
164 /// Represents an unterminated string. | 164 /// Represents an unterminated string. |
165 class UnterminatedToken extends ErrorToken { | 165 class UnterminatedToken extends ErrorToken { |
166 final String start; | 166 final String start; |
167 final int endOffset; | 167 final int endOffset; |
168 | 168 |
169 UnterminatedToken(this.start, int charOffset, this.endOffset) | 169 UnterminatedToken(this.start, int charOffset, this.endOffset) |
170 : super(charOffset); | 170 : super(charOffset); |
171 | 171 |
172 String toString() => "UnterminatedToken($start)"; | 172 String toString() => "UnterminatedToken($start)"; |
173 | 173 |
174 String get assertionMessage => "'$start' isn't terminated."; | 174 String get assertionMessage => "'$start' isn't terminated."; |
175 | 175 |
176 int get charCount => endOffset - charOffset; | 176 int get charCount => endOffset - charOffset; |
177 | 177 |
178 FastaCode get errorCode { | 178 Code get errorCode { |
179 switch (start) { | 179 switch (start) { |
180 case '1e': | 180 case '1e': |
181 return codeMissingExponent; | 181 return codeMissingExponent; |
182 | 182 |
183 case '"': | 183 case '"': |
184 case "'": | 184 case "'": |
185 case '"""': | 185 case '"""': |
186 case "'''": | 186 case "'''": |
187 case 'r"': | 187 case 'r"': |
188 case "r'": | 188 case "r'": |
(...skipping 24 matching lines...) Expand all Loading... |
213 final BeginToken begin; | 213 final BeginToken begin; |
214 | 214 |
215 UnmatchedToken(BeginToken begin) | 215 UnmatchedToken(BeginToken begin) |
216 : this.begin = begin, | 216 : this.begin = begin, |
217 super(begin.charOffset); | 217 super(begin.charOffset); |
218 | 218 |
219 String toString() => "UnmatchedToken(${begin.lexeme})"; | 219 String toString() => "UnmatchedToken(${begin.lexeme})"; |
220 | 220 |
221 String get assertionMessage => "'$begin' isn't closed."; | 221 String get assertionMessage => "'$begin' isn't closed."; |
222 | 222 |
223 FastaCode get errorCode => codeUnmatchedToken; | 223 Code get errorCode => codeUnmatchedToken; |
224 } | 224 } |
OLD | NEW |