Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(154)

Side by Side Diff: pkg/analyzer_experimental/lib/src/generated/scanner.dart

Issue 16337007: Version 0.5.13.1 . (Closed) Base URL: http://dart.googlecode.com/svn/trunk/dart/
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // This code was auto-generated, is not intended to be edited, and is subject to 1 // This code was auto-generated, is not intended to be edited, and is subject to
2 // significant change. Please see the README file for more information. 2 // significant change. Please see the README file for more information.
3 3
4 library engine.scanner; 4 library engine.scanner;
5 5
6 import 'dart:collection'; 6 import 'dart:collection';
7 import 'java_core.dart'; 7 import 'java_core.dart';
8 import 'java_engine.dart'; 8 import 'java_engine.dart';
9 import 'source.dart'; 9 import 'source.dart';
10 import 'error.dart'; 10 import 'error.dart';
11 import 'instrumentation.dart'; 11 import 'instrumentation.dart';
12 12
13
13 /** 14 /**
14 * Instances of the abstract class {@code KeywordState} represent a state in a s tate machine used to 15 * Instances of the abstract class {@code KeywordState} represent a state in a s tate machine used to
15 * scan keywords. 16 * scan keywords.
16 * @coverage dart.engine.parser 17 * @coverage dart.engine.parser
17 */ 18 */
18 class KeywordState { 19 class KeywordState {
20
19 /** 21 /**
20 * An empty transition table used by leaf states. 22 * An empty transition table used by leaf states.
21 */ 23 */
22 static List<KeywordState> _EMPTY_TABLE = new List<KeywordState>(26); 24 static List<KeywordState> _EMPTY_TABLE = new List<KeywordState>(26);
25
23 /** 26 /**
24 * The initial state in the state machine. 27 * The initial state in the state machine.
25 */ 28 */
26 static KeywordState KEYWORD_STATE = createKeywordStateTable(); 29 static KeywordState KEYWORD_STATE = createKeywordStateTable();
30
27 /** 31 /**
28 * Create the next state in the state machine where we have already recognized the subset of 32 * Create the next state in the state machine where we have already recognized the subset of
29 * strings in the given array of strings starting at the given offset and havi ng the given length. 33 * strings in the given array of strings starting at the given offset and havi ng the given length.
30 * All of these strings have a common prefix and the next character is at the given start index. 34 * All of these strings have a common prefix and the next character is at the given start index.
31 * @param start the index of the character in the strings used to transition t o a new state 35 * @param start the index of the character in the strings used to transition t o a new state
32 * @param strings an array containing all of the strings that will be recogniz ed by the state 36 * @param strings an array containing all of the strings that will be recogniz ed by the state
33 * machine 37 * machine
34 * @param offset the offset of the first string in the array that has the pref ix that is assumed 38 * @param offset the offset of the first string in the array that has the pref ix that is assumed
35 * to have been recognized by the time we reach the state being built 39 * to have been recognized by the time we reach the state being built
36 * @param length the number of strings in the array that pass through the stat e being built 40 * @param length the number of strings in the array that pass through the stat e being built
(...skipping 26 matching lines...) Expand all
63 } else { 67 } else {
64 assert(length2 == 1); 68 assert(length2 == 1);
65 return new KeywordState(_EMPTY_TABLE, strings[offset]); 69 return new KeywordState(_EMPTY_TABLE, strings[offset]);
66 } 70 }
67 if (isLeaf) { 71 if (isLeaf) {
68 return new KeywordState(result, strings[offset]); 72 return new KeywordState(result, strings[offset]);
69 } else { 73 } else {
70 return new KeywordState(result, null); 74 return new KeywordState(result, null);
71 } 75 }
72 } 76 }
77
73 /** 78 /**
74 * Create the initial state in the state machine. 79 * Create the initial state in the state machine.
75 * @return the state that was created 80 * @return the state that was created
76 */ 81 */
77 static KeywordState createKeywordStateTable() { 82 static KeywordState createKeywordStateTable() {
78 List<Keyword> values2 = Keyword.values; 83 List<Keyword> values2 = Keyword.values;
79 List<String> strings = new List<String>(values2.length); 84 List<String> strings = new List<String>(values2.length);
80 for (int i = 0; i < values2.length; i++) { 85 for (int i = 0; i < values2.length; i++) {
81 strings[i] = values2[i].syntax; 86 strings[i] = values2[i].syntax;
82 } 87 }
83 strings.sort(); 88 strings.sort();
84 return computeKeywordStateTable(0, strings, 0, strings.length); 89 return computeKeywordStateTable(0, strings, 0, strings.length);
85 } 90 }
91
86 /** 92 /**
87 * A table mapping characters to the states to which those characters will tra nsition. (The index 93 * A table mapping characters to the states to which those characters will tra nsition. (The index
88 * into the array is the offset from the character {@code 'a'} to the transiti oning character.) 94 * into the array is the offset from the character {@code 'a'} to the transiti oning character.)
89 */ 95 */
90 List<KeywordState> _table; 96 List<KeywordState> _table;
97
91 /** 98 /**
92 * The keyword that is recognized by this state, or {@code null} if this state is not a terminal 99 * The keyword that is recognized by this state, or {@code null} if this state is not a terminal
93 * state. 100 * state.
94 */ 101 */
95 Keyword _keyword2; 102 Keyword _keyword2;
103
96 /** 104 /**
97 * Initialize a newly created state to have the given transitions and to recog nize the keyword 105 * Initialize a newly created state to have the given transitions and to recog nize the keyword
98 * with the given syntax. 106 * with the given syntax.
99 * @param table a table mapping characters to the states to which those charac ters will transition 107 * @param table a table mapping characters to the states to which those charac ters will transition
100 * @param syntax the syntax of the keyword that is recognized by the state 108 * @param syntax the syntax of the keyword that is recognized by the state
101 */ 109 */
102 KeywordState(List<KeywordState> table, String syntax) { 110 KeywordState(List<KeywordState> table, String syntax) {
103 this._table = table; 111 this._table = table;
104 this._keyword2 = (syntax == null) ? null : Keyword.keywords[syntax]; 112 this._keyword2 = (syntax == null) ? null : Keyword.keywords[syntax];
105 } 113 }
114
106 /** 115 /**
107 * Return the keyword that was recognized by this state, or {@code null} if th is state does not 116 * Return the keyword that was recognized by this state, or {@code null} if th is state does not
108 * recognized a keyword. 117 * recognized a keyword.
109 * @return the keyword that was matched by reaching this state 118 * @return the keyword that was matched by reaching this state
110 */ 119 */
111 Keyword keyword() => _keyword2; 120 Keyword keyword() => _keyword2;
121
112 /** 122 /**
113 * Return the state that follows this state on a transition of the given chara cter, or{@code null} if there is no valid state reachable from this state with s uch a transition. 123 * Return the state that follows this state on a transition of the given chara cter, or{@code null} if there is no valid state reachable from this state with s uch a transition.
114 * @param c the character used to transition from this state to another state 124 * @param c the character used to transition from this state to another state
115 * @return the state that follows this state on a transition of the given char acter 125 * @return the state that follows this state on a transition of the given char acter
116 */ 126 */
117 KeywordState next(int c) => _table[c - 0x61]; 127 KeywordState next(int c) => _table[c - 0x61];
118 } 128 }
129
119 /** 130 /**
120 * The enumeration {@code ScannerErrorCode} defines the error codes used for err ors detected by the 131 * The enumeration {@code ScannerErrorCode} defines the error codes used for err ors detected by the
121 * scanner. 132 * scanner.
122 * @coverage dart.engine.parser 133 * @coverage dart.engine.parser
123 */ 134 */
124 class ScannerErrorCode implements Comparable<ScannerErrorCode>, ErrorCode { 135 class ScannerErrorCode implements Comparable<ScannerErrorCode>, ErrorCode {
125 static final ScannerErrorCode ILLEGAL_CHARACTER = new ScannerErrorCode('ILLEGA L_CHARACTER', 0, "Illegal character %x"); 136 static final ScannerErrorCode ILLEGAL_CHARACTER = new ScannerErrorCode('ILLEGA L_CHARACTER', 0, "Illegal character %x");
126 static final ScannerErrorCode MISSING_DIGIT = new ScannerErrorCode('MISSING_DI GIT', 1, "Decimal digit expected"); 137 static final ScannerErrorCode MISSING_DIGIT = new ScannerErrorCode('MISSING_DI GIT', 1, "Decimal digit expected");
127 static final ScannerErrorCode MISSING_HEX_DIGIT = new ScannerErrorCode('MISSIN G_HEX_DIGIT', 2, "Hexidecimal digit expected"); 138 static final ScannerErrorCode MISSING_HEX_DIGIT = new ScannerErrorCode('MISSIN G_HEX_DIGIT', 2, "Hexidecimal digit expected");
128 static final ScannerErrorCode MISSING_QUOTE = new ScannerErrorCode('MISSING_QU OTE', 3, "Expected quote (' or \")"); 139 static final ScannerErrorCode MISSING_QUOTE = new ScannerErrorCode('MISSING_QU OTE', 3, "Expected quote (' or \")");
129 static final ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = new ScannerErr orCode('UNTERMINATED_MULTI_LINE_COMMENT', 4, "Unterminated multi-line comment"); 140 static final ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = new ScannerErr orCode('UNTERMINATED_MULTI_LINE_COMMENT', 4, "Unterminated multi-line comment");
130 static final ScannerErrorCode UNTERMINATED_STRING_LITERAL = new ScannerErrorCo de('UNTERMINATED_STRING_LITERAL', 5, "Unterminated string literal"); 141 static final ScannerErrorCode UNTERMINATED_STRING_LITERAL = new ScannerErrorCo de('UNTERMINATED_STRING_LITERAL', 5, "Unterminated string literal");
131 static final List<ScannerErrorCode> values = [ILLEGAL_CHARACTER, MISSING_DIGIT , MISSING_HEX_DIGIT, MISSING_QUOTE, UNTERMINATED_MULTI_LINE_COMMENT, UNTERMINATE D_STRING_LITERAL]; 142 static final List<ScannerErrorCode> values = [ILLEGAL_CHARACTER, MISSING_DIGIT , MISSING_HEX_DIGIT, MISSING_QUOTE, UNTERMINATED_MULTI_LINE_COMMENT, UNTERMINATE D_STRING_LITERAL];
132 final String __name; 143
133 final int __ordinal; 144 /// The name of this enum constant, as declared in the enum declaration.
134 int get ordinal => __ordinal; 145 final String name;
146
147 /// The position in the enum declaration.
148 final int ordinal;
149
135 /** 150 /**
136 * The message template used to create the message to be displayed for this er ror. 151 * The message template used to create the message to be displayed for this er ror.
137 */ 152 */
138 String _message; 153 String _message;
154
139 /** 155 /**
140 * Initialize a newly created error code to have the given message. 156 * Initialize a newly created error code to have the given message.
141 * @param message the message template used to create the message to be displa yed for this error 157 * @param message the message template used to create the message to be displa yed for this error
142 */ 158 */
143 ScannerErrorCode(this.__name, this.__ordinal, String message) { 159 ScannerErrorCode(this.name, this.ordinal, String message) {
144 this._message = message; 160 this._message = message;
145 } 161 }
146 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR; 162 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
147 String get message => _message; 163 String get message => _message;
148 ErrorType get type => ErrorType.SYNTACTIC_ERROR; 164 ErrorType get type => ErrorType.SYNTACTIC_ERROR;
149 bool needsRecompilation() => true; 165 int compareTo(ScannerErrorCode other) => ordinal - other.ordinal;
150 int compareTo(ScannerErrorCode other) => __ordinal - other.__ordinal; 166 String toString() => name;
151 String toString() => __name;
152 } 167 }
168
153 /** 169 /**
154 * Instances of the class {@code TokenWithComment} represent a string token that is preceded by 170 * Instances of the class {@code TokenWithComment} represent a string token that is preceded by
155 * comments. 171 * comments.
156 * @coverage dart.engine.parser 172 * @coverage dart.engine.parser
157 */ 173 */
158 class StringTokenWithComment extends StringToken { 174 class StringTokenWithComment extends StringToken {
175
159 /** 176 /**
160 * The first comment in the list of comments that precede this token. 177 * The first comment in the list of comments that precede this token.
161 */ 178 */
162 Token _precedingComment; 179 Token _precedingComment;
180
163 /** 181 /**
164 * Initialize a newly created token to have the given type and offset and to b e preceded by the 182 * Initialize a newly created token to have the given type and offset and to b e preceded by the
165 * comments reachable from the given comment. 183 * comments reachable from the given comment.
166 * @param type the type of the token 184 * @param type the type of the token
167 * @param offset the offset from the beginning of the file to the first charac ter in the token 185 * @param offset the offset from the beginning of the file to the first charac ter in the token
168 * @param precedingComment the first comment in the list of comments that prec ede this token 186 * @param precedingComment the first comment in the list of comments that prec ede this token
169 */ 187 */
170 StringTokenWithComment(TokenType type, String value, int offset, Token precedi ngComment) : super(type, value, offset) { 188 StringTokenWithComment(TokenType type, String value, int offset, Token precedi ngComment) : super(type, value, offset) {
171 this._precedingComment = precedingComment; 189 this._precedingComment = precedingComment;
172 } 190 }
173 Token get precedingComments => _precedingComment; 191 Token get precedingComments => _precedingComment;
174 } 192 }
193
175 /** 194 /**
176 * The enumeration {@code Keyword} defines the keywords in the Dart programming language. 195 * The enumeration {@code Keyword} defines the keywords in the Dart programming language.
177 * @coverage dart.engine.parser 196 * @coverage dart.engine.parser
178 */ 197 */
179 class Keyword implements Comparable<Keyword> { 198 class Keyword implements Comparable<Keyword> {
180 static final Keyword ASSERT = new Keyword.con1('ASSERT', 0, "assert"); 199 static final Keyword ASSERT = new Keyword.con1('ASSERT', 0, "assert");
181 static final Keyword BREAK = new Keyword.con1('BREAK', 1, "break"); 200 static final Keyword BREAK = new Keyword.con1('BREAK', 1, "break");
182 static final Keyword CASE = new Keyword.con1('CASE', 2, "case"); 201 static final Keyword CASE = new Keyword.con1('CASE', 2, "case");
183 static final Keyword CATCH = new Keyword.con1('CATCH', 3, "catch"); 202 static final Keyword CATCH = new Keyword.con1('CATCH', 3, "catch");
184 static final Keyword CLASS = new Keyword.con1('CLASS', 4, "class"); 203 static final Keyword CLASS = new Keyword.con1('CLASS', 4, "class");
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 static final Keyword GET = new Keyword.con2('GET', 39, "get", true); 238 static final Keyword GET = new Keyword.con2('GET', 39, "get", true);
220 static final Keyword IMPLEMENTS = new Keyword.con2('IMPLEMENTS', 40, "implemen ts", true); 239 static final Keyword IMPLEMENTS = new Keyword.con2('IMPLEMENTS', 40, "implemen ts", true);
221 static final Keyword IMPORT = new Keyword.con2('IMPORT', 41, "import", true); 240 static final Keyword IMPORT = new Keyword.con2('IMPORT', 41, "import", true);
222 static final Keyword LIBRARY = new Keyword.con2('LIBRARY', 42, "library", true ); 241 static final Keyword LIBRARY = new Keyword.con2('LIBRARY', 42, "library", true );
223 static final Keyword OPERATOR = new Keyword.con2('OPERATOR', 43, "operator", t rue); 242 static final Keyword OPERATOR = new Keyword.con2('OPERATOR', 43, "operator", t rue);
224 static final Keyword PART = new Keyword.con2('PART', 44, "part", true); 243 static final Keyword PART = new Keyword.con2('PART', 44, "part", true);
225 static final Keyword SET = new Keyword.con2('SET', 45, "set", true); 244 static final Keyword SET = new Keyword.con2('SET', 45, "set", true);
226 static final Keyword STATIC = new Keyword.con2('STATIC', 46, "static", true); 245 static final Keyword STATIC = new Keyword.con2('STATIC', 46, "static", true);
227 static final Keyword TYPEDEF = new Keyword.con2('TYPEDEF', 47, "typedef", true ); 246 static final Keyword TYPEDEF = new Keyword.con2('TYPEDEF', 47, "typedef", true );
228 static final List<Keyword> values = [ASSERT, BREAK, CASE, CATCH, CLASS, CONST, CONTINUE, DEFAULT, DO, ELSE, ENUM, EXTENDS, FALSE, FINAL, FINALLY, FOR, IF, IN, IS, NEW, NULL, RETHROW, RETURN, SUPER, SWITCH, THIS, THROW, TRUE, TRY, VAR, VOI D, WHILE, WITH, ABSTRACT, AS, DYNAMIC, EXPORT, EXTERNAL, FACTORY, GET, IMPLEMENT S, IMPORT, LIBRARY, OPERATOR, PART, SET, STATIC, TYPEDEF]; 247 static final List<Keyword> values = [ASSERT, BREAK, CASE, CATCH, CLASS, CONST, CONTINUE, DEFAULT, DO, ELSE, ENUM, EXTENDS, FALSE, FINAL, FINALLY, FOR, IF, IN, IS, NEW, NULL, RETHROW, RETURN, SUPER, SWITCH, THIS, THROW, TRUE, TRY, VAR, VOI D, WHILE, WITH, ABSTRACT, AS, DYNAMIC, EXPORT, EXTERNAL, FACTORY, GET, IMPLEMENT S, IMPORT, LIBRARY, OPERATOR, PART, SET, STATIC, TYPEDEF];
229 String __name; 248
230 int __ordinal = 0; 249 /// The name of this enum constant, as declared in the enum declaration.
231 int get ordinal => __ordinal; 250 final String name;
251
252 /// The position in the enum declaration.
253 final int ordinal;
254
232 /** 255 /**
233 * The lexeme for the keyword. 256 * The lexeme for the keyword.
234 */ 257 */
235 String _syntax; 258 String _syntax;
259
236 /** 260 /**
237 * A flag indicating whether the keyword is a pseudo-keyword. Pseudo keywords can be used as 261 * A flag indicating whether the keyword is a pseudo-keyword. Pseudo keywords can be used as
238 * identifiers. 262 * identifiers.
239 */ 263 */
240 bool _isPseudoKeyword2 = false; 264 bool _isPseudoKeyword2 = false;
265
241 /** 266 /**
242 * A table mapping the lexemes of keywords to the corresponding keyword. 267 * A table mapping the lexemes of keywords to the corresponding keyword.
243 */ 268 */
244 static Map<String, Keyword> keywords = createKeywordMap(); 269 static Map<String, Keyword> keywords = createKeywordMap();
270
245 /** 271 /**
246 * Create a table mapping the lexemes of keywords to the corresponding keyword . 272 * Create a table mapping the lexemes of keywords to the corresponding keyword .
247 * @return the table that was created 273 * @return the table that was created
248 */ 274 */
249 static Map<String, Keyword> createKeywordMap() { 275 static Map<String, Keyword> createKeywordMap() {
250 LinkedHashMap<String, Keyword> result = new LinkedHashMap<String, Keyword>() ; 276 LinkedHashMap<String, Keyword> result = new LinkedHashMap<String, Keyword>() ;
251 for (Keyword keyword in values) { 277 for (Keyword keyword in values) {
252 result[keyword._syntax] = keyword; 278 result[keyword._syntax] = keyword;
253 } 279 }
254 return result; 280 return result;
255 } 281 }
282
256 /** 283 /**
257 * Initialize a newly created keyword to have the given syntax. The keyword is not a 284 * Initialize a newly created keyword to have the given syntax. The keyword is not a
258 * pseudo-keyword. 285 * pseudo-keyword.
259 * @param syntax the lexeme for the keyword 286 * @param syntax the lexeme for the keyword
260 */ 287 */
261 Keyword.con1(String ___name, int ___ordinal, String syntax) { 288 Keyword.con1(this.name, this.ordinal, String syntax) {
262 _jtd_constructor_309_impl(___name, ___ordinal, syntax); 289 _jtd_constructor_316_impl(syntax);
263 } 290 }
264 _jtd_constructor_309_impl(String ___name, int ___ordinal, String syntax) { 291 _jtd_constructor_316_impl(String syntax) {
265 _jtd_constructor_310_impl(___name, ___ordinal, syntax, false); 292 _jtd_constructor_317_impl(syntax, false);
266 } 293 }
294
267 /** 295 /**
268 * Initialize a newly created keyword to have the given syntax. The keyword is a pseudo-keyword if 296 * Initialize a newly created keyword to have the given syntax. The keyword is a pseudo-keyword if
269 * the given flag is {@code true}. 297 * the given flag is {@code true}.
270 * @param syntax the lexeme for the keyword 298 * @param syntax the lexeme for the keyword
271 * @param isPseudoKeyword {@code true} if this keyword is a pseudo-keyword 299 * @param isPseudoKeyword {@code true} if this keyword is a pseudo-keyword
272 */ 300 */
273 Keyword.con2(String ___name, int ___ordinal, String syntax2, bool isPseudoKeyw ord) { 301 Keyword.con2(this.name, this.ordinal, String syntax2, bool isPseudoKeyword) {
274 _jtd_constructor_310_impl(___name, ___ordinal, syntax2, isPseudoKeyword); 302 _jtd_constructor_317_impl(syntax2, isPseudoKeyword);
275 } 303 }
276 _jtd_constructor_310_impl(String ___name, int ___ordinal, String syntax2, bool isPseudoKeyword) { 304 _jtd_constructor_317_impl(String syntax2, bool isPseudoKeyword) {
277 __name = ___name;
278 __ordinal = ___ordinal;
279 this._syntax = syntax2; 305 this._syntax = syntax2;
280 this._isPseudoKeyword2 = isPseudoKeyword; 306 this._isPseudoKeyword2 = isPseudoKeyword;
281 } 307 }
308
282 /** 309 /**
283 * Return the lexeme for the keyword. 310 * Return the lexeme for the keyword.
284 * @return the lexeme for the keyword 311 * @return the lexeme for the keyword
285 */ 312 */
286 String get syntax => _syntax; 313 String get syntax => _syntax;
314
287 /** 315 /**
288 * Return {@code true} if this keyword is a pseudo-keyword. Pseudo keywords ca n be used as 316 * Return {@code true} if this keyword is a pseudo-keyword. Pseudo keywords ca n be used as
289 * identifiers. 317 * identifiers.
290 * @return {@code true} if this keyword is a pseudo-keyword 318 * @return {@code true} if this keyword is a pseudo-keyword
291 */ 319 */
292 bool isPseudoKeyword() => _isPseudoKeyword2; 320 bool isPseudoKeyword() => _isPseudoKeyword2;
293 int compareTo(Keyword other) => __ordinal - other.__ordinal; 321 int compareTo(Keyword other) => ordinal - other.ordinal;
294 String toString() => __name; 322 String toString() => name;
295 } 323 }
324
296 /** 325 /**
297 * The abstract class {@code AbstractScanner} implements a scanner for Dart code . Subclasses are 326 * The abstract class {@code AbstractScanner} implements a scanner for Dart code . Subclasses are
298 * required to implement the interface used to access the characters being scann ed. 327 * required to implement the interface used to access the characters being scann ed.
299 * <p> 328 * <p>
300 * The lexical structure of Dart is ambiguous without knowledge of the context i n which a token is 329 * The lexical structure of Dart is ambiguous without knowledge of the context i n which a token is
301 * being scanned. For example, without context we cannot determine whether sourc e of the form "<<" 330 * being scanned. For example, without context we cannot determine whether sourc e of the form "<<"
302 * should be scanned as a single left-shift operator or as two left angle bracke ts. This scanner 331 * should be scanned as a single left-shift operator or as two left angle bracke ts. This scanner
303 * does not have any context, so it always resolves such conflicts by scanning t he longest possible 332 * does not have any context, so it always resolves such conflicts by scanning t he longest possible
304 * token. 333 * token.
305 * @coverage dart.engine.parser 334 * @coverage dart.engine.parser
306 */ 335 */
307 abstract class AbstractScanner { 336 abstract class AbstractScanner {
337
308 /** 338 /**
309 * The source being scanned. 339 * The source being scanned.
310 */ 340 */
311 Source _source; 341 Source _source;
342
312 /** 343 /**
313 * The error listener that will be informed of any errors that are found durin g the scan. 344 * The error listener that will be informed of any errors that are found durin g the scan.
314 */ 345 */
315 AnalysisErrorListener _errorListener; 346 AnalysisErrorListener _errorListener;
347
316 /** 348 /**
317 * The token pointing to the head of the linked list of tokens. 349 * The token pointing to the head of the linked list of tokens.
318 */ 350 */
319 Token _tokens; 351 Token _tokens;
352
320 /** 353 /**
321 * The last token that was scanned. 354 * The last token that was scanned.
322 */ 355 */
323 Token _tail; 356 Token _tail;
357
324 /** 358 /**
325 * The first token in the list of comment tokens found since the last non-comm ent token. 359 * The first token in the list of comment tokens found since the last non-comm ent token.
326 */ 360 */
327 Token _firstComment; 361 Token _firstComment;
362
328 /** 363 /**
329 * The last token in the list of comment tokens found since the last non-comme nt token. 364 * The last token in the list of comment tokens found since the last non-comme nt token.
330 */ 365 */
331 Token _lastComment; 366 Token _lastComment;
367
332 /** 368 /**
333 * The index of the first character of the current token. 369 * The index of the first character of the current token.
334 */ 370 */
335 int _tokenStart = 0; 371 int _tokenStart = 0;
372
336 /** 373 /**
337 * A list containing the offsets of the first character of each line in the so urce code. 374 * A list containing the offsets of the first character of each line in the so urce code.
338 */ 375 */
339 List<int> _lineStarts = new List<int>(); 376 List<int> _lineStarts = new List<int>();
377
340 /** 378 /**
341 * A list, treated something like a stack, of tokens representing the beginnin g of a matched pair. 379 * A list, treated something like a stack, of tokens representing the beginnin g of a matched pair.
342 * It is used to pair the end tokens with the begin tokens. 380 * It is used to pair the end tokens with the begin tokens.
343 */ 381 */
344 List<BeginToken> _groupingStack = new List<BeginToken>(); 382 List<BeginToken> _groupingStack = new List<BeginToken>();
383
345 /** 384 /**
346 * A flag indicating whether any unmatched groups were found during the parse. 385 * A flag indicating whether any unmatched groups were found during the parse.
347 */ 386 */
348 bool _hasUnmatchedGroups2 = false; 387 bool _hasUnmatchedGroups2 = false;
388
349 /** 389 /**
350 * A non-breaking space, which is allowed by this scanner as a white-space cha racter. 390 * A non-breaking space, which is allowed by this scanner as a white-space cha racter.
351 */ 391 */
352 static int _$NBSP = 160; 392 static int _$NBSP = 160;
393
353 /** 394 /**
354 * Initialize a newly created scanner. 395 * Initialize a newly created scanner.
355 * @param source the source being scanned 396 * @param source the source being scanned
356 * @param errorListener the error listener that will be informed of any errors that are found 397 * @param errorListener the error listener that will be informed of any errors that are found
357 */ 398 */
358 AbstractScanner(Source source, AnalysisErrorListener errorListener) { 399 AbstractScanner(Source source, AnalysisErrorListener errorListener) {
359 this._source = source; 400 this._source = source;
360 this._errorListener = errorListener; 401 this._errorListener = errorListener;
361 _tokens = new Token(TokenType.EOF, -1); 402 _tokens = new Token(TokenType.EOF, -1);
362 _tokens.setNext(_tokens); 403 _tokens.setNext(_tokens);
363 _tail = _tokens; 404 _tail = _tokens;
364 _tokenStart = -1; 405 _tokenStart = -1;
365 _lineStarts.add(0); 406 _lineStarts.add(0);
366 } 407 }
408
367 /** 409 /**
368 * Return an array containing the offsets of the first character of each line in the source code. 410 * Return an array containing the offsets of the first character of each line in the source code.
369 * @return an array containing the offsets of the first character of each line in the source code 411 * @return an array containing the offsets of the first character of each line in the source code
370 */ 412 */
371 List<int> get lineStarts => _lineStarts; 413 List<int> get lineStarts => _lineStarts;
414
372 /** 415 /**
373 * Return the current offset relative to the beginning of the file. Return the initial offset if 416 * Return the current offset relative to the beginning of the file. Return the initial offset if
374 * the scanner has not yet scanned the source code, and one (1) past the end o f the source code if 417 * the scanner has not yet scanned the source code, and one (1) past the end o f the source code if
375 * the source code has been scanned. 418 * the source code has been scanned.
376 * @return the current offset of the scanner in the source 419 * @return the current offset of the scanner in the source
377 */ 420 */
378 int get offset; 421 int get offset;
422
379 /** 423 /**
380 * Return {@code true} if any unmatched groups were found during the parse. 424 * Return {@code true} if any unmatched groups were found during the parse.
381 * @return {@code true} if any unmatched groups were found during the parse 425 * @return {@code true} if any unmatched groups were found during the parse
382 */ 426 */
383 bool hasUnmatchedGroups() => _hasUnmatchedGroups2; 427 bool hasUnmatchedGroups() => _hasUnmatchedGroups2;
428
384 /** 429 /**
385 * Scan the source code to produce a list of tokens representing the source. 430 * Scan the source code to produce a list of tokens representing the source.
386 * @return the first token in the list of tokens that were produced 431 * @return the first token in the list of tokens that were produced
387 */ 432 */
388 Token tokenize() { 433 Token tokenize() {
389 InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engi ne.AbstractScanner.tokenize"); 434 InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engi ne.AbstractScanner.tokenize");
390 int tokenCounter = 0; 435 int tokenCounter = 0;
391 try { 436 try {
392 int next = advance(); 437 int next = advance();
393 while (next != -1) { 438 while (next != -1) {
394 tokenCounter++; 439 tokenCounter++;
395 next = bigSwitch(next); 440 next = bigSwitch(next);
396 } 441 }
397 appendEofToken(); 442 appendEofToken();
398 instrumentation.metric2("tokensCount", tokenCounter); 443 instrumentation.metric2("tokensCount", tokenCounter);
399 return firstToken(); 444 return firstToken();
400 } finally { 445 } finally {
401 instrumentation.log(); 446 instrumentation.log();
402 } 447 }
403 } 448 }
449
404 /** 450 /**
405 * Advance the current position and return the character at the new current po sition. 451 * Advance the current position and return the character at the new current po sition.
406 * @return the character at the new current position 452 * @return the character at the new current position
407 */ 453 */
408 int advance(); 454 int advance();
455
409 /** 456 /**
410 * Return the substring of the source code between the start offset and the mo dified current 457 * Return the substring of the source code between the start offset and the mo dified current
411 * position. The current position is modified by adding the end delta. 458 * position. The current position is modified by adding the end delta.
412 * @param start the offset to the beginning of the string, relative to the sta rt of the file 459 * @param start the offset to the beginning of the string, relative to the sta rt of the file
413 * @param endDelta the number of character after the current location to be in cluded in the 460 * @param endDelta the number of character after the current location to be in cluded in the
414 * string, or the number of characters before the current location to be exclu ded if the 461 * string, or the number of characters before the current location to be exclu ded if the
415 * offset is negative 462 * offset is negative
416 * @return the specified substring of the source code 463 * @return the specified substring of the source code
417 */ 464 */
418 String getString(int start, int endDelta); 465 String getString(int start, int endDelta);
466
419 /** 467 /**
420 * Return the character at the current position without changing the current p osition. 468 * Return the character at the current position without changing the current p osition.
421 * @return the character at the current position 469 * @return the character at the current position
422 */ 470 */
423 int peek(); 471 int peek();
472
424 /** 473 /**
425 * Record the fact that we are at the beginning of a new line in the source. 474 * Record the fact that we are at the beginning of a new line in the source.
426 */ 475 */
427 void recordStartOfLine() { 476 void recordStartOfLine() {
428 _lineStarts.add(offset); 477 _lineStarts.add(offset);
429 } 478 }
430 void appendBeginToken(TokenType type) { 479 void appendBeginToken(TokenType type) {
431 BeginToken token; 480 BeginToken token;
432 if (_firstComment == null) { 481 if (_firstComment == null) {
433 token = new BeginToken(type, _tokenStart); 482 token = new BeginToken(type, _tokenStart);
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 int bigSwitch(int next) { 581 int bigSwitch(int next) {
533 beginToken(); 582 beginToken();
534 if (next == 0xD) { 583 if (next == 0xD) {
535 next = advance(); 584 next = advance();
536 if (next == 0xA) { 585 if (next == 0xA) {
537 next = advance(); 586 next = advance();
538 } 587 }
539 recordStartOfLine(); 588 recordStartOfLine();
540 return next; 589 return next;
541 } else if (next == 0xA) { 590 } else if (next == 0xA) {
591 next = advance();
542 recordStartOfLine(); 592 recordStartOfLine();
543 return advance(); 593 return next;
544 } else if (next == 0x9 || next == 0x20) { 594 } else if (next == 0x9 || next == 0x20) {
545 return advance(); 595 return advance();
546 } 596 }
547 if (next == 0x72) { 597 if (next == 0x72) {
548 int peek2 = peek(); 598 int peek2 = peek();
549 if (peek2 == 0x22 || peek2 == 0x27) { 599 if (peek2 == 0x22 || peek2 == 0x27) {
550 int start = offset; 600 int start = offset;
551 return tokenizeString(advance(), start, true); 601 return tokenizeString(advance(), start, true);
552 } 602 }
553 } 603 }
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 } 717 }
668 if (Character.isLetter(next)) { 718 if (Character.isLetter(next)) {
669 return tokenizeIdentifier(next, offset, true); 719 return tokenizeIdentifier(next, offset, true);
670 } 720 }
671 if (next == _$NBSP) { 721 if (next == _$NBSP) {
672 return advance(); 722 return advance();
673 } 723 }
674 reportError(ScannerErrorCode.ILLEGAL_CHARACTER, [next]); 724 reportError(ScannerErrorCode.ILLEGAL_CHARACTER, [next]);
675 return advance(); 725 return advance();
676 } 726 }
727
677 /** 728 /**
678 * Return the beginning token corresponding to a closing brace that was found while scanning 729 * Return the beginning token corresponding to a closing brace that was found while scanning
679 * inside a string interpolation expression. Tokens that cannot be matched wit h the closing brace 730 * inside a string interpolation expression. Tokens that cannot be matched wit h the closing brace
680 * will be dropped from the stack. 731 * will be dropped from the stack.
681 * @return the token to be paired with the closing brace 732 * @return the token to be paired with the closing brace
682 */ 733 */
683 BeginToken findTokenMatchingClosingBraceInInterpolationExpression() { 734 BeginToken findTokenMatchingClosingBraceInInterpolationExpression() {
684 int last = _groupingStack.length - 1; 735 int last = _groupingStack.length - 1;
685 while (last >= 0) { 736 while (last >= 0) {
686 BeginToken begin = _groupingStack[last]; 737 BeginToken begin = _groupingStack[last];
687 if (identical(begin.type, TokenType.OPEN_CURLY_BRACKET) || identical(begin .type, TokenType.STRING_INTERPOLATION_EXPRESSION)) { 738 if (identical(begin.type, TokenType.OPEN_CURLY_BRACKET) || identical(begin .type, TokenType.STRING_INTERPOLATION_EXPRESSION)) {
688 return begin; 739 return begin;
689 } 740 }
690 _hasUnmatchedGroups2 = true; 741 _hasUnmatchedGroups2 = true;
691 _groupingStack.removeAt(last); 742 _groupingStack.removeAt(last);
692 last--; 743 last--;
693 } 744 }
694 return null; 745 return null;
695 } 746 }
696 Token firstToken() => _tokens.next; 747 Token firstToken() => _tokens.next;
748
697 /** 749 /**
698 * Return the source being scanned. 750 * Return the source being scanned.
699 * @return the source being scanned 751 * @return the source being scanned
700 */ 752 */
701 Source get source => _source; 753 Source get source => _source;
754
702 /** 755 /**
703 * Report an error at the current offset. 756 * Report an error at the current offset.
704 * @param errorCode the error code indicating the nature of the error 757 * @param errorCode the error code indicating the nature of the error
705 * @param arguments any arguments needed to complete the error message 758 * @param arguments any arguments needed to complete the error message
706 */ 759 */
707 void reportError(ScannerErrorCode errorCode, List<Object> arguments) { 760 void reportError(ScannerErrorCode errorCode, List<Object> arguments) {
708 _errorListener.onError(new AnalysisError.con2(source, offset, 1, errorCode, arguments)); 761 _errorListener.onError(new AnalysisError.con2(source, offset, 1, errorCode, arguments));
709 } 762 }
710 int select(int choice, TokenType yesType, TokenType noType) { 763 int select(int choice, TokenType yesType, TokenType noType) {
711 int next = advance(); 764 int next = advance();
712 if (next == choice) { 765 if (next == choice) {
713 appendToken(yesType); 766 appendToken(yesType);
714 return advance(); 767 return advance();
715 } else { 768 } else {
716 appendToken(noType); 769 appendToken(noType);
717 return next; 770 return next;
718 } 771 }
719 } 772 }
720 int select2(int choice, TokenType yesType, TokenType noType, int offset) { 773 int select4(int choice, TokenType yesType, TokenType noType, int offset) {
721 int next = advance(); 774 int next = advance();
722 if (next == choice) { 775 if (next == choice) {
723 appendToken2(yesType, offset); 776 appendToken2(yesType, offset);
724 return advance(); 777 return advance();
725 } else { 778 } else {
726 appendToken2(noType, offset); 779 appendToken2(noType, offset);
727 return next; 780 return next;
728 } 781 }
729 } 782 }
730 int tokenizeAmpersand(int next) { 783 int tokenizeAmpersand(int next) {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
817 continue LOOP; 870 continue LOOP;
818 } else { 871 } else {
819 done = true; 872 done = true;
820 continue LOOP; 873 continue LOOP;
821 } 874 }
822 next = advance(); 875 next = advance();
823 } 876 }
824 if (!hasDigit) { 877 if (!hasDigit) {
825 appendStringToken(TokenType.INT, getString(start, -2)); 878 appendStringToken(TokenType.INT, getString(start, -2));
826 if (0x2E == next) { 879 if (0x2E == next) {
827 return select2(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PE RIOD, offset - 1); 880 return select4(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PE RIOD, offset - 1);
828 } 881 }
829 appendToken2(TokenType.PERIOD, offset - 1); 882 appendToken2(TokenType.PERIOD, offset - 1);
830 return bigSwitch(next); 883 return bigSwitch(next);
831 } 884 }
832 if (next == 0x64 || next == 0x44) { 885 if (next == 0x64 || next == 0x44) {
833 next = advance(); 886 next = advance();
834 } 887 }
835 appendStringToken(TokenType.DOUBLE, getString(start, next < 0 ? 0 : -1)); 888 appendStringToken(TokenType.DOUBLE, getString(start, next < 0 ? 0 : -1));
836 return next; 889 return next;
837 } 890 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 } 968 }
916 if (next == -1) { 969 if (next == -1) {
917 return next; 970 return next;
918 } 971 }
919 next = advance(); 972 next = advance();
920 beginToken(); 973 beginToken();
921 return next; 974 return next;
922 } 975 }
923 int tokenizeInterpolatedIdentifier(int next, int start) { 976 int tokenizeInterpolatedIdentifier(int next, int start) {
924 appendStringToken2(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0); 977 appendStringToken2(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0);
925 beginToken(); 978 if (((0x41 <= next && next <= 0x5A) || (0x61 <= next && next <= 0x7A) || nex t == 0x5F)) {
926 next = tokenizeKeywordOrIdentifier(next, false); 979 beginToken();
980 next = tokenizeKeywordOrIdentifier(next, false);
981 }
927 beginToken(); 982 beginToken();
928 return next; 983 return next;
929 } 984 }
930 int tokenizeKeywordOrIdentifier(int next2, bool allowDollar) { 985 int tokenizeKeywordOrIdentifier(int next2, bool allowDollar) {
931 KeywordState state = KeywordState.KEYWORD_STATE; 986 KeywordState state = KeywordState.KEYWORD_STATE;
932 int start = offset; 987 int start = offset;
933 while (state != null && 0x61 <= next2 && next2 <= 0x7A) { 988 while (state != null && 0x61 <= next2 && next2 <= 0x7A) {
934 state = state.next((next2 as int)); 989 state = state.next((next2 as int));
935 next2 = advance(); 990 next2 = advance();
936 } 991 }
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
1215 int tokenizeTilde(int next) { 1270 int tokenizeTilde(int next) {
1216 next = advance(); 1271 next = advance();
1217 if (next == 0x2F) { 1272 if (next == 0x2F) {
1218 return select(0x3D, TokenType.TILDE_SLASH_EQ, TokenType.TILDE_SLASH); 1273 return select(0x3D, TokenType.TILDE_SLASH_EQ, TokenType.TILDE_SLASH);
1219 } else { 1274 } else {
1220 appendToken(TokenType.TILDE); 1275 appendToken(TokenType.TILDE);
1221 return next; 1276 return next;
1222 } 1277 }
1223 } 1278 }
1224 } 1279 }
1280
1225 /** 1281 /**
1226 * Instances of the class {@code StringToken} represent a token whose value is i ndependent of it's 1282 * Instances of the class {@code StringToken} represent a token whose value is i ndependent of it's
1227 * type. 1283 * type.
1228 * @coverage dart.engine.parser 1284 * @coverage dart.engine.parser
1229 */ 1285 */
1230 class StringToken extends Token { 1286 class StringToken extends Token {
1287
1231 /** 1288 /**
1232 * The lexeme represented by this token. 1289 * The lexeme represented by this token.
1233 */ 1290 */
1234 String _value2; 1291 String _value2;
1292
1235 /** 1293 /**
1236 * Initialize a newly created token to represent a token of the given type wit h the given value. 1294 * Initialize a newly created token to represent a token of the given type wit h the given value.
1237 * @param type the type of the token 1295 * @param type the type of the token
1238 * @param value the lexeme represented by this token 1296 * @param value the lexeme represented by this token
1239 * @param offset the offset from the beginning of the file to the first charac ter in the token 1297 * @param offset the offset from the beginning of the file to the first charac ter in the token
1240 */ 1298 */
1241 StringToken(TokenType type, String value, int offset) : super(type, offset) { 1299 StringToken(TokenType type, String value, int offset) : super(type, offset) {
1242 this._value2 = StringUtilities.intern(value); 1300 this._value2 = StringUtilities.intern(value);
1243 } 1301 }
1244 String get lexeme => _value2; 1302 String get lexeme => _value2;
1245 String value() => _value2; 1303 String value() => _value2;
1246 } 1304 }
1305
1247 /** 1306 /**
1248 * Instances of the class {@code CharBufferScanner} implement a scanner that rea ds from a character 1307 * Instances of the class {@code CharBufferScanner} implement a scanner that rea ds from a character
1249 * buffer. The scanning logic is in the superclass. 1308 * buffer. The scanning logic is in the superclass.
1250 * @coverage dart.engine.parser 1309 * @coverage dart.engine.parser
1251 */ 1310 */
1252 class CharBufferScanner extends AbstractScanner { 1311 class CharBufferScanner extends AbstractScanner {
1312
1253 /** 1313 /**
1254 * The buffer from which characters will be read. 1314 * The buffer from which characters will be read.
1255 */ 1315 */
1256 CharBuffer _buffer; 1316 CharBuffer _buffer;
1317
1257 /** 1318 /**
1258 * The number of characters in the buffer. 1319 * The number of characters in the buffer.
1259 */ 1320 */
1260 int _bufferLength = 0; 1321 int _bufferLength = 0;
1322
1261 /** 1323 /**
1262 * The index of the last character that was read. 1324 * The index of the last character that was read.
1263 */ 1325 */
1264 int _charOffset = 0; 1326 int _charOffset = 0;
1327
1265 /** 1328 /**
1266 * Initialize a newly created scanner to scan the characters in the given char acter buffer. 1329 * Initialize a newly created scanner to scan the characters in the given char acter buffer.
1267 * @param source the source being scanned 1330 * @param source the source being scanned
1268 * @param buffer the buffer from which characters will be read 1331 * @param buffer the buffer from which characters will be read
1269 * @param errorListener the error listener that will be informed of any errors that are found 1332 * @param errorListener the error listener that will be informed of any errors that are found
1270 */ 1333 */
1271 CharBufferScanner(Source source, CharBuffer buffer, AnalysisErrorListener erro rListener) : super(source, errorListener) { 1334 CharBufferScanner(Source source, CharBuffer buffer, AnalysisErrorListener erro rListener) : super(source, errorListener) {
1272 this._buffer = buffer; 1335 this._buffer = buffer;
1273 this._bufferLength = buffer.length(); 1336 this._bufferLength = buffer.length();
1274 this._charOffset = -1; 1337 this._charOffset = -1;
1275 } 1338 }
1276 int get offset => _charOffset; 1339 int get offset => _charOffset;
1277 int advance() { 1340 int advance() {
1278 if (_charOffset + 1 >= _bufferLength) { 1341 if (_charOffset + 1 >= _bufferLength) {
1279 return -1; 1342 return -1;
1280 } 1343 }
1281 return _buffer.charAt(++_charOffset); 1344 return _buffer.charAt(++_charOffset);
1282 } 1345 }
1283 String getString(int start, int endDelta) => ((_buffer as CharSequence)).subSe quence(start, _charOffset + 1 + endDelta).toString(); 1346 String getString(int start, int endDelta) => ((_buffer as CharSequence)).subSe quence(start, _charOffset + 1 + endDelta).toString();
1284 int peek() { 1347 int peek() {
1285 if (_charOffset + 1 >= _buffer.length()) { 1348 if (_charOffset + 1 >= _buffer.length()) {
1286 return -1; 1349 return -1;
1287 } 1350 }
1288 return _buffer.charAt(_charOffset + 1); 1351 return _buffer.charAt(_charOffset + 1);
1289 } 1352 }
1290 } 1353 }
1354
1291 /** 1355 /**
1292 * Instances of the class {@code TokenWithComment} represent a normal token that is preceded by 1356 * Instances of the class {@code TokenWithComment} represent a normal token that is preceded by
1293 * comments. 1357 * comments.
1294 * @coverage dart.engine.parser 1358 * @coverage dart.engine.parser
1295 */ 1359 */
1296 class TokenWithComment extends Token { 1360 class TokenWithComment extends Token {
1361
1297 /** 1362 /**
1298 * The first comment in the list of comments that precede this token. 1363 * The first comment in the list of comments that precede this token.
1299 */ 1364 */
1300 Token _precedingComment; 1365 Token _precedingComment;
1366
1301 /** 1367 /**
1302 * Initialize a newly created token to have the given type and offset and to b e preceded by the 1368 * Initialize a newly created token to have the given type and offset and to b e preceded by the
1303 * comments reachable from the given comment. 1369 * comments reachable from the given comment.
1304 * @param type the type of the token 1370 * @param type the type of the token
1305 * @param offset the offset from the beginning of the file to the first charac ter in the token 1371 * @param offset the offset from the beginning of the file to the first charac ter in the token
1306 * @param precedingComment the first comment in the list of comments that prec ede this token 1372 * @param precedingComment the first comment in the list of comments that prec ede this token
1307 */ 1373 */
1308 TokenWithComment(TokenType type, int offset, Token precedingComment) : super(t ype, offset) { 1374 TokenWithComment(TokenType type, int offset, Token precedingComment) : super(t ype, offset) {
1309 this._precedingComment = precedingComment; 1375 this._precedingComment = precedingComment;
1310 } 1376 }
1311 Token get precedingComments => _precedingComment; 1377 Token get precedingComments => _precedingComment;
1312 } 1378 }
1379
1313 /** 1380 /**
1314 * Instances of the class {@code Token} represent a token that was scanned from the input. Each 1381 * Instances of the class {@code Token} represent a token that was scanned from the input. Each
1315 * token knows which token follows it, acting as the head of a linked list of to kens. 1382 * token knows which token follows it, acting as the head of a linked list of to kens.
1316 * @coverage dart.engine.parser 1383 * @coverage dart.engine.parser
1317 */ 1384 */
1318 class Token { 1385 class Token {
1386
1319 /** 1387 /**
1320 * The type of the token. 1388 * The type of the token.
1321 */ 1389 */
1322 TokenType _type; 1390 TokenType _type;
1391
1323 /** 1392 /**
1324 * The offset from the beginning of the file to the first character in the tok en. 1393 * The offset from the beginning of the file to the first character in the tok en.
1325 */ 1394 */
1326 int _offset = 0; 1395 int _offset = 0;
1396
1327 /** 1397 /**
1328 * The previous token in the token stream. 1398 * The previous token in the token stream.
1329 */ 1399 */
1330 Token _previous; 1400 Token _previous;
1401
1331 /** 1402 /**
1332 * The next token in the token stream. 1403 * The next token in the token stream.
1333 */ 1404 */
1334 Token _next; 1405 Token _next;
1406
1335 /** 1407 /**
1336 * Initialize a newly created token to have the given type and offset. 1408 * Initialize a newly created token to have the given type and offset.
1337 * @param type the type of the token 1409 * @param type the type of the token
1338 * @param offset the offset from the beginning of the file to the first charac ter in the token 1410 * @param offset the offset from the beginning of the file to the first charac ter in the token
1339 */ 1411 */
1340 Token(TokenType type, int offset) { 1412 Token(TokenType type, int offset) {
1341 this._type = type; 1413 this._type = type;
1342 this._offset = offset; 1414 this._offset = offset;
1343 } 1415 }
1416
1344 /** 1417 /**
1345 * Return the offset from the beginning of the file to the character after las t character of the 1418 * Return the offset from the beginning of the file to the character after las t character of the
1346 * token. 1419 * token.
1347 * @return the offset from the beginning of the file to the first character af ter last character 1420 * @return the offset from the beginning of the file to the first character af ter last character
1348 * of the token 1421 * of the token
1349 */ 1422 */
1350 int get end => _offset + length; 1423 int get end => _offset + length;
1424
1351 /** 1425 /**
1352 * Return the number of characters in the node's source range. 1426 * Return the number of characters in the node's source range.
1353 * @return the number of characters in the node's source range 1427 * @return the number of characters in the node's source range
1354 */ 1428 */
1355 int get length => lexeme.length; 1429 int get length => lexeme.length;
1430
1356 /** 1431 /**
1357 * Return the lexeme that represents this token. 1432 * Return the lexeme that represents this token.
1358 * @return the lexeme that represents this token 1433 * @return the lexeme that represents this token
1359 */ 1434 */
1360 String get lexeme => _type.lexeme; 1435 String get lexeme => _type.lexeme;
1436
1361 /** 1437 /**
1362 * Return the next token in the token stream. 1438 * Return the next token in the token stream.
1363 * @return the next token in the token stream 1439 * @return the next token in the token stream
1364 */ 1440 */
1365 Token get next => _next; 1441 Token get next => _next;
1442
1366 /** 1443 /**
1367 * Return the offset from the beginning of the file to the first character in the token. 1444 * Return the offset from the beginning of the file to the first character in the token.
1368 * @return the offset from the beginning of the file to the first character in the token 1445 * @return the offset from the beginning of the file to the first character in the token
1369 */ 1446 */
1370 int get offset => _offset; 1447 int get offset => _offset;
1448
1371 /** 1449 /**
1372 * Return the first comment in the list of comments that precede this token, o r {@code null} if 1450 * Return the first comment in the list of comments that precede this token, o r {@code null} if
1373 * there are no comments preceding this token. Additional comments can be reac hed by following the 1451 * there are no comments preceding this token. Additional comments can be reac hed by following the
1374 * token stream using {@link #getNext()} until {@code null} is returned. 1452 * token stream using {@link #getNext()} until {@code null} is returned.
1375 * @return the first comment in the list of comments that precede this token 1453 * @return the first comment in the list of comments that precede this token
1376 */ 1454 */
1377 Token get precedingComments => null; 1455 Token get precedingComments => null;
1456
1378 /** 1457 /**
1379 * Return the previous token in the token stream. 1458 * Return the previous token in the token stream.
1380 * @return the previous token in the token stream 1459 * @return the previous token in the token stream
1381 */ 1460 */
1382 Token get previous => _previous; 1461 Token get previous => _previous;
1462
1383 /** 1463 /**
1384 * Return the type of the token. 1464 * Return the type of the token.
1385 * @return the type of the token 1465 * @return the type of the token
1386 */ 1466 */
1387 TokenType get type => _type; 1467 TokenType get type => _type;
1468
1388 /** 1469 /**
1389 * Return {@code true} if this token represents an operator. 1470 * Return {@code true} if this token represents an operator.
1390 * @return {@code true} if this token represents an operator 1471 * @return {@code true} if this token represents an operator
1391 */ 1472 */
1392 bool isOperator() => _type.isOperator(); 1473 bool isOperator() => _type.isOperator();
1474
1393 /** 1475 /**
1394 * Return {@code true} if this token is a synthetic token. A synthetic token i s a token that was 1476 * Return {@code true} if this token is a synthetic token. A synthetic token i s a token that was
1395 * introduced by the parser in order to recover from an error in the code. Syn thetic tokens always 1477 * introduced by the parser in order to recover from an error in the code. Syn thetic tokens always
1396 * have a length of zero ({@code 0}). 1478 * have a length of zero ({@code 0}).
1397 * @return {@code true} if this token is a synthetic token 1479 * @return {@code true} if this token is a synthetic token
1398 */ 1480 */
1399 bool isSynthetic() => length == 0; 1481 bool isSynthetic() => length == 0;
1482
1400 /** 1483 /**
1401 * Return {@code true} if this token represents an operator that can be define d by users. 1484 * Return {@code true} if this token represents an operator that can be define d by users.
1402 * @return {@code true} if this token represents an operator that can be defin ed by users 1485 * @return {@code true} if this token represents an operator that can be defin ed by users
1403 */ 1486 */
1404 bool isUserDefinableOperator() => _type.isUserDefinableOperator(); 1487 bool isUserDefinableOperator() => _type.isUserDefinableOperator();
1488
1405 /** 1489 /**
1406 * Set the next token in the token stream to the given token. This has the sid e-effect of setting 1490 * Set the next token in the token stream to the given token. This has the sid e-effect of setting
1407 * this token to be the previous token for the given token. 1491 * this token to be the previous token for the given token.
1408 * @param token the next token in the token stream 1492 * @param token the next token in the token stream
1409 * @return the token that was passed in 1493 * @return the token that was passed in
1410 */ 1494 */
1411 Token setNext(Token token) { 1495 Token setNext(Token token) {
1412 _next = token; 1496 _next = token;
1413 token.previous = this; 1497 token.previous = this;
1414 return token; 1498 return token;
1415 } 1499 }
1500
1416 /** 1501 /**
1417 * Set the next token in the token stream to the given token without changing which token is the 1502 * Set the next token in the token stream to the given token without changing which token is the
1418 * previous token for the given token. 1503 * previous token for the given token.
1419 * @param token the next token in the token stream 1504 * @param token the next token in the token stream
1420 * @return the token that was passed in 1505 * @return the token that was passed in
1421 */ 1506 */
1422 Token setNextWithoutSettingPrevious(Token token) { 1507 Token setNextWithoutSettingPrevious(Token token) {
1423 _next = token; 1508 _next = token;
1424 return token; 1509 return token;
1425 } 1510 }
1511
1426 /** 1512 /**
1427 * Set the offset from the beginning of the file to the first character in the token to the given 1513 * Set the offset from the beginning of the file to the first character in the token to the given
1428 * offset. 1514 * offset.
1429 * @param offset the offset from the beginning of the file to the first charac ter in the token 1515 * @param offset the offset from the beginning of the file to the first charac ter in the token
1430 */ 1516 */
1431 void set offset(int offset2) { 1517 void set offset(int offset2) {
1432 this._offset = offset2; 1518 this._offset = offset2;
1433 } 1519 }
1434 String toString() => lexeme; 1520 String toString() => lexeme;
1521
1435 /** 1522 /**
1436 * Return the value of this token. For keyword tokens, this is the keyword ass ociated with the 1523 * Return the value of this token. For keyword tokens, this is the keyword ass ociated with the
1437 * token, for other tokens it is the lexeme associated with the token. 1524 * token, for other tokens it is the lexeme associated with the token.
1438 * @return the value of this token 1525 * @return the value of this token
1439 */ 1526 */
1440 Object value() => _type.lexeme; 1527 Object value() => _type.lexeme;
1528
1441 /** 1529 /**
1442 * Set the previous token in the token stream to the given token. 1530 * Set the previous token in the token stream to the given token.
1443 * @param previous the previous token in the token stream 1531 * @param previous the previous token in the token stream
1444 */ 1532 */
1445 void set previous(Token previous2) { 1533 void set previous(Token previous2) {
1446 this._previous = previous2; 1534 this._previous = previous2;
1447 } 1535 }
1448 } 1536 }
1537
1449 /** 1538 /**
1450 * Instances of the class {@code StringScanner} implement a scanner that reads f rom a string. The 1539 * Instances of the class {@code StringScanner} implement a scanner that reads f rom a string. The
1451 * scanning logic is in the superclass. 1540 * scanning logic is in the superclass.
1452 * @coverage dart.engine.parser 1541 * @coverage dart.engine.parser
1453 */ 1542 */
1454 class StringScanner extends AbstractScanner { 1543 class StringScanner extends AbstractScanner {
1544
1455 /** 1545 /**
1456 * The offset from the beginning of the file to the beginning of the source be ing scanned. 1546 * The offset from the beginning of the file to the beginning of the source be ing scanned.
1457 */ 1547 */
1458 int _offsetDelta = 0; 1548 int _offsetDelta = 0;
1549
1459 /** 1550 /**
1460 * The string from which characters will be read. 1551 * The string from which characters will be read.
1461 */ 1552 */
1462 String _string; 1553 String _string;
1554
1463 /** 1555 /**
1464 * The number of characters in the string. 1556 * The number of characters in the string.
1465 */ 1557 */
1466 int _stringLength = 0; 1558 int _stringLength = 0;
1559
1467 /** 1560 /**
1468 * The index, relative to the string, of the last character that was read. 1561 * The index, relative to the string, of the last character that was read.
1469 */ 1562 */
1470 int _charOffset = 0; 1563 int _charOffset = 0;
1564
1471 /** 1565 /**
1472 * Initialize a newly created scanner to scan the characters in the given stri ng. 1566 * Initialize a newly created scanner to scan the characters in the given stri ng.
1473 * @param source the source being scanned 1567 * @param source the source being scanned
1474 * @param string the string from which characters will be read 1568 * @param string the string from which characters will be read
1475 * @param errorListener the error listener that will be informed of any errors that are found 1569 * @param errorListener the error listener that will be informed of any errors that are found
1476 */ 1570 */
1477 StringScanner(Source source, String string, AnalysisErrorListener errorListene r) : super(source, errorListener) { 1571 StringScanner(Source source, String string, AnalysisErrorListener errorListene r) : super(source, errorListener) {
1478 this._offsetDelta = 0; 1572 this._offsetDelta = 0;
1479 this._string = string; 1573 this._string = string;
1480 this._stringLength = string.length; 1574 this._stringLength = string.length;
1481 this._charOffset = -1; 1575 this._charOffset = -1;
1482 } 1576 }
1483 int get offset => _offsetDelta + _charOffset; 1577 int get offset => _offsetDelta + _charOffset;
1578
1484 /** 1579 /**
1485 * Record that the source begins on the given line and column at the given off set. The line starts 1580 * Record that the source begins on the given line and column at the given off set. The line starts
1486 * for lines before the given line will not be correct. 1581 * for lines before the given line will not be correct.
1487 * <p> 1582 * <p>
1488 * This method must be invoked at most one time and must be invoked before sca nning begins. The 1583 * This method must be invoked at most one time and must be invoked before sca nning begins. The
1489 * values provided must be sensible. The results are undefined if these condit ions are violated. 1584 * values provided must be sensible. The results are undefined if these condit ions are violated.
1490 * @param line the one-based index of the line containing the first character of the source 1585 * @param line the one-based index of the line containing the first character of the source
1491 * @param column the one-based index of the column in which the first characte r of the source 1586 * @param column the one-based index of the column in which the first characte r of the source
1492 * occurs 1587 * occurs
1493 * @param offset the zero-based offset from the beginning of the larger contex t to the first 1588 * @param offset the zero-based offset from the beginning of the larger contex t to the first
(...skipping 18 matching lines...) Expand all
1512 return _string.codeUnitAt(++_charOffset); 1607 return _string.codeUnitAt(++_charOffset);
1513 } 1608 }
1514 String getString(int start, int endDelta) => _string.substring(start - _offset Delta, _charOffset + 1 + endDelta); 1609 String getString(int start, int endDelta) => _string.substring(start - _offset Delta, _charOffset + 1 + endDelta);
1515 int peek() { 1610 int peek() {
1516 if (_charOffset + 1 >= _string.length) { 1611 if (_charOffset + 1 >= _string.length) {
1517 return -1; 1612 return -1;
1518 } 1613 }
1519 return _string.codeUnitAt(_charOffset + 1); 1614 return _string.codeUnitAt(_charOffset + 1);
1520 } 1615 }
1521 } 1616 }
1617
1522 /** 1618 /**
1523 * Instances of the class {@code BeginTokenWithComment} represent a begin token that is preceded by 1619 * Instances of the class {@code BeginTokenWithComment} represent a begin token that is preceded by
1524 * comments. 1620 * comments.
1525 * @coverage dart.engine.parser 1621 * @coverage dart.engine.parser
1526 */ 1622 */
1527 class BeginTokenWithComment extends BeginToken { 1623 class BeginTokenWithComment extends BeginToken {
1624
1528 /** 1625 /**
1529 * The first comment in the list of comments that precede this token. 1626 * The first comment in the list of comments that precede this token.
1530 */ 1627 */
1531 Token _precedingComment; 1628 Token _precedingComment;
1629
1532 /** 1630 /**
1533 * Initialize a newly created token to have the given type and offset and to b e preceded by the 1631 * Initialize a newly created token to have the given type and offset and to b e preceded by the
1534 * comments reachable from the given comment. 1632 * comments reachable from the given comment.
1535 * @param type the type of the token 1633 * @param type the type of the token
1536 * @param offset the offset from the beginning of the file to the first charac ter in the token 1634 * @param offset the offset from the beginning of the file to the first charac ter in the token
1537 * @param precedingComment the first comment in the list of comments that prec ede this token 1635 * @param precedingComment the first comment in the list of comments that prec ede this token
1538 */ 1636 */
1539 BeginTokenWithComment(TokenType type, int offset, Token precedingComment) : su per(type, offset) { 1637 BeginTokenWithComment(TokenType type, int offset, Token precedingComment) : su per(type, offset) {
1540 this._precedingComment = precedingComment; 1638 this._precedingComment = precedingComment;
1541 } 1639 }
1542 Token get precedingComments => _precedingComment; 1640 Token get precedingComments => _precedingComment;
1543 } 1641 }
1642
1544 /** 1643 /**
1545 * Instances of the class {@code KeywordToken} represent a keyword in the langua ge. 1644 * Instances of the class {@code KeywordToken} represent a keyword in the langua ge.
1546 * @coverage dart.engine.parser 1645 * @coverage dart.engine.parser
1547 */ 1646 */
1548 class KeywordToken extends Token { 1647 class KeywordToken extends Token {
1648
1549 /** 1649 /**
1550 * The keyword being represented by this token. 1650 * The keyword being represented by this token.
1551 */ 1651 */
1552 Keyword _keyword; 1652 Keyword _keyword;
1653
1553 /** 1654 /**
1554 * Initialize a newly created token to represent the given keyword. 1655 * Initialize a newly created token to represent the given keyword.
1555 * @param keyword the keyword being represented by this token 1656 * @param keyword the keyword being represented by this token
1556 * @param offset the offset from the beginning of the file to the first charac ter in the token 1657 * @param offset the offset from the beginning of the file to the first charac ter in the token
1557 */ 1658 */
1558 KeywordToken(Keyword keyword, int offset) : super(TokenType.KEYWORD, offset) { 1659 KeywordToken(Keyword keyword, int offset) : super(TokenType.KEYWORD, offset) {
1559 this._keyword = keyword; 1660 this._keyword = keyword;
1560 } 1661 }
1662
1561 /** 1663 /**
1562 * Return the keyword being represented by this token. 1664 * Return the keyword being represented by this token.
1563 * @return the keyword being represented by this token 1665 * @return the keyword being represented by this token
1564 */ 1666 */
1565 Keyword get keyword => _keyword; 1667 Keyword get keyword => _keyword;
1566 String get lexeme => _keyword.syntax; 1668 String get lexeme => _keyword.syntax;
1567 Keyword value() => _keyword; 1669 Keyword value() => _keyword;
1568 } 1670 }
1671
1569 /** 1672 /**
1570 * Instances of the class {@code BeginToken} represent the opening half of a gro uping pair of 1673 * Instances of the class {@code BeginToken} represent the opening half of a gro uping pair of
1571 * tokens. This is used for curly brackets ('{'), parentheses ('('), and square brackets ('\['). 1674 * tokens. This is used for curly brackets ('{'), parentheses ('('), and square brackets ('\[').
1572 * @coverage dart.engine.parser 1675 * @coverage dart.engine.parser
1573 */ 1676 */
1574 class BeginToken extends Token { 1677 class BeginToken extends Token {
1678
1575 /** 1679 /**
1576 * The token that corresponds to this token. 1680 * The token that corresponds to this token.
1577 */ 1681 */
1578 Token _endToken; 1682 Token _endToken;
1683
1579 /** 1684 /**
1580 * Initialize a newly created token representing the opening half of a groupin g pair of tokens. 1685 * Initialize a newly created token representing the opening half of a groupin g pair of tokens.
1581 * @param type the type of the token 1686 * @param type the type of the token
1582 * @param offset the offset from the beginning of the file to the first charac ter in the token 1687 * @param offset the offset from the beginning of the file to the first charac ter in the token
1583 */ 1688 */
1584 BeginToken(TokenType type, int offset) : super(type, offset) { 1689 BeginToken(TokenType type, int offset) : super(type, offset) {
1585 assert((identical(type, TokenType.OPEN_CURLY_BRACKET) || identical(type, Tok enType.OPEN_PAREN) || identical(type, TokenType.OPEN_SQUARE_BRACKET) || identica l(type, TokenType.STRING_INTERPOLATION_EXPRESSION))); 1690 assert((identical(type, TokenType.OPEN_CURLY_BRACKET) || identical(type, Tok enType.OPEN_PAREN) || identical(type, TokenType.OPEN_SQUARE_BRACKET) || identica l(type, TokenType.STRING_INTERPOLATION_EXPRESSION)));
1586 } 1691 }
1692
1587 /** 1693 /**
1588 * Return the token that corresponds to this token. 1694 * Return the token that corresponds to this token.
1589 * @return the token that corresponds to this token 1695 * @return the token that corresponds to this token
1590 */ 1696 */
1591 Token get endToken => _endToken; 1697 Token get endToken => _endToken;
1698
1592 /** 1699 /**
1593 * Set the token that corresponds to this token to the given token. 1700 * Set the token that corresponds to this token to the given token.
1594 * @param token the token that corresponds to this token 1701 * @param token the token that corresponds to this token
1595 */ 1702 */
1596 void set endToken(Token token) { 1703 void set endToken(Token token) {
1597 this._endToken = token; 1704 this._endToken = token;
1598 } 1705 }
1599 } 1706 }
1707
1600 /** 1708 /**
1601 * The enumeration {@code TokenClass} represents classes (or groups) of tokens w ith a similar use. 1709 * The enumeration {@code TokenClass} represents classes (or groups) of tokens w ith a similar use.
1602 * @coverage dart.engine.parser 1710 * @coverage dart.engine.parser
1603 */ 1711 */
1604 class TokenClass implements Comparable<TokenClass> { 1712 class TokenClass implements Comparable<TokenClass> {
1713
1605 /** 1714 /**
1606 * A value used to indicate that the token type is not part of any specific cl ass of token. 1715 * A value used to indicate that the token type is not part of any specific cl ass of token.
1607 */ 1716 */
1608 static final TokenClass NO_CLASS = new TokenClass.con1('NO_CLASS', 0); 1717 static final TokenClass NO_CLASS = new TokenClass.con1('NO_CLASS', 0);
1718
1609 /** 1719 /**
1610 * A value used to indicate that the token type is an additive operator. 1720 * A value used to indicate that the token type is an additive operator.
1611 */ 1721 */
1612 static final TokenClass ADDITIVE_OPERATOR = new TokenClass.con2('ADDITIVE_OPER ATOR', 1, 12); 1722 static final TokenClass ADDITIVE_OPERATOR = new TokenClass.con2('ADDITIVE_OPER ATOR', 1, 12);
1723
1613 /** 1724 /**
1614 * A value used to indicate that the token type is an assignment operator. 1725 * A value used to indicate that the token type is an assignment operator.
1615 */ 1726 */
1616 static final TokenClass ASSIGNMENT_OPERATOR = new TokenClass.con2('ASSIGNMENT_ OPERATOR', 2, 1); 1727 static final TokenClass ASSIGNMENT_OPERATOR = new TokenClass.con2('ASSIGNMENT_ OPERATOR', 2, 1);
1728
1617 /** 1729 /**
1618 * A value used to indicate that the token type is a bitwise-and operator. 1730 * A value used to indicate that the token type is a bitwise-and operator.
1619 */ 1731 */
1620 static final TokenClass BITWISE_AND_OPERATOR = new TokenClass.con2('BITWISE_AN D_OPERATOR', 3, 8); 1732 static final TokenClass BITWISE_AND_OPERATOR = new TokenClass.con2('BITWISE_AN D_OPERATOR', 3, 8);
1733
1621 /** 1734 /**
1622 * A value used to indicate that the token type is a bitwise-or operator. 1735 * A value used to indicate that the token type is a bitwise-or operator.
1623 */ 1736 */
1624 static final TokenClass BITWISE_OR_OPERATOR = new TokenClass.con2('BITWISE_OR_ OPERATOR', 4, 6); 1737 static final TokenClass BITWISE_OR_OPERATOR = new TokenClass.con2('BITWISE_OR_ OPERATOR', 4, 6);
1738
1625 /** 1739 /**
1626 * A value used to indicate that the token type is a bitwise-xor operator. 1740 * A value used to indicate that the token type is a bitwise-xor operator.
1627 */ 1741 */
1628 static final TokenClass BITWISE_XOR_OPERATOR = new TokenClass.con2('BITWISE_XO R_OPERATOR', 5, 7); 1742 static final TokenClass BITWISE_XOR_OPERATOR = new TokenClass.con2('BITWISE_XO R_OPERATOR', 5, 7);
1743
1629 /** 1744 /**
1630 * A value used to indicate that the token type is a cascade operator. 1745 * A value used to indicate that the token type is a cascade operator.
1631 */ 1746 */
1632 static final TokenClass CASCADE_OPERATOR = new TokenClass.con2('CASCADE_OPERAT OR', 6, 2); 1747 static final TokenClass CASCADE_OPERATOR = new TokenClass.con2('CASCADE_OPERAT OR', 6, 2);
1748
1633 /** 1749 /**
1634 * A value used to indicate that the token type is a conditional operator. 1750 * A value used to indicate that the token type is a conditional operator.
1635 */ 1751 */
1636 static final TokenClass CONDITIONAL_OPERATOR = new TokenClass.con2('CONDITIONA L_OPERATOR', 7, 3); 1752 static final TokenClass CONDITIONAL_OPERATOR = new TokenClass.con2('CONDITIONA L_OPERATOR', 7, 3);
1753
1637 /** 1754 /**
1638 * A value used to indicate that the token type is an equality operator. 1755 * A value used to indicate that the token type is an equality operator.
1639 */ 1756 */
1640 static final TokenClass EQUALITY_OPERATOR = new TokenClass.con2('EQUALITY_OPER ATOR', 8, 9); 1757 static final TokenClass EQUALITY_OPERATOR = new TokenClass.con2('EQUALITY_OPER ATOR', 8, 9);
1758
1641 /** 1759 /**
1642 * A value used to indicate that the token type is a logical-and operator. 1760 * A value used to indicate that the token type is a logical-and operator.
1643 */ 1761 */
1644 static final TokenClass LOGICAL_AND_OPERATOR = new TokenClass.con2('LOGICAL_AN D_OPERATOR', 9, 5); 1762 static final TokenClass LOGICAL_AND_OPERATOR = new TokenClass.con2('LOGICAL_AN D_OPERATOR', 9, 5);
1763
1645 /** 1764 /**
1646 * A value used to indicate that the token type is a logical-or operator. 1765 * A value used to indicate that the token type is a logical-or operator.
1647 */ 1766 */
1648 static final TokenClass LOGICAL_OR_OPERATOR = new TokenClass.con2('LOGICAL_OR_ OPERATOR', 10, 4); 1767 static final TokenClass LOGICAL_OR_OPERATOR = new TokenClass.con2('LOGICAL_OR_ OPERATOR', 10, 4);
1768
1649 /** 1769 /**
1650 * A value used to indicate that the token type is a multiplicative operator. 1770 * A value used to indicate that the token type is a multiplicative operator.
1651 */ 1771 */
1652 static final TokenClass MULTIPLICATIVE_OPERATOR = new TokenClass.con2('MULTIPL ICATIVE_OPERATOR', 11, 13); 1772 static final TokenClass MULTIPLICATIVE_OPERATOR = new TokenClass.con2('MULTIPL ICATIVE_OPERATOR', 11, 13);
1773
1653 /** 1774 /**
1654 * A value used to indicate that the token type is a relational operator. 1775 * A value used to indicate that the token type is a relational operator.
1655 */ 1776 */
1656 static final TokenClass RELATIONAL_OPERATOR = new TokenClass.con2('RELATIONAL_ OPERATOR', 12, 10); 1777 static final TokenClass RELATIONAL_OPERATOR = new TokenClass.con2('RELATIONAL_ OPERATOR', 12, 10);
1778
1657 /** 1779 /**
1658 * A value used to indicate that the token type is a shift operator. 1780 * A value used to indicate that the token type is a shift operator.
1659 */ 1781 */
1660 static final TokenClass SHIFT_OPERATOR = new TokenClass.con2('SHIFT_OPERATOR', 13, 11); 1782 static final TokenClass SHIFT_OPERATOR = new TokenClass.con2('SHIFT_OPERATOR', 13, 11);
1783
1661 /** 1784 /**
1662 * A value used to indicate that the token type is a unary operator. 1785 * A value used to indicate that the token type is a unary operator.
1663 */ 1786 */
1664 static final TokenClass UNARY_POSTFIX_OPERATOR = new TokenClass.con2('UNARY_PO STFIX_OPERATOR', 14, 15); 1787 static final TokenClass UNARY_POSTFIX_OPERATOR = new TokenClass.con2('UNARY_PO STFIX_OPERATOR', 14, 15);
1788
1665 /** 1789 /**
1666 * A value used to indicate that the token type is a unary operator. 1790 * A value used to indicate that the token type is a unary operator.
1667 */ 1791 */
1668 static final TokenClass UNARY_PREFIX_OPERATOR = new TokenClass.con2('UNARY_PRE FIX_OPERATOR', 15, 14); 1792 static final TokenClass UNARY_PREFIX_OPERATOR = new TokenClass.con2('UNARY_PRE FIX_OPERATOR', 15, 14);
1669 static final List<TokenClass> values = [NO_CLASS, ADDITIVE_OPERATOR, ASSIGNMEN T_OPERATOR, BITWISE_AND_OPERATOR, BITWISE_OR_OPERATOR, BITWISE_XOR_OPERATOR, CAS CADE_OPERATOR, CONDITIONAL_OPERATOR, EQUALITY_OPERATOR, LOGICAL_AND_OPERATOR, LO GICAL_OR_OPERATOR, MULTIPLICATIVE_OPERATOR, RELATIONAL_OPERATOR, SHIFT_OPERATOR, UNARY_POSTFIX_OPERATOR, UNARY_PREFIX_OPERATOR]; 1793 static final List<TokenClass> values = [NO_CLASS, ADDITIVE_OPERATOR, ASSIGNMEN T_OPERATOR, BITWISE_AND_OPERATOR, BITWISE_OR_OPERATOR, BITWISE_XOR_OPERATOR, CAS CADE_OPERATOR, CONDITIONAL_OPERATOR, EQUALITY_OPERATOR, LOGICAL_AND_OPERATOR, LO GICAL_OR_OPERATOR, MULTIPLICATIVE_OPERATOR, RELATIONAL_OPERATOR, SHIFT_OPERATOR, UNARY_POSTFIX_OPERATOR, UNARY_PREFIX_OPERATOR];
1670 String __name; 1794
1671 int __ordinal = 0; 1795 /// The name of this enum constant, as declared in the enum declaration.
1672 int get ordinal => __ordinal; 1796 final String name;
1797
1798 /// The position in the enum declaration.
1799 final int ordinal;
1800
1673 /** 1801 /**
1674 * The precedence of tokens of this class, or {@code 0} if the such tokens do not represent an 1802 * The precedence of tokens of this class, or {@code 0} if the such tokens do not represent an
1675 * operator. 1803 * operator.
1676 */ 1804 */
1677 int _precedence = 0; 1805 int _precedence = 0;
1678 TokenClass.con1(String ___name, int ___ordinal) { 1806 TokenClass.con1(this.name, this.ordinal) {
1679 _jtd_constructor_319_impl(___name, ___ordinal); 1807 _jtd_constructor_326_impl();
1680 } 1808 }
1681 _jtd_constructor_319_impl(String ___name, int ___ordinal) { 1809 _jtd_constructor_326_impl() {
1682 _jtd_constructor_320_impl(___name, ___ordinal, 0); 1810 _jtd_constructor_327_impl(0);
1683 } 1811 }
1684 TokenClass.con2(String ___name, int ___ordinal, int precedence2) { 1812 TokenClass.con2(this.name, this.ordinal, int precedence2) {
1685 _jtd_constructor_320_impl(___name, ___ordinal, precedence2); 1813 _jtd_constructor_327_impl(precedence2);
1686 } 1814 }
1687 _jtd_constructor_320_impl(String ___name, int ___ordinal, int precedence2) { 1815 _jtd_constructor_327_impl(int precedence2) {
1688 __name = ___name;
1689 __ordinal = ___ordinal;
1690 this._precedence = precedence2; 1816 this._precedence = precedence2;
1691 } 1817 }
1818
1692 /** 1819 /**
1693 * Return the precedence of tokens of this class, or {@code 0} if the such tok ens do not represent 1820 * Return the precedence of tokens of this class, or {@code 0} if the such tok ens do not represent
1694 * an operator. 1821 * an operator.
1695 * @return the precedence of tokens of this class 1822 * @return the precedence of tokens of this class
1696 */ 1823 */
1697 int get precedence => _precedence; 1824 int get precedence => _precedence;
1698 int compareTo(TokenClass other) => __ordinal - other.__ordinal; 1825 int compareTo(TokenClass other) => ordinal - other.ordinal;
1699 String toString() => __name; 1826 String toString() => name;
1700 } 1827 }
1828
1701 /** 1829 /**
1702 * Instances of the class {@code KeywordTokenWithComment} implement a keyword to ken that is preceded 1830 * Instances of the class {@code KeywordTokenWithComment} implement a keyword to ken that is preceded
1703 * by comments. 1831 * by comments.
1704 * @coverage dart.engine.parser 1832 * @coverage dart.engine.parser
1705 */ 1833 */
1706 class KeywordTokenWithComment extends KeywordToken { 1834 class KeywordTokenWithComment extends KeywordToken {
1835
1707 /** 1836 /**
1708 * The first comment in the list of comments that precede this token. 1837 * The first comment in the list of comments that precede this token.
1709 */ 1838 */
1710 Token _precedingComment; 1839 Token _precedingComment;
1840
1711 /** 1841 /**
1712 * Initialize a newly created token to to represent the given keyword and to b e preceded by the 1842 * Initialize a newly created token to to represent the given keyword and to b e preceded by the
1713 * comments reachable from the given comment. 1843 * comments reachable from the given comment.
1714 * @param keyword the keyword being represented by this token 1844 * @param keyword the keyword being represented by this token
1715 * @param offset the offset from the beginning of the file to the first charac ter in the token 1845 * @param offset the offset from the beginning of the file to the first charac ter in the token
1716 * @param precedingComment the first comment in the list of comments that prec ede this token 1846 * @param precedingComment the first comment in the list of comments that prec ede this token
1717 */ 1847 */
1718 KeywordTokenWithComment(Keyword keyword, int offset, Token precedingComment) : super(keyword, offset) { 1848 KeywordTokenWithComment(Keyword keyword, int offset, Token precedingComment) : super(keyword, offset) {
1719 this._precedingComment = precedingComment; 1849 this._precedingComment = precedingComment;
1720 } 1850 }
1721 Token get precedingComments => _precedingComment; 1851 Token get precedingComments => _precedingComment;
1722 } 1852 }
1853
1723 /** 1854 /**
1724 * The enumeration {@code TokenType} defines the types of tokens that can be ret urned by the 1855 * The enumeration {@code TokenType} defines the types of tokens that can be ret urned by the
1725 * scanner. 1856 * scanner.
1726 * @coverage dart.engine.parser 1857 * @coverage dart.engine.parser
1727 */ 1858 */
1728 class TokenType implements Comparable<TokenType> { 1859 class TokenType implements Comparable<TokenType> {
1860
1729 /** 1861 /**
1730 * The type of the token that marks the end of the input. 1862 * The type of the token that marks the end of the input.
1731 */ 1863 */
1732 static final TokenType EOF = new TokenType_EOF('EOF', 0, null, ""); 1864 static final TokenType EOF = new TokenType_EOF('EOF', 0, null, "");
1733 static final TokenType DOUBLE = new TokenType.con1('DOUBLE', 1); 1865 static final TokenType DOUBLE = new TokenType.con1('DOUBLE', 1);
1734 static final TokenType HEXADECIMAL = new TokenType.con1('HEXADECIMAL', 2); 1866 static final TokenType HEXADECIMAL = new TokenType.con1('HEXADECIMAL', 2);
1735 static final TokenType IDENTIFIER = new TokenType.con1('IDENTIFIER', 3); 1867 static final TokenType IDENTIFIER = new TokenType.con1('IDENTIFIER', 3);
1736 static final TokenType INT = new TokenType.con1('INT', 4); 1868 static final TokenType INT = new TokenType.con1('INT', 4);
1737 static final TokenType KEYWORD = new TokenType.con1('KEYWORD', 5); 1869 static final TokenType KEYWORD = new TokenType.con1('KEYWORD', 5);
1738 static final TokenType MULTI_LINE_COMMENT = new TokenType.con1('MULTI_LINE_COM MENT', 6); 1870 static final TokenType MULTI_LINE_COMMENT = new TokenType.con1('MULTI_LINE_COM MENT', 6);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1791 static final TokenType STAR_EQ = new TokenType.con2('STAR_EQ', 59, TokenClass. ASSIGNMENT_OPERATOR, "*="); 1923 static final TokenType STAR_EQ = new TokenType.con2('STAR_EQ', 59, TokenClass. ASSIGNMENT_OPERATOR, "*=");
1792 static final TokenType STRING_INTERPOLATION_EXPRESSION = new TokenType.con2('S TRING_INTERPOLATION_EXPRESSION', 60, null, "\${"); 1924 static final TokenType STRING_INTERPOLATION_EXPRESSION = new TokenType.con2('S TRING_INTERPOLATION_EXPRESSION', 60, null, "\${");
1793 static final TokenType STRING_INTERPOLATION_IDENTIFIER = new TokenType.con2('S TRING_INTERPOLATION_IDENTIFIER', 61, null, "\$"); 1925 static final TokenType STRING_INTERPOLATION_IDENTIFIER = new TokenType.con2('S TRING_INTERPOLATION_IDENTIFIER', 61, null, "\$");
1794 static final TokenType TILDE = new TokenType.con2('TILDE', 62, TokenClass.UNAR Y_PREFIX_OPERATOR, "~"); 1926 static final TokenType TILDE = new TokenType.con2('TILDE', 62, TokenClass.UNAR Y_PREFIX_OPERATOR, "~");
1795 static final TokenType TILDE_SLASH = new TokenType.con2('TILDE_SLASH', 63, Tok enClass.MULTIPLICATIVE_OPERATOR, "~/"); 1927 static final TokenType TILDE_SLASH = new TokenType.con2('TILDE_SLASH', 63, Tok enClass.MULTIPLICATIVE_OPERATOR, "~/");
1796 static final TokenType TILDE_SLASH_EQ = new TokenType.con2('TILDE_SLASH_EQ', 6 4, TokenClass.ASSIGNMENT_OPERATOR, "~/="); 1928 static final TokenType TILDE_SLASH_EQ = new TokenType.con2('TILDE_SLASH_EQ', 6 4, TokenClass.ASSIGNMENT_OPERATOR, "~/=");
1797 static final TokenType BACKPING = new TokenType.con2('BACKPING', 65, null, "`" ); 1929 static final TokenType BACKPING = new TokenType.con2('BACKPING', 65, null, "`" );
1798 static final TokenType BACKSLASH = new TokenType.con2('BACKSLASH', 66, null, " \\"); 1930 static final TokenType BACKSLASH = new TokenType.con2('BACKSLASH', 66, null, " \\");
1799 static final TokenType PERIOD_PERIOD_PERIOD = new TokenType.con2('PERIOD_PERIO D_PERIOD', 67, null, "..."); 1931 static final TokenType PERIOD_PERIOD_PERIOD = new TokenType.con2('PERIOD_PERIO D_PERIOD', 67, null, "...");
1800 static final List<TokenType> values = [EOF, DOUBLE, HEXADECIMAL, IDENTIFIER, I NT, KEYWORD, MULTI_LINE_COMMENT, SCRIPT_TAG, SINGLE_LINE_COMMENT, STRING, AMPERS AND, AMPERSAND_AMPERSAND, AMPERSAND_EQ, AT, BANG, BANG_EQ, BAR, BAR_BAR, BAR_EQ, COLON, COMMA, CARET, CARET_EQ, CLOSE_CURLY_BRACKET, CLOSE_PAREN, CLOSE_SQUARE_B RACKET, EQ, EQ_EQ, FUNCTION, GT, GT_EQ, GT_GT, GT_GT_EQ, HASH, INDEX, INDEX_EQ, IS, LT, LT_EQ, LT_LT, LT_LT_EQ, MINUS, MINUS_EQ, MINUS_MINUS, OPEN_CURLY_BRACKET , OPEN_PAREN, OPEN_SQUARE_BRACKET, PERCENT, PERCENT_EQ, PERIOD, PERIOD_PERIOD, P LUS, PLUS_EQ, PLUS_PLUS, QUESTION, SEMICOLON, SLASH, SLASH_EQ, STAR, STAR_EQ, ST RING_INTERPOLATION_EXPRESSION, STRING_INTERPOLATION_IDENTIFIER, TILDE, TILDE_SLA SH, TILDE_SLASH_EQ, BACKPING, BACKSLASH, PERIOD_PERIOD_PERIOD]; 1932 static final List<TokenType> values = [EOF, DOUBLE, HEXADECIMAL, IDENTIFIER, I NT, KEYWORD, MULTI_LINE_COMMENT, SCRIPT_TAG, SINGLE_LINE_COMMENT, STRING, AMPERS AND, AMPERSAND_AMPERSAND, AMPERSAND_EQ, AT, BANG, BANG_EQ, BAR, BAR_BAR, BAR_EQ, COLON, COMMA, CARET, CARET_EQ, CLOSE_CURLY_BRACKET, CLOSE_PAREN, CLOSE_SQUARE_B RACKET, EQ, EQ_EQ, FUNCTION, GT, GT_EQ, GT_GT, GT_GT_EQ, HASH, INDEX, INDEX_EQ, IS, LT, LT_EQ, LT_LT, LT_LT_EQ, MINUS, MINUS_EQ, MINUS_MINUS, OPEN_CURLY_BRACKET , OPEN_PAREN, OPEN_SQUARE_BRACKET, PERCENT, PERCENT_EQ, PERIOD, PERIOD_PERIOD, P LUS, PLUS_EQ, PLUS_PLUS, QUESTION, SEMICOLON, SLASH, SLASH_EQ, STAR, STAR_EQ, ST RING_INTERPOLATION_EXPRESSION, STRING_INTERPOLATION_IDENTIFIER, TILDE, TILDE_SLA SH, TILDE_SLASH_EQ, BACKPING, BACKSLASH, PERIOD_PERIOD_PERIOD];
1801 String __name; 1933
1802 int __ordinal = 0; 1934 /// The name of this enum constant, as declared in the enum declaration.
1803 int get ordinal => __ordinal; 1935 final String name;
1936
1937 /// The position in the enum declaration.
1938 final int ordinal;
1939
1804 /** 1940 /**
1805 * The class of the token. 1941 * The class of the token.
1806 */ 1942 */
1807 TokenClass _tokenClass; 1943 TokenClass _tokenClass;
1944
1808 /** 1945 /**
1809 * The lexeme that defines this type of token, or {@code null} if there is mor e than one possible 1946 * The lexeme that defines this type of token, or {@code null} if there is mor e than one possible
1810 * lexeme for this type of token. 1947 * lexeme for this type of token.
1811 */ 1948 */
1812 String _lexeme; 1949 String _lexeme;
1813 TokenType.con1(String ___name, int ___ordinal) { 1950 TokenType.con1(this.name, this.ordinal) {
1814 _jtd_constructor_321_impl(___name, ___ordinal); 1951 _jtd_constructor_328_impl();
1815 } 1952 }
1816 _jtd_constructor_321_impl(String ___name, int ___ordinal) { 1953 _jtd_constructor_328_impl() {
1817 _jtd_constructor_322_impl(___name, ___ordinal, TokenClass.NO_CLASS, null); 1954 _jtd_constructor_329_impl(TokenClass.NO_CLASS, null);
1818 } 1955 }
1819 TokenType.con2(String ___name, int ___ordinal, TokenClass tokenClass2, String lexeme2) { 1956 TokenType.con2(this.name, this.ordinal, TokenClass tokenClass2, String lexeme2 ) {
1820 _jtd_constructor_322_impl(___name, ___ordinal, tokenClass2, lexeme2); 1957 _jtd_constructor_329_impl(tokenClass2, lexeme2);
1821 } 1958 }
1822 _jtd_constructor_322_impl(String ___name, int ___ordinal, TokenClass tokenClas s2, String lexeme2) { 1959 _jtd_constructor_329_impl(TokenClass tokenClass2, String lexeme2) {
1823 __name = ___name;
1824 __ordinal = ___ordinal;
1825 this._tokenClass = tokenClass2 == null ? TokenClass.NO_CLASS : tokenClass2; 1960 this._tokenClass = tokenClass2 == null ? TokenClass.NO_CLASS : tokenClass2;
1826 this._lexeme = lexeme2; 1961 this._lexeme = lexeme2;
1827 } 1962 }
1963
1828 /** 1964 /**
1829 * Return the lexeme that defines this type of token, or {@code null} if there is more than one 1965 * Return the lexeme that defines this type of token, or {@code null} if there is more than one
1830 * possible lexeme for this type of token. 1966 * possible lexeme for this type of token.
1831 * @return the lexeme that defines this type of token 1967 * @return the lexeme that defines this type of token
1832 */ 1968 */
1833 String get lexeme => _lexeme; 1969 String get lexeme => _lexeme;
1970
1834 /** 1971 /**
1835 * Return the precedence of the token, or {@code 0} if the token does not repr esent an operator. 1972 * Return the precedence of the token, or {@code 0} if the token does not repr esent an operator.
1836 * @return the precedence of the token 1973 * @return the precedence of the token
1837 */ 1974 */
1838 int get precedence => _tokenClass.precedence; 1975 int get precedence => _tokenClass.precedence;
1976
1839 /** 1977 /**
1840 * Return {@code true} if this type of token represents an additive operator. 1978 * Return {@code true} if this type of token represents an additive operator.
1841 * @return {@code true} if this type of token represents an additive operator 1979 * @return {@code true} if this type of token represents an additive operator
1842 */ 1980 */
1843 bool isAdditiveOperator() => identical(_tokenClass, TokenClass.ADDITIVE_OPERAT OR); 1981 bool isAdditiveOperator() => identical(_tokenClass, TokenClass.ADDITIVE_OPERAT OR);
1982
1844 /** 1983 /**
1845 * Return {@code true} if this type of token represents an assignment operator . 1984 * Return {@code true} if this type of token represents an assignment operator .
1846 * @return {@code true} if this type of token represents an assignment operato r 1985 * @return {@code true} if this type of token represents an assignment operato r
1847 */ 1986 */
1848 bool isAssignmentOperator() => identical(_tokenClass, TokenClass.ASSIGNMENT_OP ERATOR); 1987 bool isAssignmentOperator() => identical(_tokenClass, TokenClass.ASSIGNMENT_OP ERATOR);
1988
1849 /** 1989 /**
1850 * Return {@code true} if this type of token represents an associative operato r. An associative 1990 * Return {@code true} if this type of token represents an associative operato r. An associative
1851 * operator is an operator for which the following equality is true:{@code (a * b) * c == a * (b * c)}. In other words, if the result of applying the operator to 1991 * operator is an operator for which the following equality is true:{@code (a * b) * c == a * (b * c)}. In other words, if the result of applying the operator to
1852 * multiple operands does not depend on the order in which those applications occur. 1992 * multiple operands does not depend on the order in which those applications occur.
1853 * <p> 1993 * <p>
1854 * Note: This method considers the logical-and and logical-or operators to be associative, even 1994 * Note: This method considers the logical-and and logical-or operators to be associative, even
1855 * though the order in which the application of those operators can have an ef fect because 1995 * though the order in which the application of those operators can have an ef fect because
1856 * evaluation of the right-hand operand is conditional. 1996 * evaluation of the right-hand operand is conditional.
1857 * @return {@code true} if this type of token represents an associative operat or 1997 * @return {@code true} if this type of token represents an associative operat or
1858 */ 1998 */
1859 bool isAssociativeOperator() => identical(this, AMPERSAND) || identical(this, AMPERSAND_AMPERSAND) || identical(this, BAR) || identical(this, BAR_BAR) || iden tical(this, CARET) || identical(this, PLUS) || identical(this, STAR); 1999 bool isAssociativeOperator() => identical(this, AMPERSAND) || identical(this, AMPERSAND_AMPERSAND) || identical(this, BAR) || identical(this, BAR_BAR) || iden tical(this, CARET) || identical(this, PLUS) || identical(this, STAR);
2000
1860 /** 2001 /**
1861 * Return {@code true} if this type of token represents an equality operator. 2002 * Return {@code true} if this type of token represents an equality operator.
1862 * @return {@code true} if this type of token represents an equality operator 2003 * @return {@code true} if this type of token represents an equality operator
1863 */ 2004 */
1864 bool isEqualityOperator() => identical(_tokenClass, TokenClass.EQUALITY_OPERAT OR); 2005 bool isEqualityOperator() => identical(_tokenClass, TokenClass.EQUALITY_OPERAT OR);
2006
1865 /** 2007 /**
1866 * Return {@code true} if this type of token represents an increment operator. 2008 * Return {@code true} if this type of token represents an increment operator.
1867 * @return {@code true} if this type of token represents an increment operator 2009 * @return {@code true} if this type of token represents an increment operator
1868 */ 2010 */
1869 bool isIncrementOperator() => identical(_lexeme, "++") || identical(_lexeme, " --"); 2011 bool isIncrementOperator() => identical(_lexeme, "++") || identical(_lexeme, " --");
2012
1870 /** 2013 /**
1871 * Return {@code true} if this type of token represents a multiplicative opera tor. 2014 * Return {@code true} if this type of token represents a multiplicative opera tor.
1872 * @return {@code true} if this type of token represents a multiplicative oper ator 2015 * @return {@code true} if this type of token represents a multiplicative oper ator
1873 */ 2016 */
1874 bool isMultiplicativeOperator() => identical(_tokenClass, TokenClass.MULTIPLIC ATIVE_OPERATOR); 2017 bool isMultiplicativeOperator() => identical(_tokenClass, TokenClass.MULTIPLIC ATIVE_OPERATOR);
2018
1875 /** 2019 /**
1876 * Return {@code true} if this token type represents an operator. 2020 * Return {@code true} if this token type represents an operator.
1877 * @return {@code true} if this token type represents an operator 2021 * @return {@code true} if this token type represents an operator
1878 */ 2022 */
1879 bool isOperator() => _tokenClass != TokenClass.NO_CLASS && this != OPEN_PAREN && this != OPEN_SQUARE_BRACKET && this != PERIOD; 2023 bool isOperator() => _tokenClass != TokenClass.NO_CLASS && this != OPEN_PAREN && this != OPEN_SQUARE_BRACKET && this != PERIOD;
2024
1880 /** 2025 /**
1881 * Return {@code true} if this type of token represents a relational operator. 2026 * Return {@code true} if this type of token represents a relational operator.
1882 * @return {@code true} if this type of token represents a relational operator 2027 * @return {@code true} if this type of token represents a relational operator
1883 */ 2028 */
1884 bool isRelationalOperator() => identical(_tokenClass, TokenClass.RELATIONAL_OP ERATOR); 2029 bool isRelationalOperator() => identical(_tokenClass, TokenClass.RELATIONAL_OP ERATOR);
2030
1885 /** 2031 /**
1886 * Return {@code true} if this type of token represents a shift operator. 2032 * Return {@code true} if this type of token represents a shift operator.
1887 * @return {@code true} if this type of token represents a shift operator 2033 * @return {@code true} if this type of token represents a shift operator
1888 */ 2034 */
1889 bool isShiftOperator() => identical(_tokenClass, TokenClass.SHIFT_OPERATOR); 2035 bool isShiftOperator() => identical(_tokenClass, TokenClass.SHIFT_OPERATOR);
2036
1890 /** 2037 /**
1891 * Return {@code true} if this type of token represents a unary postfix operat or. 2038 * Return {@code true} if this type of token represents a unary postfix operat or.
1892 * @return {@code true} if this type of token represents a unary postfix opera tor 2039 * @return {@code true} if this type of token represents a unary postfix opera tor
1893 */ 2040 */
1894 bool isUnaryPostfixOperator() => identical(_tokenClass, TokenClass.UNARY_POSTF IX_OPERATOR); 2041 bool isUnaryPostfixOperator() => identical(_tokenClass, TokenClass.UNARY_POSTF IX_OPERATOR);
2042
1895 /** 2043 /**
1896 * Return {@code true} if this type of token represents a unary prefix operato r. 2044 * Return {@code true} if this type of token represents a unary prefix operato r.
1897 * @return {@code true} if this type of token represents a unary prefix operat or 2045 * @return {@code true} if this type of token represents a unary prefix operat or
1898 */ 2046 */
1899 bool isUnaryPrefixOperator() => identical(_tokenClass, TokenClass.UNARY_PREFIX _OPERATOR); 2047 bool isUnaryPrefixOperator() => identical(_tokenClass, TokenClass.UNARY_PREFIX _OPERATOR);
2048
1900 /** 2049 /**
1901 * Return {@code true} if this token type represents an operator that can be d efined by users. 2050 * Return {@code true} if this token type represents an operator that can be d efined by users.
1902 * @return {@code true} if this token type represents an operator that can be defined by users 2051 * @return {@code true} if this token type represents an operator that can be defined by users
1903 */ 2052 */
1904 bool isUserDefinableOperator() => identical(_lexeme, "==") || identical(_lexem e, "~") || identical(_lexeme, "[]") || identical(_lexeme, "[]=") || identical(_l exeme, "*") || identical(_lexeme, "/") || identical(_lexeme, "%") || identical(_ lexeme, "~/") || identical(_lexeme, "+") || identical(_lexeme, "-") || identical (_lexeme, "<<") || identical(_lexeme, ">>") || identical(_lexeme, ">=") || ident ical(_lexeme, ">") || identical(_lexeme, "<=") || identical(_lexeme, "<") || ide ntical(_lexeme, "&") || identical(_lexeme, "^") || identical(_lexeme, "|"); 2053 bool isUserDefinableOperator() => identical(_lexeme, "==") || identical(_lexem e, "~") || identical(_lexeme, "[]") || identical(_lexeme, "[]=") || identical(_l exeme, "*") || identical(_lexeme, "/") || identical(_lexeme, "%") || identical(_ lexeme, "~/") || identical(_lexeme, "+") || identical(_lexeme, "-") || identical (_lexeme, "<<") || identical(_lexeme, ">>") || identical(_lexeme, ">=") || ident ical(_lexeme, ">") || identical(_lexeme, "<=") || identical(_lexeme, "<") || ide ntical(_lexeme, "&") || identical(_lexeme, "^") || identical(_lexeme, "|");
1905 int compareTo(TokenType other) => __ordinal - other.__ordinal; 2054 int compareTo(TokenType other) => ordinal - other.ordinal;
1906 String toString() => __name; 2055 String toString() => name;
1907 } 2056 }
1908 class TokenType_EOF extends TokenType { 2057 class TokenType_EOF extends TokenType {
1909 TokenType_EOF(String ___name, int ___ordinal, TokenClass arg0, String arg1) : super.con2(___name, ___ordinal, arg0, arg1); 2058 TokenType_EOF(String name, int ordinal, TokenClass arg0, String arg1) : super. con2(name, ordinal, arg0, arg1);
1910 String toString() => "-eof-"; 2059 String toString() => "-eof-";
1911 } 2060 }
OLDNEW
« no previous file with comments | « pkg/analyzer_experimental/lib/src/generated/resolver.dart ('k') | pkg/analyzer_experimental/lib/src/generated/sdk.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698