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

Side by Side Diff: pkg/front_end/lib/src/fasta/analyzer/token_utils.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
« no previous file with comments | « no previous file | pkg/front_end/test/scanner_fasta_test.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) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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.analyzer.token_utils; 5 library fasta.analyzer.token_utils;
6 6
7 import 'package:front_end/src/fasta/scanner/token.dart' show 7 import 'package:front_end/src/fasta/scanner/token.dart' show
8 KeywordToken,
8 Token; 9 Token;
9 10
10 import 'package:front_end/src/fasta/scanner/token_constants.dart'; 11 import 'package:front_end/src/fasta/scanner/token_constants.dart';
11 12
12 import 'package:analyzer/dart/ast/token.dart' as analyzer show 13 import 'package:front_end/src/scanner/token.dart' as analyzer show
13 Token; 14 CommentToken,
15 Keyword,
16 KeywordToken,
17 KeywordTokenWithComment,
18 StringToken,
19 StringTokenWithComment,
20 Token,
21 TokenWithComment;
14 22
15 import 'package:analyzer/dart/ast/token.dart' show 23 import 'package:analyzer/dart/ast/token.dart' show
16 TokenType; 24 TokenType;
17 25
18 import 'package:analyzer/src/dart/ast/token.dart' as analyzer show
19 StringToken;
20
21 import '../errors.dart' show 26 import '../errors.dart' show
22 internalError; 27 internalError;
23 28
24 analyzer.Token toAnalyzerToken(Token token) { 29 analyzer.Token toAnalyzerToken(Token token,
30 [analyzer.CommentToken commentToken]) {
25 if (token == null) return null; 31 if (token == null) return null;
32 analyzer.Token makeStringToken(TokenType tokenType) {
33 if (commentToken == null) {
34 return new analyzer.StringToken(tokenType, token.value, token.charOffset);
35 } else {
36 return new analyzer.StringTokenWithComment(
37 tokenType, token.value, token.charOffset, commentToken);
38 }
39 }
40
26 switch (token.kind) { 41 switch (token.kind) {
27 case STRING_TOKEN: 42 case DOUBLE_TOKEN:
28 return new analyzer.StringToken( 43 return makeStringToken(TokenType.DOUBLE);
29 TokenType.STRING, token.value, token.charOffset); 44
45 case HEXADECIMAL_TOKEN:
46 return makeStringToken(TokenType.HEXADECIMAL);
30 47
31 case IDENTIFIER_TOKEN: 48 case IDENTIFIER_TOKEN:
32 return new analyzer.StringToken( 49 return makeStringToken(TokenType.IDENTIFIER);
33 TokenType.IDENTIFIER, token.value, token.charOffset);
34 50
35 case INT_TOKEN: 51 case INT_TOKEN:
36 return new analyzer.StringToken( 52 return makeStringToken(TokenType.INT);
37 TokenType.INT, token.value, token.charOffset); 53
54 case KEYWORD_TOKEN:
55 KeywordToken keywordToken = token;
56 var syntax = keywordToken.keyword.syntax;
57 var keyword = _keywordMap[syntax];
58 if (keyword == null) {
59 if (_pseudoKeywords.contains(syntax)) {
ahe 2017/02/10 14:12:40 Would token.isIdentifier or token.isPseudo work he
Paul Berry 2017/02/10 17:01:02 Thanks. token.isIdentifier is too broad (it inclu
ahe 2017/02/10 17:10:46 I thought that might be the case. One thing you c
Paul Berry 2017/02/10 17:20:24 Thanks. I was considering that, and I'm glad to h
60 // TODO(paulberry,ahe): fasta scans "async", "await", and "sync" as
61 // keywords. They need to be identifiers since their meaning is only
62 // special in certain contexts.
63 return makeStringToken(TokenType.IDENTIFIER);
64 } else {
65 return internalError('Unknown keyword: $syntax');
66 }
67 }
68 if (commentToken == null) {
69 return new analyzer.KeywordToken(keyword, token.charOffset);
70 } else {
71 return new analyzer.KeywordTokenWithComment(
72 keyword, token.charOffset, commentToken);
73 }
74 break;
75
76 case STRING_TOKEN:
77 return makeStringToken(TokenType.STRING);
38 78
39 default: 79 default:
40 return new analyzer.Token(getTokenType(token), token.charOffset); 80 if (commentToken == null) {
81 return new analyzer.Token(getTokenType(token), token.charOffset);
82 } else {
83 return new analyzer.TokenWithComment(
84 getTokenType(token), token.charOffset, commentToken);
85 }
86 break;
41 } 87 }
42 } 88 }
43 89
90 final _keywordMap = {
91 "assert": analyzer.Keyword.ASSERT,
ahe 2017/02/10 14:12:40 I think you're not worried about performance right
Paul Berry 2017/02/10 17:01:02 You're correct that I'm not worried about performa
ahe 2017/02/10 17:10:46 FWIW, my biggest worry about unifying them is the
Paul Berry 2017/02/10 17:20:24 Agreed--it's a complex tradeoff. I don't intend t
ahe 2017/02/10 17:22:45 Data and opinions are good :-) Just to be clear,
92 "break": analyzer.Keyword.BREAK,
93 "case": analyzer.Keyword.CASE,
94 "catch": analyzer.Keyword.CATCH,
95 "class": analyzer.Keyword.CLASS,
96 "const": analyzer.Keyword.CONST,
97 "continue": analyzer.Keyword.CONTINUE,
98 "default": analyzer.Keyword.DEFAULT,
99 "do": analyzer.Keyword.DO,
100 "else": analyzer.Keyword.ELSE,
101 "enum": analyzer.Keyword.ENUM,
102 "extends": analyzer.Keyword.EXTENDS,
103 "false": analyzer.Keyword.FALSE,
104 "final": analyzer.Keyword.FINAL,
105 "finally": analyzer.Keyword.FINALLY,
106 "for": analyzer.Keyword.FOR,
107 "if": analyzer.Keyword.IF,
108 "in": analyzer.Keyword.IN,
109 "new": analyzer.Keyword.NEW,
110 "null": analyzer.Keyword.NULL,
111 "rethrow": analyzer.Keyword.RETHROW,
112 "return": analyzer.Keyword.RETURN,
113 "super": analyzer.Keyword.SUPER,
114 "switch": analyzer.Keyword.SWITCH,
115 "this": analyzer.Keyword.THIS,
116 "throw": analyzer.Keyword.THROW,
117 "true": analyzer.Keyword.TRUE,
118 "try": analyzer.Keyword.TRY,
119 "var": analyzer.Keyword.VAR,
120 "void": analyzer.Keyword.VOID,
121 "while": analyzer.Keyword.WHILE,
122 "with": analyzer.Keyword.WITH,
123 "is": analyzer.Keyword.IS,
124 "abstract": analyzer.Keyword.ABSTRACT,
125 "as": analyzer.Keyword.AS,
126 "covariant": analyzer.Keyword.COVARIANT,
127 "dynamic": analyzer.Keyword.DYNAMIC,
128 "export": analyzer.Keyword.EXPORT,
129 "external": analyzer.Keyword.EXTERNAL,
130 "factory": analyzer.Keyword.FACTORY,
131 "get": analyzer.Keyword.GET,
132 "implements": analyzer.Keyword.IMPLEMENTS,
133 "import": analyzer.Keyword.IMPORT,
134 "library": analyzer.Keyword.LIBRARY,
135 "operator": analyzer.Keyword.OPERATOR,
136 "part": analyzer.Keyword.PART,
137 "set": analyzer.Keyword.SET,
138 "static": analyzer.Keyword.STATIC,
139 "typedef": analyzer.Keyword.TYPEDEF,
140 "deferred": analyzer.Keyword.DEFERRED,
141 };
142
143 final _pseudoKeywords = new Set<String>.from(['async', 'await', 'sync']);
144
44 TokenType getTokenType(Token token) { 145 TokenType getTokenType(Token token) {
45 switch (token.kind) { 146 switch (token.kind) {
46 case EOF_TOKEN: return TokenType.EOF; 147 case EOF_TOKEN: return TokenType.EOF;
47 case DOUBLE_TOKEN: return TokenType.DOUBLE; 148 case DOUBLE_TOKEN: return TokenType.DOUBLE;
48 case HEXADECIMAL_TOKEN: return TokenType.HEXADECIMAL; 149 case HEXADECIMAL_TOKEN: return TokenType.HEXADECIMAL;
49 case IDENTIFIER_TOKEN: return TokenType.IDENTIFIER; 150 case IDENTIFIER_TOKEN: return TokenType.IDENTIFIER;
50 case INT_TOKEN: return TokenType.INT; 151 case INT_TOKEN: return TokenType.INT;
51 case KEYWORD_TOKEN: return TokenType.KEYWORD; 152 case KEYWORD_TOKEN: return TokenType.KEYWORD;
52 // case MULTI_LINE_COMMENT_TOKEN: return TokenType.MULTI_LINE_COMMENT; 153 // case MULTI_LINE_COMMENT_TOKEN: return TokenType.MULTI_LINE_COMMENT;
53 // case SCRIPT_TAG_TOKEN: return TokenType.SCRIPT_TAG; 154 // case SCRIPT_TAG_TOKEN: return TokenType.SCRIPT_TAG;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 case PLUS_PLUS_TOKEN: return TokenType.PLUS_PLUS; 203 case PLUS_PLUS_TOKEN: return TokenType.PLUS_PLUS;
103 case QUESTION_TOKEN: return TokenType.QUESTION; 204 case QUESTION_TOKEN: return TokenType.QUESTION;
104 case QUESTION_PERIOD_TOKEN: return TokenType.QUESTION_PERIOD; 205 case QUESTION_PERIOD_TOKEN: return TokenType.QUESTION_PERIOD;
105 case QUESTION_QUESTION_TOKEN: return TokenType.QUESTION_QUESTION; 206 case QUESTION_QUESTION_TOKEN: return TokenType.QUESTION_QUESTION;
106 case QUESTION_QUESTION_EQ_TOKEN: return TokenType.QUESTION_QUESTION_EQ; 207 case QUESTION_QUESTION_EQ_TOKEN: return TokenType.QUESTION_QUESTION_EQ;
107 case SEMICOLON_TOKEN: return TokenType.SEMICOLON; 208 case SEMICOLON_TOKEN: return TokenType.SEMICOLON;
108 case SLASH_TOKEN: return TokenType.SLASH; 209 case SLASH_TOKEN: return TokenType.SLASH;
109 case SLASH_EQ_TOKEN: return TokenType.SLASH_EQ; 210 case SLASH_EQ_TOKEN: return TokenType.SLASH_EQ;
110 case STAR_TOKEN: return TokenType.STAR; 211 case STAR_TOKEN: return TokenType.STAR;
111 case STAR_EQ_TOKEN: return TokenType.STAR_EQ; 212 case STAR_EQ_TOKEN: return TokenType.STAR_EQ;
112 // case STRING_INTERPOLATION_EXPRESSION_TOKEN: 213 case STRING_INTERPOLATION_TOKEN:
113 // return TokenType.STRING_INTERPOLATION_EXPRESSION; 214 return TokenType.STRING_INTERPOLATION_EXPRESSION;
114 case STRING_INTERPOLATION_IDENTIFIER_TOKEN: 215 case STRING_INTERPOLATION_IDENTIFIER_TOKEN:
115 return TokenType.STRING_INTERPOLATION_IDENTIFIER; 216 return TokenType.STRING_INTERPOLATION_IDENTIFIER;
116 case TILDE_TOKEN: return TokenType.TILDE; 217 case TILDE_TOKEN: return TokenType.TILDE;
117 case TILDE_SLASH_TOKEN: return TokenType.TILDE_SLASH; 218 case TILDE_SLASH_TOKEN: return TokenType.TILDE_SLASH;
118 case TILDE_SLASH_EQ_TOKEN: return TokenType.TILDE_SLASH_EQ; 219 case TILDE_SLASH_EQ_TOKEN: return TokenType.TILDE_SLASH_EQ;
119 case BACKPING_TOKEN: return TokenType.BACKPING; 220 case BACKPING_TOKEN: return TokenType.BACKPING;
120 case BACKSLASH_TOKEN: return TokenType.BACKSLASH; 221 case BACKSLASH_TOKEN: return TokenType.BACKSLASH;
121 case PERIOD_PERIOD_PERIOD_TOKEN: return TokenType.PERIOD_PERIOD_PERIOD; 222 case PERIOD_PERIOD_PERIOD_TOKEN: return TokenType.PERIOD_PERIOD_PERIOD;
122 // case GENERIC_METHOD_TYPE_LIST_TOKEN: 223 // case GENERIC_METHOD_TYPE_LIST_TOKEN:
123 // return TokenType.GENERIC_METHOD_TYPE_LIST; 224 // return TokenType.GENERIC_METHOD_TYPE_LIST;
124 // case GENERIC_METHOD_TYPE_ASSIGN_TOKEN: 225 // case GENERIC_METHOD_TYPE_ASSIGN_TOKEN:
125 // return TokenType.GENERIC_METHOD_TYPE_ASSIGN; 226 // return TokenType.GENERIC_METHOD_TYPE_ASSIGN;
126 default: 227 default:
127 return internalError("Unhandled token ${token.info}"); 228 return internalError("Unhandled token ${token.info}");
128 } 229 }
129 } 230 }
OLDNEW
« no previous file with comments | « no previous file | pkg/front_end/test/scanner_fasta_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698