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

Side by Side Diff: pkg/front_end/lib/src/fasta/scanner/precedence.dart

Issue 2749033003: fasta.Token implement analyzer.Token.isOperator (Closed)
Patch Set: merge Created 3 years, 9 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
« no previous file with comments | « no previous file | pkg/front_end/lib/src/fasta/scanner/token.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library fasta.scanner.precedence; 5 library fasta.scanner.precedence;
6 6
7 import 'token_constants.dart'; 7 import 'token_constants.dart';
8 8
9 class PrecedenceInfo { 9 class PrecedenceInfo {
10 final String value; 10 final String value;
11 final int precedence; 11 final int precedence;
12 final int kind; 12 final int kind;
13 final bool isOperator;
13 14
14 const PrecedenceInfo(this.value, this.precedence, this.kind); 15 const PrecedenceInfo(this.value, this.precedence, this.kind,
16 {this.isOperator: false});
15 17
16 toString() => 'PrecedenceInfo($value, $precedence, $kind)'; 18 toString() => 'PrecedenceInfo($value, $precedence, $kind)';
17 19
18 static const List<PrecedenceInfo> all = const <PrecedenceInfo>[ 20 static const List<PrecedenceInfo> all = const <PrecedenceInfo>[
19 BACKPING_INFO, 21 BACKPING_INFO,
20 BACKSLASH_INFO, 22 BACKSLASH_INFO,
21 PERIOD_PERIOD_PERIOD_INFO, 23 PERIOD_PERIOD_PERIOD_INFO,
22 PERIOD_PERIOD_INFO, 24 PERIOD_PERIOD_INFO,
23 BANG_INFO, 25 BANG_INFO,
24 COLON_INFO, 26 COLON_INFO,
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 const PrecedenceInfo BACKSLASH_INFO = 100 const PrecedenceInfo BACKSLASH_INFO =
99 const PrecedenceInfo('\\', 0, BACKSLASH_TOKEN); 101 const PrecedenceInfo('\\', 0, BACKSLASH_TOKEN);
100 const PrecedenceInfo PERIOD_PERIOD_PERIOD_INFO = 102 const PrecedenceInfo PERIOD_PERIOD_PERIOD_INFO =
101 const PrecedenceInfo('...', 0, PERIOD_PERIOD_PERIOD_TOKEN); 103 const PrecedenceInfo('...', 0, PERIOD_PERIOD_PERIOD_TOKEN);
102 104
103 /** 105 /**
104 * The cascade operator has the lowest precedence of any operator 106 * The cascade operator has the lowest precedence of any operator
105 * except assignment. 107 * except assignment.
106 */ 108 */
107 const int CASCADE_PRECEDENCE = 2; 109 const int CASCADE_PRECEDENCE = 2;
108 const PrecedenceInfo PERIOD_PERIOD_INFO = 110 const PrecedenceInfo PERIOD_PERIOD_INFO = const PrecedenceInfo(
109 const PrecedenceInfo('..', CASCADE_PRECEDENCE, PERIOD_PERIOD_TOKEN); 111 '..', CASCADE_PRECEDENCE, PERIOD_PERIOD_TOKEN,
112 isOperator: true);
ahe 2017/03/15 14:54:25 Are you sure about that? Isn't an operator someth
110 113
111 const PrecedenceInfo BANG_INFO = const PrecedenceInfo('!', 0, BANG_TOKEN); 114 const PrecedenceInfo BANG_INFO =
115 const PrecedenceInfo('!', 0, BANG_TOKEN, isOperator: true);
112 const PrecedenceInfo COLON_INFO = const PrecedenceInfo(':', 0, COLON_TOKEN); 116 const PrecedenceInfo COLON_INFO = const PrecedenceInfo(':', 0, COLON_TOKEN);
113 const PrecedenceInfo INDEX_INFO = const PrecedenceInfo('[]', 0, INDEX_TOKEN); 117 const PrecedenceInfo INDEX_INFO =
114 const PrecedenceInfo MINUS_MINUS_INFO = 118 const PrecedenceInfo('[]', 0, INDEX_TOKEN, isOperator: true);
115 const PrecedenceInfo('--', POSTFIX_PRECEDENCE, MINUS_MINUS_TOKEN); 119 const PrecedenceInfo MINUS_MINUS_INFO = const PrecedenceInfo(
116 const PrecedenceInfo PLUS_PLUS_INFO = 120 '--', POSTFIX_PRECEDENCE, MINUS_MINUS_TOKEN,
117 const PrecedenceInfo('++', POSTFIX_PRECEDENCE, PLUS_PLUS_TOKEN); 121 isOperator: true);
118 const PrecedenceInfo TILDE_INFO = const PrecedenceInfo('~', 0, TILDE_TOKEN); 122 const PrecedenceInfo PLUS_PLUS_INFO = const PrecedenceInfo(
123 '++', POSTFIX_PRECEDENCE, PLUS_PLUS_TOKEN,
124 isOperator: true);
125 const PrecedenceInfo TILDE_INFO =
126 const PrecedenceInfo('~', 0, TILDE_TOKEN, isOperator: true);
119 127
120 const PrecedenceInfo FUNCTION_INFO = 128 const PrecedenceInfo FUNCTION_INFO =
121 const PrecedenceInfo('=>', 0, FUNCTION_TOKEN); 129 const PrecedenceInfo('=>', 0, FUNCTION_TOKEN);
122 const PrecedenceInfo HASH_INFO = const PrecedenceInfo('#', 0, HASH_TOKEN); 130 const PrecedenceInfo HASH_INFO = const PrecedenceInfo('#', 0, HASH_TOKEN);
123 const PrecedenceInfo INDEX_EQ_INFO = 131 const PrecedenceInfo INDEX_EQ_INFO =
124 const PrecedenceInfo('[]=', 0, INDEX_EQ_TOKEN); 132 const PrecedenceInfo('[]=', 0, INDEX_EQ_TOKEN, isOperator: true);
125 const PrecedenceInfo SEMICOLON_INFO = 133 const PrecedenceInfo SEMICOLON_INFO =
126 const PrecedenceInfo(';', 0, SEMICOLON_TOKEN); 134 const PrecedenceInfo(';', 0, SEMICOLON_TOKEN);
127 const PrecedenceInfo COMMA_INFO = const PrecedenceInfo(',', 0, COMMA_TOKEN); 135 const PrecedenceInfo COMMA_INFO = const PrecedenceInfo(',', 0, COMMA_TOKEN);
128 136
129 const PrecedenceInfo AT_INFO = const PrecedenceInfo('@', 0, AT_TOKEN); 137 const PrecedenceInfo AT_INFO = const PrecedenceInfo('@', 0, AT_TOKEN);
130 138
131 // Assignment operators. 139 // Assignment operators.
132 const int ASSIGNMENT_PRECEDENCE = 1; 140 const int ASSIGNMENT_PRECEDENCE = 1;
133 const PrecedenceInfo AMPERSAND_EQ_INFO = 141 const PrecedenceInfo AMPERSAND_EQ_INFO = const PrecedenceInfo(
134 const PrecedenceInfo('&=', ASSIGNMENT_PRECEDENCE, AMPERSAND_EQ_TOKEN); 142 '&=', ASSIGNMENT_PRECEDENCE, AMPERSAND_EQ_TOKEN,
135 const PrecedenceInfo BAR_EQ_INFO = 143 isOperator: true);
136 const PrecedenceInfo('|=', ASSIGNMENT_PRECEDENCE, BAR_EQ_TOKEN); 144 const PrecedenceInfo BAR_EQ_INFO = const PrecedenceInfo(
137 const PrecedenceInfo CARET_EQ_INFO = 145 '|=', ASSIGNMENT_PRECEDENCE, BAR_EQ_TOKEN,
138 const PrecedenceInfo('^=', ASSIGNMENT_PRECEDENCE, CARET_EQ_TOKEN); 146 isOperator: true);
139 const PrecedenceInfo EQ_INFO = 147 const PrecedenceInfo CARET_EQ_INFO = const PrecedenceInfo(
140 const PrecedenceInfo('=', ASSIGNMENT_PRECEDENCE, EQ_TOKEN); 148 '^=', ASSIGNMENT_PRECEDENCE, CARET_EQ_TOKEN,
141 const PrecedenceInfo GT_GT_EQ_INFO = 149 isOperator: true);
142 const PrecedenceInfo('>>=', ASSIGNMENT_PRECEDENCE, GT_GT_EQ_TOKEN); 150 const PrecedenceInfo EQ_INFO = const PrecedenceInfo(
143 const PrecedenceInfo LT_LT_EQ_INFO = 151 '=', ASSIGNMENT_PRECEDENCE, EQ_TOKEN,
144 const PrecedenceInfo('<<=', ASSIGNMENT_PRECEDENCE, LT_LT_EQ_TOKEN); 152 isOperator: true);
145 const PrecedenceInfo MINUS_EQ_INFO = 153 const PrecedenceInfo GT_GT_EQ_INFO = const PrecedenceInfo(
146 const PrecedenceInfo('-=', ASSIGNMENT_PRECEDENCE, MINUS_EQ_TOKEN); 154 '>>=', ASSIGNMENT_PRECEDENCE, GT_GT_EQ_TOKEN,
147 const PrecedenceInfo PERCENT_EQ_INFO = 155 isOperator: true);
148 const PrecedenceInfo('%=', ASSIGNMENT_PRECEDENCE, PERCENT_EQ_TOKEN); 156 const PrecedenceInfo LT_LT_EQ_INFO = const PrecedenceInfo(
149 const PrecedenceInfo PLUS_EQ_INFO = 157 '<<=', ASSIGNMENT_PRECEDENCE, LT_LT_EQ_TOKEN,
150 const PrecedenceInfo('+=', ASSIGNMENT_PRECEDENCE, PLUS_EQ_TOKEN); 158 isOperator: true);
151 const PrecedenceInfo SLASH_EQ_INFO = 159 const PrecedenceInfo MINUS_EQ_INFO = const PrecedenceInfo(
152 const PrecedenceInfo('/=', ASSIGNMENT_PRECEDENCE, SLASH_EQ_TOKEN); 160 '-=', ASSIGNMENT_PRECEDENCE, MINUS_EQ_TOKEN,
153 const PrecedenceInfo STAR_EQ_INFO = 161 isOperator: true);
154 const PrecedenceInfo('*=', ASSIGNMENT_PRECEDENCE, STAR_EQ_TOKEN); 162 const PrecedenceInfo PERCENT_EQ_INFO = const PrecedenceInfo(
155 const PrecedenceInfo TILDE_SLASH_EQ_INFO = 163 '%=', ASSIGNMENT_PRECEDENCE, PERCENT_EQ_TOKEN,
156 const PrecedenceInfo('~/=', ASSIGNMENT_PRECEDENCE, TILDE_SLASH_EQ_TOKEN); 164 isOperator: true);
165 const PrecedenceInfo PLUS_EQ_INFO = const PrecedenceInfo(
166 '+=', ASSIGNMENT_PRECEDENCE, PLUS_EQ_TOKEN,
167 isOperator: true);
168 const PrecedenceInfo SLASH_EQ_INFO = const PrecedenceInfo(
169 '/=', ASSIGNMENT_PRECEDENCE, SLASH_EQ_TOKEN,
170 isOperator: true);
171 const PrecedenceInfo STAR_EQ_INFO = const PrecedenceInfo(
172 '*=', ASSIGNMENT_PRECEDENCE, STAR_EQ_TOKEN,
173 isOperator: true);
174 const PrecedenceInfo TILDE_SLASH_EQ_INFO = const PrecedenceInfo(
175 '~/=', ASSIGNMENT_PRECEDENCE, TILDE_SLASH_EQ_TOKEN,
176 isOperator: true);
157 const PrecedenceInfo QUESTION_QUESTION_EQ_INFO = const PrecedenceInfo( 177 const PrecedenceInfo QUESTION_QUESTION_EQ_INFO = const PrecedenceInfo(
158 '??=', ASSIGNMENT_PRECEDENCE, QUESTION_QUESTION_EQ_TOKEN); 178 '??=', ASSIGNMENT_PRECEDENCE, QUESTION_QUESTION_EQ_TOKEN,
179 isOperator: true);
159 180
160 const PrecedenceInfo QUESTION_INFO = 181 const PrecedenceInfo QUESTION_INFO =
161 const PrecedenceInfo('?', 3, QUESTION_TOKEN); 182 const PrecedenceInfo('?', 3, QUESTION_TOKEN, isOperator: true);
162 183
163 const PrecedenceInfo QUESTION_QUESTION_INFO = 184 const PrecedenceInfo QUESTION_QUESTION_INFO =
164 const PrecedenceInfo('??', 4, QUESTION_QUESTION_TOKEN); 185 const PrecedenceInfo('??', 4, QUESTION_QUESTION_TOKEN, isOperator: true);
165 186
166 const PrecedenceInfo BAR_BAR_INFO = 187 const PrecedenceInfo BAR_BAR_INFO =
167 const PrecedenceInfo('||', 5, BAR_BAR_TOKEN); 188 const PrecedenceInfo('||', 5, BAR_BAR_TOKEN, isOperator: true);
168 189
169 const PrecedenceInfo AMPERSAND_AMPERSAND_INFO = 190 const PrecedenceInfo AMPERSAND_AMPERSAND_INFO =
170 const PrecedenceInfo('&&', 6, AMPERSAND_AMPERSAND_TOKEN); 191 const PrecedenceInfo('&&', 6, AMPERSAND_AMPERSAND_TOKEN, isOperator: true);
171 192
172 const PrecedenceInfo BAR_INFO = const PrecedenceInfo('|', 9, BAR_TOKEN); 193 const PrecedenceInfo BAR_INFO =
194 const PrecedenceInfo('|', 9, BAR_TOKEN, isOperator: true);
173 195
174 const PrecedenceInfo CARET_INFO = const PrecedenceInfo('^', 10, CARET_TOKEN); 196 const PrecedenceInfo CARET_INFO =
197 const PrecedenceInfo('^', 10, CARET_TOKEN, isOperator: true);
175 198
176 const PrecedenceInfo AMPERSAND_INFO = 199 const PrecedenceInfo AMPERSAND_INFO =
177 const PrecedenceInfo('&', 11, AMPERSAND_TOKEN); 200 const PrecedenceInfo('&', 11, AMPERSAND_TOKEN, isOperator: true);
178 201
179 // Equality operators. 202 // Equality operators.
180 const int EQUALITY_PRECEDENCE = 7; 203 const int EQUALITY_PRECEDENCE = 7;
181 const PrecedenceInfo BANG_EQ_EQ_INFO = 204 const PrecedenceInfo BANG_EQ_EQ_INFO =
182 const PrecedenceInfo('!==', EQUALITY_PRECEDENCE, BANG_EQ_EQ_TOKEN); 205 const PrecedenceInfo('!==', EQUALITY_PRECEDENCE, BANG_EQ_EQ_TOKEN);
183 const PrecedenceInfo BANG_EQ_INFO = 206 const PrecedenceInfo BANG_EQ_INFO = const PrecedenceInfo(
184 const PrecedenceInfo('!=', EQUALITY_PRECEDENCE, BANG_EQ_TOKEN); 207 '!=', EQUALITY_PRECEDENCE, BANG_EQ_TOKEN,
208 isOperator: true);
185 const PrecedenceInfo EQ_EQ_EQ_INFO = 209 const PrecedenceInfo EQ_EQ_EQ_INFO =
186 const PrecedenceInfo('===', EQUALITY_PRECEDENCE, EQ_EQ_EQ_TOKEN); 210 const PrecedenceInfo('===', EQUALITY_PRECEDENCE, EQ_EQ_EQ_TOKEN);
187 const PrecedenceInfo EQ_EQ_INFO = 211 const PrecedenceInfo EQ_EQ_INFO = const PrecedenceInfo(
188 const PrecedenceInfo('==', EQUALITY_PRECEDENCE, EQ_EQ_TOKEN); 212 '==', EQUALITY_PRECEDENCE, EQ_EQ_TOKEN,
213 isOperator: true);
189 214
190 // Relational operators. 215 // Relational operators.
191 const int RELATIONAL_PRECEDENCE = 8; 216 const int RELATIONAL_PRECEDENCE = 8;
192 const PrecedenceInfo GT_EQ_INFO = 217 const PrecedenceInfo GT_EQ_INFO = const PrecedenceInfo(
193 const PrecedenceInfo('>=', RELATIONAL_PRECEDENCE, GT_EQ_TOKEN); 218 '>=', RELATIONAL_PRECEDENCE, GT_EQ_TOKEN,
194 const PrecedenceInfo GT_INFO = 219 isOperator: true);
195 const PrecedenceInfo('>', RELATIONAL_PRECEDENCE, GT_TOKEN); 220 const PrecedenceInfo GT_INFO = const PrecedenceInfo(
221 '>', RELATIONAL_PRECEDENCE, GT_TOKEN,
222 isOperator: true);
196 const PrecedenceInfo IS_INFO = 223 const PrecedenceInfo IS_INFO =
197 const PrecedenceInfo('is', RELATIONAL_PRECEDENCE, KEYWORD_TOKEN); 224 const PrecedenceInfo('is', RELATIONAL_PRECEDENCE, KEYWORD_TOKEN);
198 const PrecedenceInfo AS_INFO = 225 const PrecedenceInfo AS_INFO =
199 const PrecedenceInfo('as', RELATIONAL_PRECEDENCE, KEYWORD_TOKEN); 226 const PrecedenceInfo('as', RELATIONAL_PRECEDENCE, KEYWORD_TOKEN);
200 const PrecedenceInfo LT_EQ_INFO = 227 const PrecedenceInfo LT_EQ_INFO = const PrecedenceInfo(
201 const PrecedenceInfo('<=', RELATIONAL_PRECEDENCE, LT_EQ_TOKEN); 228 '<=', RELATIONAL_PRECEDENCE, LT_EQ_TOKEN,
202 const PrecedenceInfo LT_INFO = 229 isOperator: true);
203 const PrecedenceInfo('<', RELATIONAL_PRECEDENCE, LT_TOKEN); 230 const PrecedenceInfo LT_INFO = const PrecedenceInfo(
231 '<', RELATIONAL_PRECEDENCE, LT_TOKEN,
232 isOperator: true);
204 233
205 // Shift operators. 234 // Shift operators.
206 const PrecedenceInfo GT_GT_INFO = const PrecedenceInfo('>>', 12, GT_GT_TOKEN); 235 const PrecedenceInfo GT_GT_INFO =
207 const PrecedenceInfo LT_LT_INFO = const PrecedenceInfo('<<', 12, LT_LT_TOKEN); 236 const PrecedenceInfo('>>', 12, GT_GT_TOKEN, isOperator: true);
237 const PrecedenceInfo LT_LT_INFO =
238 const PrecedenceInfo('<<', 12, LT_LT_TOKEN, isOperator: true);
208 239
209 // Additive operators. 240 // Additive operators.
210 const PrecedenceInfo MINUS_INFO = const PrecedenceInfo('-', 13, MINUS_TOKEN); 241 const PrecedenceInfo MINUS_INFO =
211 const PrecedenceInfo PLUS_INFO = const PrecedenceInfo('+', 13, PLUS_TOKEN); 242 const PrecedenceInfo('-', 13, MINUS_TOKEN, isOperator: true);
243 const PrecedenceInfo PLUS_INFO =
244 const PrecedenceInfo('+', 13, PLUS_TOKEN, isOperator: true);
212 245
213 // Multiplicative operators. 246 // Multiplicative operators.
214 const PrecedenceInfo PERCENT_INFO = 247 const PrecedenceInfo PERCENT_INFO =
215 const PrecedenceInfo('%', 14, PERCENT_TOKEN); 248 const PrecedenceInfo('%', 14, PERCENT_TOKEN, isOperator: true);
216 const PrecedenceInfo SLASH_INFO = const PrecedenceInfo('/', 14, SLASH_TOKEN); 249 const PrecedenceInfo SLASH_INFO =
217 const PrecedenceInfo STAR_INFO = const PrecedenceInfo('*', 14, STAR_TOKEN); 250 const PrecedenceInfo('/', 14, SLASH_TOKEN, isOperator: true);
251 const PrecedenceInfo STAR_INFO =
252 const PrecedenceInfo('*', 14, STAR_TOKEN, isOperator: true);
218 const PrecedenceInfo TILDE_SLASH_INFO = 253 const PrecedenceInfo TILDE_SLASH_INFO =
219 const PrecedenceInfo('~/', 14, TILDE_SLASH_TOKEN); 254 const PrecedenceInfo('~/', 14, TILDE_SLASH_TOKEN, isOperator: true);
220 255
221 const int POSTFIX_PRECEDENCE = 15; 256 const int POSTFIX_PRECEDENCE = 15;
222 const PrecedenceInfo PERIOD_INFO = 257 const PrecedenceInfo PERIOD_INFO =
223 const PrecedenceInfo('.', POSTFIX_PRECEDENCE, PERIOD_TOKEN); 258 const PrecedenceInfo('.', POSTFIX_PRECEDENCE, PERIOD_TOKEN);
224 const PrecedenceInfo QUESTION_PERIOD_INFO = 259 const PrecedenceInfo QUESTION_PERIOD_INFO = const PrecedenceInfo(
225 const PrecedenceInfo('?.', POSTFIX_PRECEDENCE, QUESTION_PERIOD_TOKEN); 260 '?.', POSTFIX_PRECEDENCE, QUESTION_PERIOD_TOKEN,
261 isOperator: true);
226 262
227 const PrecedenceInfo KEYWORD_INFO = 263 const PrecedenceInfo KEYWORD_INFO =
228 const PrecedenceInfo('keyword', 0, KEYWORD_TOKEN); 264 const PrecedenceInfo('keyword', 0, KEYWORD_TOKEN);
229 265
230 const PrecedenceInfo EOF_INFO = const PrecedenceInfo('EOF', 0, EOF_TOKEN); 266 const PrecedenceInfo EOF_INFO = const PrecedenceInfo('EOF', 0, EOF_TOKEN);
231 267
232 /// Precedence info used by synthetic tokens that are created during parser 268 /// Precedence info used by synthetic tokens that are created during parser
233 /// recovery (non-analyzer use case). 269 /// recovery (non-analyzer use case).
234 const PrecedenceInfo RECOVERY_INFO = 270 const PrecedenceInfo RECOVERY_INFO =
235 const PrecedenceInfo('recovery', 0, RECOVERY_TOKEN); 271 const PrecedenceInfo('recovery', 0, RECOVERY_TOKEN);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 const PrecedenceInfo('\${', 0, STRING_INTERPOLATION_TOKEN); 309 const PrecedenceInfo('\${', 0, STRING_INTERPOLATION_TOKEN);
274 310
275 const PrecedenceInfo STRING_INTERPOLATION_IDENTIFIER_INFO = 311 const PrecedenceInfo STRING_INTERPOLATION_IDENTIFIER_INFO =
276 const PrecedenceInfo('\$', 0, STRING_INTERPOLATION_IDENTIFIER_TOKEN); 312 const PrecedenceInfo('\$', 0, STRING_INTERPOLATION_IDENTIFIER_TOKEN);
277 313
278 const PrecedenceInfo HEXADECIMAL_INFO = 314 const PrecedenceInfo HEXADECIMAL_INFO =
279 const PrecedenceInfo('hexadecimal', 0, HEXADECIMAL_TOKEN); 315 const PrecedenceInfo('hexadecimal', 0, HEXADECIMAL_TOKEN);
280 316
281 const PrecedenceInfo COMMENT_INFO = 317 const PrecedenceInfo COMMENT_INFO =
282 const PrecedenceInfo('comment', 0, COMMENT_TOKEN); 318 const PrecedenceInfo('comment', 0, COMMENT_TOKEN);
OLDNEW
« no previous file with comments | « no previous file | pkg/front_end/lib/src/fasta/scanner/token.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698