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

Side by Side Diff: pkg/front_end/test/scanner_fasta_test.dart

Issue 2682423003: Unify fasta->analyzer token translation logic. (Closed)
Patch Set: Created 3 years, 10 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
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 import 'package:front_end/src/fasta/analyzer/token_utils.dart';
5 import 'package:front_end/src/fasta/scanner/error_token.dart' as fasta; 6 import 'package:front_end/src/fasta/scanner/error_token.dart' as fasta;
6 import 'package:front_end/src/fasta/scanner/keyword.dart' as fasta; 7 import 'package:front_end/src/fasta/scanner/keyword.dart' as fasta;
7 import 'package:front_end/src/fasta/scanner/string_scanner.dart' as fasta; 8 import 'package:front_end/src/fasta/scanner/string_scanner.dart' as fasta;
8 import 'package:front_end/src/fasta/scanner/token.dart' as fasta; 9 import 'package:front_end/src/fasta/scanner/token.dart' as fasta;
9 import 'package:front_end/src/fasta/scanner/token_constants.dart' as fasta; 10 import 'package:front_end/src/fasta/scanner/token_constants.dart' as fasta;
10 import 'package:front_end/src/scanner/errors.dart'; 11 import 'package:front_end/src/scanner/errors.dart';
11 import 'package:front_end/src/scanner/token.dart'; 12 import 'package:front_end/src/scanner/token.dart';
12 import 'package:test/test.dart'; 13 import 'package:test/test.dart';
13 import 'package:test_reflective_loader/test_reflective_loader.dart'; 14 import 'package:test_reflective_loader/test_reflective_loader.dart';
14 15
15 import 'scanner_test.dart'; 16 import 'scanner_test.dart';
16 17
17 main() { 18 main() {
18 defineReflectiveSuite(() { 19 defineReflectiveSuite(() {
19 defineReflectiveTests(ScannerTest_Fasta); 20 defineReflectiveTests(ScannerTest_Fasta);
20 }); 21 });
21 } 22 }
22 23
23 @reflectiveTest 24 @reflectiveTest
24 class ScannerTest_Fasta extends ScannerTestBase { 25 class ScannerTest_Fasta extends ScannerTestBase {
25 final _keywordMap = {
26 "assert": Keyword.ASSERT,
27 "break": Keyword.BREAK,
28 "case": Keyword.CASE,
29 "catch": Keyword.CATCH,
30 "class": Keyword.CLASS,
31 "const": Keyword.CONST,
32 "continue": Keyword.CONTINUE,
33 "default": Keyword.DEFAULT,
34 "do": Keyword.DO,
35 "else": Keyword.ELSE,
36 "enum": Keyword.ENUM,
37 "extends": Keyword.EXTENDS,
38 "false": Keyword.FALSE,
39 "final": Keyword.FINAL,
40 "finally": Keyword.FINALLY,
41 "for": Keyword.FOR,
42 "if": Keyword.IF,
43 "in": Keyword.IN,
44 "new": Keyword.NEW,
45 "null": Keyword.NULL,
46 "rethrow": Keyword.RETHROW,
47 "return": Keyword.RETURN,
48 "super": Keyword.SUPER,
49 "switch": Keyword.SWITCH,
50 "this": Keyword.THIS,
51 "throw": Keyword.THROW,
52 "true": Keyword.TRUE,
53 "try": Keyword.TRY,
54 "var": Keyword.VAR,
55 "void": Keyword.VOID,
56 "while": Keyword.WHILE,
57 "with": Keyword.WITH,
58 "is": Keyword.IS,
59 "abstract": Keyword.ABSTRACT,
60 "as": Keyword.AS,
61 "covariant": Keyword.COVARIANT,
62 "dynamic": Keyword.DYNAMIC,
63 "export": Keyword.EXPORT,
64 "external": Keyword.EXTERNAL,
65 "factory": Keyword.FACTORY,
66 "get": Keyword.GET,
67 "implements": Keyword.IMPLEMENTS,
68 "import": Keyword.IMPORT,
69 "library": Keyword.LIBRARY,
70 "operator": Keyword.OPERATOR,
71 "part": Keyword.PART,
72 "set": Keyword.SET,
73 "static": Keyword.STATIC,
74 "typedef": Keyword.TYPEDEF,
75 "deferred": Keyword.DEFERRED,
76 };
77
78 @override 26 @override
79 Token scanWithListener(String source, ErrorListener listener, 27 Token scanWithListener(String source, ErrorListener listener,
80 {bool genericMethodComments: false, 28 {bool genericMethodComments: false,
81 bool lazyAssignmentOperators: false}) { 29 bool lazyAssignmentOperators: false}) {
82 if (genericMethodComments) { 30 if (genericMethodComments) {
83 // Fasta doesn't support generic method comments. 31 // Fasta doesn't support generic method comments.
84 // TODO(paulberry): once the analyzer toolchain no longer needs generic 32 // TODO(paulberry): once the analyzer toolchain no longer needs generic
85 // method comments, remove tests that exercise them. 33 // method comments, remove tests that exercise them.
86 fail('No generic method comment support in Fasta'); 34 fail('No generic method comment support in Fasta');
87 } 35 }
(...skipping 27 matching lines...) Expand all
115 : TokenType.SINGLE_LINE_COMMENT; 63 : TokenType.SINGLE_LINE_COMMENT;
116 var translatedToken = 64 var translatedToken =
117 new CommentToken(type, token.value, token.charOffset); 65 new CommentToken(type, token.value, token.charOffset);
118 if (currentCommentHead == null) { 66 if (currentCommentHead == null) {
119 currentCommentHead = currentCommentTail = translatedToken; 67 currentCommentHead = currentCommentTail = translatedToken;
120 } else { 68 } else {
121 currentCommentTail.setNext(translatedToken); 69 currentCommentTail.setNext(translatedToken);
122 currentCommentTail = translatedToken; 70 currentCommentTail = translatedToken;
123 } 71 }
124 } else { 72 } else {
125 var translatedToken = _translateToken(token, currentCommentHead); 73 var translatedToken = toAnalyzerToken(token, currentCommentHead);
126 translatedToken.setNext(translatedToken); 74 translatedToken.setNext(translatedToken);
127 currentCommentHead = currentCommentTail = null; 75 currentCommentHead = currentCommentTail = null;
128 analyzerTokenTail.setNext(translatedToken); 76 analyzerTokenTail.setNext(translatedToken);
129 translatedToken.previous = analyzerTokenTail; 77 translatedToken.previous = analyzerTokenTail;
130 analyzerTokenTail = translatedToken; 78 analyzerTokenTail = translatedToken;
131 } 79 }
132 if (token.isEof) { 80 if (token.isEof) {
133 return analyzerTokenHead.next; 81 return analyzerTokenHead.next;
134 } 82 }
135 token = token.next; 83 token = token.next;
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 case fasta.ErrorKind.NonAsciiIdentifier: 270 case fasta.ErrorKind.NonAsciiIdentifier:
323 case fasta.ErrorKind.NonAsciiWhitespace: 271 case fasta.ErrorKind.NonAsciiWhitespace:
324 return _makeError( 272 return _makeError(
325 ScannerErrorCode.ILLEGAL_CHARACTER, [token.character]); 273 ScannerErrorCode.ILLEGAL_CHARACTER, [token.character]);
326 case fasta.ErrorKind.UnexpectedDollarInString: 274 case fasta.ErrorKind.UnexpectedDollarInString:
327 return null; 275 return null;
328 default: 276 default:
329 throw new UnimplementedError('$errorCode'); 277 throw new UnimplementedError('$errorCode');
330 } 278 }
331 } 279 }
332
333 Keyword _translateKeyword(String syntax) =>
334 _keywordMap[syntax] ?? (throw new UnimplementedError('$syntax'));
335
336 Token _translateToken(fasta.Token token, CommentToken comment) {
337 var type = _translateTokenInfoKind(token.info.kind);
338 int offset = token.charOffset;
339 Token makeStringToken(String value) {
340 if (comment == null) {
341 return new StringToken(type, value, offset);
342 } else {
343 return new StringTokenWithComment(type, value, offset, comment);
344 }
345 }
346
347 Token makeKeywordToken(Keyword keyword) {
348 if (comment == null) {
349 return new KeywordToken(keyword, offset);
350 } else {
351 return new KeywordTokenWithComment(keyword, offset, comment);
352 }
353 }
354
355 Token makeBeginToken() {
356 if (comment == null) {
357 return new BeginToken(type, offset);
358 } else {
359 return new BeginTokenWithComment(type, offset, comment);
360 }
361 }
362
363 if (token is fasta.StringToken) {
364 return makeStringToken(token.value);
365 } else if (token is fasta.KeywordToken) {
366 return makeKeywordToken(_translateKeyword(token.keyword.syntax));
367 } else if (token is fasta.SymbolToken) {
368 if (token is fasta.BeginGroupToken) {
369 if (type == TokenType.LT) {
370 return makeStringToken(token.value);
371 } else {
372 return makeBeginToken();
373 }
374 } else {
375 return makeStringToken(token.value);
376 }
377 }
378 throw new UnimplementedError('${token.runtimeType}');
379 }
380
381 TokenType _translateTokenInfoKind(int kind) {
382 switch (kind) {
383 case fasta.EOF_TOKEN:
384 return TokenType.EOF;
385 case fasta.KEYWORD_TOKEN:
386 return TokenType.KEYWORD;
387 case fasta.IDENTIFIER_TOKEN:
388 return TokenType.IDENTIFIER;
389 case fasta.BAD_INPUT_TOKEN:
390 return TokenType.STRING;
391 case fasta.DOUBLE_TOKEN:
392 return TokenType.DOUBLE;
393 case fasta.INT_TOKEN:
394 return TokenType.INT;
395 case fasta.HEXADECIMAL_TOKEN:
396 return TokenType.HEXADECIMAL;
397 case fasta.STRING_TOKEN:
398 return TokenType.STRING;
399 case fasta.AMPERSAND_TOKEN:
400 return TokenType.AMPERSAND;
401 case fasta.BACKPING_TOKEN:
402 return TokenType.BACKPING;
403 case fasta.BACKSLASH_TOKEN:
404 return TokenType.BACKSLASH;
405 case fasta.BANG_TOKEN:
406 return TokenType.BANG;
407 case fasta.BAR_TOKEN:
408 return TokenType.BAR;
409 case fasta.COLON_TOKEN:
410 return TokenType.COLON;
411 case fasta.COMMA_TOKEN:
412 return TokenType.COMMA;
413 case fasta.EQ_TOKEN:
414 return TokenType.EQ;
415 case fasta.GT_TOKEN:
416 return TokenType.GT;
417 case fasta.HASH_TOKEN:
418 return TokenType.HASH;
419 case fasta.OPEN_CURLY_BRACKET_TOKEN:
420 return TokenType.OPEN_CURLY_BRACKET;
421 case fasta.OPEN_SQUARE_BRACKET_TOKEN:
422 return TokenType.OPEN_SQUARE_BRACKET;
423 case fasta.OPEN_PAREN_TOKEN:
424 return TokenType.OPEN_PAREN;
425 case fasta.LT_TOKEN:
426 return TokenType.LT;
427 case fasta.MINUS_TOKEN:
428 return TokenType.MINUS;
429 case fasta.PERIOD_TOKEN:
430 return TokenType.PERIOD;
431 case fasta.PLUS_TOKEN:
432 return TokenType.PLUS;
433 case fasta.QUESTION_TOKEN:
434 return TokenType.QUESTION;
435 case fasta.AT_TOKEN:
436 return TokenType.AT;
437 case fasta.CLOSE_CURLY_BRACKET_TOKEN:
438 return TokenType.CLOSE_CURLY_BRACKET;
439 case fasta.CLOSE_SQUARE_BRACKET_TOKEN:
440 return TokenType.CLOSE_SQUARE_BRACKET;
441 case fasta.CLOSE_PAREN_TOKEN:
442 return TokenType.CLOSE_PAREN;
443 case fasta.SEMICOLON_TOKEN:
444 return TokenType.SEMICOLON;
445 case fasta.SLASH_TOKEN:
446 return TokenType.SLASH;
447 case fasta.TILDE_TOKEN:
448 return TokenType.TILDE;
449 case fasta.STAR_TOKEN:
450 return TokenType.STAR;
451 case fasta.PERCENT_TOKEN:
452 return TokenType.PERCENT;
453 case fasta.CARET_TOKEN:
454 return TokenType.CARET;
455 case fasta.STRING_INTERPOLATION_TOKEN:
456 return TokenType.STRING_INTERPOLATION_EXPRESSION;
457 case fasta.LT_EQ_TOKEN:
458 return TokenType.LT_EQ;
459 case fasta.FUNCTION_TOKEN:
460 return TokenType.FUNCTION;
461 case fasta.SLASH_EQ_TOKEN:
462 return TokenType.SLASH_EQ;
463 case fasta.PERIOD_PERIOD_PERIOD_TOKEN:
464 return TokenType.PERIOD_PERIOD_PERIOD;
465 case fasta.PERIOD_PERIOD_TOKEN:
466 return TokenType.PERIOD_PERIOD;
467 case fasta.EQ_EQ_EQ_TOKEN:
468 // TODO(paulberry,ahe): what is this?
469 throw new UnimplementedError();
470 case fasta.EQ_EQ_TOKEN:
471 return TokenType.EQ_EQ;
472 case fasta.LT_LT_EQ_TOKEN:
473 return TokenType.LT_LT_EQ;
474 case fasta.LT_LT_TOKEN:
475 return TokenType.LT_LT;
476 case fasta.GT_EQ_TOKEN:
477 return TokenType.GT_EQ;
478 case fasta.GT_GT_EQ_TOKEN:
479 return TokenType.GT_GT_EQ;
480 case fasta.INDEX_EQ_TOKEN:
481 return TokenType.INDEX_EQ;
482 case fasta.INDEX_TOKEN:
483 return TokenType.INDEX;
484 case fasta.BANG_EQ_EQ_TOKEN:
485 // TODO(paulberry,ahe): what is this?
486 throw new UnimplementedError();
487 case fasta.BANG_EQ_TOKEN:
488 return TokenType.BANG_EQ;
489 case fasta.AMPERSAND_AMPERSAND_TOKEN:
490 return TokenType.AMPERSAND_AMPERSAND;
491 case fasta.AMPERSAND_EQ_TOKEN:
492 return TokenType.AMPERSAND_EQ;
493 case fasta.BAR_BAR_TOKEN:
494 return TokenType.BAR_BAR;
495 case fasta.BAR_EQ_TOKEN:
496 return TokenType.BAR_EQ;
497 case fasta.STAR_EQ_TOKEN:
498 return TokenType.STAR_EQ;
499 case fasta.PLUS_PLUS_TOKEN:
500 return TokenType.PLUS_PLUS;
501 case fasta.PLUS_EQ_TOKEN:
502 return TokenType.PLUS_EQ;
503 case fasta.MINUS_MINUS_TOKEN:
504 return TokenType.MINUS_MINUS;
505 case fasta.MINUS_EQ_TOKEN:
506 return TokenType.MINUS_EQ;
507 case fasta.TILDE_SLASH_EQ_TOKEN:
508 return TokenType.TILDE_SLASH_EQ;
509 case fasta.TILDE_SLASH_TOKEN:
510 return TokenType.TILDE_SLASH;
511 case fasta.PERCENT_EQ_TOKEN:
512 return TokenType.PERCENT_EQ;
513 case fasta.GT_GT_TOKEN:
514 return TokenType.GT_GT;
515 case fasta.CARET_EQ_TOKEN:
516 return TokenType.CARET_EQ;
517 case fasta.STRING_INTERPOLATION_IDENTIFIER_TOKEN:
518 return TokenType.STRING_INTERPOLATION_IDENTIFIER;
519 case fasta.QUESTION_PERIOD_TOKEN:
520 return TokenType.QUESTION_PERIOD;
521 case fasta.QUESTION_QUESTION_TOKEN:
522 return TokenType.QUESTION_QUESTION;
523 case fasta.QUESTION_QUESTION_EQ_TOKEN:
524 return TokenType.QUESTION_QUESTION_EQ;
525 default:
526 throw new UnimplementedError('$kind');
527 }
528 }
529 } 280 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698