OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 dart2js.scanner.array_based; | 5 library dart2js.scanner.array_based; |
6 | 6 |
7 import '../io/source_file.dart' show | 7 import '../io/source_file.dart' show SourceFile; |
8 SourceFile; | 8 import '../tokens/keyword.dart' show Keyword; |
9 import '../tokens/keyword.dart' show | 9 import '../tokens/precedence.dart' show PrecedenceInfo; |
10 Keyword; | 10 import '../tokens/precedence_constants.dart' as Precedence |
11 import '../tokens/precedence.dart' show | 11 show COMMENT_INFO, EOF_INFO; |
12 PrecedenceInfo; | 12 import '../tokens/token.dart' |
13 import '../tokens/precedence_constants.dart' as Precedence show | 13 show BeginGroupToken, ErrorToken, KeywordToken, SymbolToken, Token; |
14 COMMENT_INFO, | 14 import '../tokens/token_constants.dart' as Tokens |
15 EOF_INFO; | 15 show LT_TOKEN, OPEN_CURLY_BRACKET_TOKEN, STRING_INTERPOLATION_TOKEN; |
16 import '../tokens/token.dart' show | 16 import '../util/characters.dart' show $LF, $STX; |
17 BeginGroupToken, | 17 import '../util/util.dart' show Link; |
18 ErrorToken, | |
19 KeywordToken, | |
20 SymbolToken, | |
21 Token; | |
22 import '../tokens/token_constants.dart' as Tokens show | |
23 LT_TOKEN, | |
24 OPEN_CURLY_BRACKET_TOKEN, | |
25 STRING_INTERPOLATION_TOKEN; | |
26 import '../util/characters.dart' show | |
27 $LF, | |
28 $STX; | |
29 import '../util/util.dart' show | |
30 Link; | |
31 | 18 |
32 import 'scanner.dart' show | 19 import 'scanner.dart' show AbstractScanner; |
33 AbstractScanner; | |
34 | 20 |
35 abstract class ArrayBasedScanner extends AbstractScanner { | 21 abstract class ArrayBasedScanner extends AbstractScanner { |
36 ArrayBasedScanner(SourceFile file, bool includeComments) | 22 ArrayBasedScanner(SourceFile file, bool includeComments) |
37 : super(file, includeComments); | 23 : super(file, includeComments); |
38 | 24 |
39 /** | 25 /** |
40 * The stack of open groups, e.g [: { ... ( .. :] | 26 * The stack of open groups, e.g [: { ... ( .. :] |
41 * Each BeginGroupToken has a pointer to the token where the group | 27 * Each BeginGroupToken has a pointer to the token where the group |
42 * ends. This field is set when scanning the end group token. | 28 * ends. This field is set when scanning the end group token. |
43 */ | 29 */ |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 assert(!identical(openKind, Tokens.LT_TOKEN)); // openKind is < for > and >> | 132 assert(!identical(openKind, Tokens.LT_TOKEN)); // openKind is < for > and >> |
147 discardBeginGroupUntil(openKind); | 133 discardBeginGroupUntil(openKind); |
148 appendPrecedenceToken(info); | 134 appendPrecedenceToken(info); |
149 Token close = tail; | 135 Token close = tail; |
150 if (groupingStack.isEmpty) { | 136 if (groupingStack.isEmpty) { |
151 return advance(); | 137 return advance(); |
152 } | 138 } |
153 BeginGroupToken begin = groupingStack.head; | 139 BeginGroupToken begin = groupingStack.head; |
154 if (!identical(begin.kind, openKind)) { | 140 if (!identical(begin.kind, openKind)) { |
155 assert(begin.kind == Tokens.STRING_INTERPOLATION_TOKEN && | 141 assert(begin.kind == Tokens.STRING_INTERPOLATION_TOKEN && |
156 openKind == Tokens.OPEN_CURLY_BRACKET_TOKEN); | 142 openKind == Tokens.OPEN_CURLY_BRACKET_TOKEN); |
157 // We're ending an interpolated expression. | 143 // We're ending an interpolated expression. |
158 begin.endGroup = close; | 144 begin.endGroup = close; |
159 groupingStack = groupingStack.tail; | 145 groupingStack = groupingStack.tail; |
160 // Using "start-of-text" to signal that we're back in string | 146 // Using "start-of-text" to signal that we're back in string |
161 // scanning mode. | 147 // scanning mode. |
162 return $STX; | 148 return $STX; |
163 } | 149 } |
164 begin.endGroup = close; | 150 begin.endGroup = close; |
165 groupingStack = groupingStack.tail; | 151 groupingStack = groupingStack.tail; |
166 return advance(); | 152 return advance(); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 * | 219 * |
234 * [PartialParser.skipExpression] relies on the fact that we do not | 220 * [PartialParser.skipExpression] relies on the fact that we do not |
235 * create groups for stuff like: | 221 * create groups for stuff like: |
236 * [:a = b < c, d = e > f:]. | 222 * [:a = b < c, d = e > f:]. |
237 * | 223 * |
238 * In other words, this method is called when the scanner recognizes | 224 * In other words, this method is called when the scanner recognizes |
239 * something which cannot possibly be part of a type parameter/argument | 225 * something which cannot possibly be part of a type parameter/argument |
240 * list, like the '=' in the above example. | 226 * list, like the '=' in the above example. |
241 */ | 227 */ |
242 void discardOpenLt() { | 228 void discardOpenLt() { |
243 while (!groupingStack.isEmpty | 229 while (!groupingStack.isEmpty && |
244 && identical(groupingStack.head.kind, Tokens.LT_TOKEN)) { | 230 identical(groupingStack.head.kind, Tokens.LT_TOKEN)) { |
245 groupingStack = groupingStack.tail; | 231 groupingStack = groupingStack.tail; |
246 } | 232 } |
247 } | 233 } |
248 } | 234 } |
OLD | NEW |