| 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 fasta.scanner.token; | 5 library fasta.scanner.token; |
| 6 | 6 |
| 7 import '../../scanner/token.dart' as analyzer; | 7 import '../../scanner/token.dart' as analyzer; |
| 8 | 8 |
| 9 import 'keyword.dart' show Keyword; | 9 import 'keyword.dart' show Keyword; |
| 10 | 10 |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 SymbolToken(this.info, int charOffset) : super(charOffset); | 257 SymbolToken(this.info, int charOffset) : super(charOffset); |
| 258 | 258 |
| 259 factory SymbolToken.eof(int charOffset) { | 259 factory SymbolToken.eof(int charOffset) { |
| 260 var eof = new SyntheticSymbolToken(EOF_INFO, charOffset); | 260 var eof = new SyntheticSymbolToken(EOF_INFO, charOffset); |
| 261 // EOF points to itself so there's always infinite look-ahead. | 261 // EOF points to itself so there's always infinite look-ahead. |
| 262 eof.previousToken = eof; | 262 eof.previousToken = eof; |
| 263 eof.next = eof; | 263 eof.next = eof; |
| 264 return eof; | 264 return eof; |
| 265 } | 265 } |
| 266 | 266 |
| 267 @override |
| 267 String get lexeme => info.value; | 268 String get lexeme => info.value; |
| 268 | 269 |
| 270 @override |
| 269 String get stringValue => info.value; | 271 String get stringValue => info.value; |
| 270 | 272 |
| 273 @override |
| 271 bool isIdentifier() => false; | 274 bool isIdentifier() => false; |
| 272 | 275 |
| 273 String toString() => "SymbolToken(${info == EOF_INFO ? '-eof-' : lexeme})"; | 276 @override |
| 277 String toString() => "SymbolToken(${isEof ? '-eof-' : lexeme})"; |
| 274 | 278 |
| 279 @override |
| 275 bool get isEof => info == EOF_INFO; | 280 bool get isEof => info == EOF_INFO; |
| 276 | 281 |
| 277 @override | 282 @override |
| 278 Token copyWithoutComments() => new SymbolToken(info, charOffset); | 283 Token copyWithoutComments() => isEof |
| 284 ? new SymbolToken.eof(charOffset) |
| 285 : new SymbolToken(info, charOffset); |
| 279 } | 286 } |
| 280 | 287 |
| 281 /** | 288 /** |
| 282 * A [SyntheticSymbolToken] represents the symbol in its precedence info | 289 * A [SyntheticSymbolToken] represents the symbol in its precedence info |
| 283 * which does not exist in the original source. | 290 * which does not exist in the original source. |
| 284 * For example, if the scanner finds '(' missing a ')' | 291 * For example, if the scanner finds '(' missing a ')' |
| 285 * then it will insert an synthetic ')'. | 292 * then it will insert an synthetic ')'. |
| 286 */ | 293 */ |
| 287 class SyntheticSymbolToken extends SymbolToken { | 294 class SyntheticSymbolToken extends SymbolToken { |
| 288 SyntheticSymbolToken(PrecedenceInfo info, int charOffset) | 295 SyntheticSymbolToken(PrecedenceInfo info, int charOffset) |
| 289 : super(info, charOffset); | 296 : super(info, charOffset); |
| 290 | 297 |
| 291 @override | 298 @override |
| 292 int get charCount => 0; | 299 int get charCount => 0; |
| 293 | 300 |
| 294 @override | 301 @override |
| 295 bool get isSynthetic => true; | 302 bool get isSynthetic => true; |
| 303 |
| 304 @override |
| 305 Token copyWithoutComments() => isEof |
| 306 ? new SymbolToken.eof(charOffset) |
| 307 : new SyntheticSymbolToken(info, charOffset); |
| 296 } | 308 } |
| 297 | 309 |
| 298 /** | 310 /** |
| 299 * A [BeginGroupToken] represents a symbol that may be the beginning of | 311 * A [BeginGroupToken] represents a symbol that may be the beginning of |
| 300 * a pair of brackets, i.e., ( { [ < or ${ | 312 * a pair of brackets, i.e., ( { [ < or ${ |
| 301 * The [endGroup] token points to the matching closing bracked in case | 313 * The [endGroup] token points to the matching closing bracked in case |
| 302 * it can be identified during scanning. | 314 * it can be identified during scanning. |
| 303 */ | 315 */ |
| 304 class BeginGroupToken extends SymbolToken implements analyzer.BeginToken { | 316 class BeginGroupToken extends SymbolToken |
| 317 implements analyzer.BeginTokenWithComment { |
| 305 Token endGroup; | 318 Token endGroup; |
| 306 | 319 |
| 307 BeginGroupToken(PrecedenceInfo info, int charOffset) | 320 BeginGroupToken(PrecedenceInfo info, int charOffset) |
| 308 : super(info, charOffset); | 321 : super(info, charOffset); |
| 309 | 322 |
| 310 @override | 323 @override |
| 311 analyzer.Token get endToken => endGroup; | 324 analyzer.Token get endToken => endGroup; |
| 312 | 325 |
| 313 @override | 326 @override |
| 314 void set endToken(analyzer.Token token) { | 327 void set endToken(analyzer.Token token) { |
| 315 endGroup = token; | 328 endGroup = token; |
| 316 } | 329 } |
| 330 |
| 331 @override |
| 332 Token copyWithoutComments() => new BeginGroupToken(info, charOffset); |
| 317 } | 333 } |
| 318 | 334 |
| 319 /** | 335 /** |
| 320 * A keyword token. | 336 * A keyword token. |
| 321 */ | 337 */ |
| 322 class KeywordToken extends Token { | 338 class KeywordToken extends Token implements analyzer.KeywordTokenWithComment { |
| 323 final Keyword keyword; | 339 final Keyword keyword; |
| 324 | 340 |
| 325 KeywordToken(this.keyword, int charOffset) : super(charOffset); | 341 KeywordToken(this.keyword, int charOffset) : super(charOffset); |
| 326 | 342 |
| 327 PrecedenceInfo get info => keyword.info; | 343 PrecedenceInfo get info => keyword.info; |
| 328 | 344 |
| 329 String get lexeme => keyword.syntax; | 345 String get lexeme => keyword.syntax; |
| 330 | 346 |
| 331 String get stringValue => keyword.syntax; | 347 String get stringValue => keyword.syntax; |
| 332 | 348 |
| 333 bool isIdentifier() => keyword.isPseudo || keyword.isBuiltIn; | 349 bool isIdentifier() => keyword.isPseudo || keyword.isBuiltIn; |
| 334 | 350 |
| 335 bool get isPseudo => keyword.isPseudo; | 351 bool get isPseudo => keyword.isPseudo; |
| 336 | 352 |
| 337 bool get isBuiltInIdentifier => keyword.isBuiltIn; | 353 bool get isBuiltInIdentifier => keyword.isBuiltIn; |
| 338 | 354 |
| 339 String toString() => "KeywordToken($lexeme)"; | 355 String toString() => "KeywordToken($lexeme)"; |
| 340 | 356 |
| 341 @override | 357 @override |
| 342 Token copyWithoutComments() => new KeywordToken(keyword, charOffset); | 358 Token copyWithoutComments() => new KeywordToken(keyword, charOffset); |
| 343 | 359 |
| 344 @override | 360 @override |
| 345 // Analyzer considers pseudo-keywords to have a different value | 361 // Analyzer considers pseudo-keywords to have a different value |
| 346 Object value() => isPseudo ? lexeme : keyword; | 362 Keyword value() => isPseudo ? lexeme : keyword; |
| 347 | 363 |
| 348 @override | 364 @override |
| 349 // Analyzer considers pseudo-keywords to be identifiers | 365 // Analyzer considers pseudo-keywords to be identifiers |
| 350 analyzer.TokenType get type => isPseudo ? IDENTIFIER_INFO : KEYWORD_INFO; | 366 analyzer.TokenType get type => isPseudo ? IDENTIFIER_INFO : KEYWORD_INFO; |
| 351 } | 367 } |
| 352 | 368 |
| 353 /** | 369 /** |
| 370 * A synthetic keyword token. |
| 371 */ |
| 372 class SyntheticKeywordToken extends KeywordToken |
| 373 implements analyzer.SyntheticKeywordToken { |
| 374 /** |
| 375 * Initialize a newly created token to represent the given [keyword] at the |
| 376 * given [offset]. |
| 377 */ |
| 378 SyntheticKeywordToken(Keyword keyword, int offset) : super(keyword, offset); |
| 379 |
| 380 @override |
| 381 bool get isSynthetic => true; |
| 382 |
| 383 @override |
| 384 int get length => 0; |
| 385 |
| 386 @override |
| 387 Token copyWithoutComments() => new SyntheticKeywordToken(keyword, offset); |
| 388 } |
| 389 |
| 390 /** |
| 354 * A String-valued token. Represents identifiers, string literals, | 391 * A String-valued token. Represents identifiers, string literals, |
| 355 * number literals, comments, and error tokens, using the corresponding | 392 * number literals, comments, and error tokens, using the corresponding |
| 356 * precedence info. | 393 * precedence info. |
| 357 */ | 394 */ |
| 358 class StringToken extends Token implements analyzer.StringToken { | 395 class StringToken extends Token implements analyzer.StringTokenWithComment { |
| 359 /** | 396 /** |
| 360 * The length threshold above which substring tokens are computed lazily. | 397 * The length threshold above which substring tokens are computed lazily. |
| 361 * | 398 * |
| 362 * For string tokens that are substrings of the program source, the actual | 399 * For string tokens that are substrings of the program source, the actual |
| 363 * substring extraction is performed lazily. This is beneficial because | 400 * substring extraction is performed lazily. This is beneficial because |
| 364 * not all scanned code is actually used. For unused parts, the substrings | 401 * not all scanned code is actually used. For unused parts, the substrings |
| 365 * are never computed and allocated. | 402 * are never computed and allocated. |
| 366 */ | 403 */ |
| 367 static const int LAZY_THRESHOLD = 4; | 404 static const int LAZY_THRESHOLD = 4; |
| 368 | 405 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 } | 492 } |
| 456 | 493 |
| 457 @override | 494 @override |
| 458 Token copyWithoutComments() => | 495 Token copyWithoutComments() => |
| 459 new StringToken._(info, valueOrLazySubstring, charOffset); | 496 new StringToken._(info, valueOrLazySubstring, charOffset); |
| 460 | 497 |
| 461 @override | 498 @override |
| 462 String value() => lexeme; | 499 String value() => lexeme; |
| 463 } | 500 } |
| 464 | 501 |
| 502 /** |
| 503 * A String-valued token that does not exist in the original source. |
| 504 */ |
| 505 class SyntheticStringToken extends StringToken |
| 506 implements analyzer.SyntheticStringToken { |
| 507 SyntheticStringToken(PrecedenceInfo info, String value, int offset) |
| 508 : super._(info, value, offset); |
| 509 |
| 510 @override |
| 511 bool get isSynthetic => true; |
| 512 |
| 513 @override |
| 514 int get length => 0; |
| 515 |
| 516 @override |
| 517 Token copyWithoutComments() => |
| 518 new SyntheticStringToken(info, valueOrLazySubstring, offset); |
| 519 } |
| 520 |
| 465 class CommentToken extends StringToken implements analyzer.CommentToken { | 521 class CommentToken extends StringToken implements analyzer.CommentToken { |
| 466 /** | 522 /** |
| 467 * Creates a lazy comment token. If [canonicalize] is true, the string | 523 * Creates a lazy comment token. If [canonicalize] is true, the string |
| 468 * is canonicalized before the token is created. | 524 * is canonicalized before the token is created. |
| 469 */ | 525 */ |
| 470 CommentToken.fromSubstring( | 526 CommentToken.fromSubstring( |
| 471 PrecedenceInfo info, String data, int start, int end, int charOffset, | 527 PrecedenceInfo info, String data, int start, int end, int charOffset, |
| 472 {bool canonicalize: false}) | 528 {bool canonicalize: false}) |
| 473 : super.fromSubstring(info, data, start, end, charOffset, | 529 : super.fromSubstring(info, data, start, end, charOffset, |
| 474 canonicalize: canonicalize); | 530 canonicalize: canonicalize); |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 637 identical(value, "<=") || | 693 identical(value, "<=") || |
| 638 identical(value, "<") || | 694 identical(value, "<") || |
| 639 identical(value, "&") || | 695 identical(value, "&") || |
| 640 identical(value, "^") || | 696 identical(value, "^") || |
| 641 identical(value, "|"); | 697 identical(value, "|"); |
| 642 } | 698 } |
| 643 | 699 |
| 644 bool isTernaryOperator(String value) => identical(value, "[]="); | 700 bool isTernaryOperator(String value) => identical(value, "[]="); |
| 645 | 701 |
| 646 bool isMinusOperator(String value) => identical(value, "-"); | 702 bool isMinusOperator(String value) => identical(value, "-"); |
| OLD | NEW |