| OLD | NEW |
| 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:analyzer/src/fasta/token_utils.dart'; | 5 import 'package:analyzer/src/fasta/token_utils.dart'; |
| 6 import 'package:front_end/src/fasta/scanner/precedence.dart'; | 6 import 'package:front_end/src/scanner/errors.dart' as analyzer; |
| 7 import 'package:front_end/src/scanner/reader.dart' as analyzer; |
| 8 import 'package:front_end/src/scanner/scanner.dart' as analyzer; |
| 7 import 'package:front_end/src/scanner/token.dart'; | 9 import 'package:front_end/src/scanner/token.dart'; |
| 8 import 'package:front_end/src/fasta/scanner/string_scanner.dart'; | |
| 9 import 'package:test/test.dart'; | 10 import 'package:test/test.dart'; |
| 10 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 11 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 11 | 12 |
| 12 import 'scanner_fasta_test.dart'; | 13 import 'scanner_fasta_test.dart'; |
| 13 import 'scanner_test.dart'; | 14 import 'scanner_test.dart'; |
| 14 | 15 |
| 15 main() { | 16 main() { |
| 16 defineReflectiveSuite(() { | 17 defineReflectiveSuite(() { |
| 17 defineReflectiveTests(ScannerTest_RoundTrip); | 18 defineReflectiveTests(ScannerTest_RoundTrip); |
| 18 }); | 19 }); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 Keyword.PART, | 113 Keyword.PART, |
| 113 Keyword.SET, | 114 Keyword.SET, |
| 114 Keyword.STATIC, | 115 Keyword.STATIC, |
| 115 Keyword.TYPEDEF, | 116 Keyword.TYPEDEF, |
| 116 ]); | 117 ]); |
| 117 for (Keyword keyword in Keyword.values) { | 118 for (Keyword keyword in Keyword.values) { |
| 118 expect(keyword.isPseudoKeyword, pseudoAnalyzerKeywords.contains(keyword), | 119 expect(keyword.isPseudoKeyword, pseudoAnalyzerKeywords.contains(keyword), |
| 119 reason: keyword.name); | 120 reason: keyword.name); |
| 120 } | 121 } |
| 121 } | 122 } |
| 123 } |
| 122 | 124 |
| 123 var allTokenTypes = new Set<TokenType>.from([ | 125 class TestScanner extends analyzer.Scanner { |
| 124 TokenType.EOF, | 126 TestScanner(analyzer.CharacterReader reader) : super(reader); |
| 125 TokenType.DOUBLE, | |
| 126 TokenType.HEXADECIMAL, | |
| 127 TokenType.IDENTIFIER, | |
| 128 TokenType.INT, | |
| 129 TokenType.KEYWORD, | |
| 130 TokenType.MULTI_LINE_COMMENT, | |
| 131 TokenType.SCRIPT_TAG, | |
| 132 TokenType.SINGLE_LINE_COMMENT, | |
| 133 TokenType.STRING, | |
| 134 TokenType.AMPERSAND, | |
| 135 TokenType.AMPERSAND_AMPERSAND, | |
| 136 TokenType.AMPERSAND_AMPERSAND_EQ, | |
| 137 TokenType.AMPERSAND_EQ, | |
| 138 TokenType.AT, | |
| 139 TokenType.BANG, | |
| 140 TokenType.BANG_EQ, | |
| 141 TokenType.BAR, | |
| 142 TokenType.BAR_BAR, | |
| 143 TokenType.BAR_BAR_EQ, | |
| 144 TokenType.BAR_EQ, | |
| 145 TokenType.COLON, | |
| 146 TokenType.COMMA, | |
| 147 TokenType.CARET, | |
| 148 TokenType.CARET_EQ, | |
| 149 TokenType.CLOSE_CURLY_BRACKET, | |
| 150 TokenType.CLOSE_PAREN, | |
| 151 TokenType.CLOSE_SQUARE_BRACKET, | |
| 152 TokenType.EQ, | |
| 153 TokenType.EQ_EQ, | |
| 154 TokenType.FUNCTION, | |
| 155 TokenType.GT, | |
| 156 TokenType.GT_EQ, | |
| 157 TokenType.GT_GT, | |
| 158 TokenType.GT_GT_EQ, | |
| 159 TokenType.HASH, | |
| 160 TokenType.INDEX, | |
| 161 TokenType.INDEX_EQ, | |
| 162 TokenType.LT, | |
| 163 TokenType.LT_EQ, | |
| 164 TokenType.LT_LT, | |
| 165 TokenType.LT_LT_EQ, | |
| 166 TokenType.MINUS, | |
| 167 TokenType.MINUS_EQ, | |
| 168 TokenType.MINUS_MINUS, | |
| 169 TokenType.OPEN_CURLY_BRACKET, | |
| 170 TokenType.OPEN_PAREN, | |
| 171 TokenType.OPEN_SQUARE_BRACKET, | |
| 172 TokenType.PERCENT, | |
| 173 TokenType.PERCENT_EQ, | |
| 174 TokenType.PERIOD, | |
| 175 TokenType.PERIOD_PERIOD, | |
| 176 TokenType.PLUS, | |
| 177 TokenType.PLUS_EQ, | |
| 178 TokenType.PLUS_PLUS, | |
| 179 TokenType.QUESTION, | |
| 180 TokenType.QUESTION_PERIOD, | |
| 181 TokenType.QUESTION_QUESTION, | |
| 182 TokenType.QUESTION_QUESTION_EQ, | |
| 183 TokenType.SEMICOLON, | |
| 184 TokenType.SLASH, | |
| 185 TokenType.SLASH_EQ, | |
| 186 TokenType.STAR, | |
| 187 TokenType.STAR_EQ, | |
| 188 TokenType.STRING_INTERPOLATION_EXPRESSION, | |
| 189 TokenType.STRING_INTERPOLATION_IDENTIFIER, | |
| 190 TokenType.TILDE, | |
| 191 TokenType.TILDE_SLASH, | |
| 192 TokenType.TILDE_SLASH_EQ, | |
| 193 TokenType.BACKPING, | |
| 194 TokenType.BACKSLASH, | |
| 195 TokenType.PERIOD_PERIOD_PERIOD, | |
| 196 TokenType.GENERIC_METHOD_TYPE_LIST, | |
| 197 TokenType.GENERIC_METHOD_TYPE_ASSIGN, | |
| 198 ]); | |
| 199 | 127 |
| 200 void test_isOperator() { | 128 @override |
| 201 var operatorTokenTypes = new Set<TokenType>.from([ | 129 void reportError( |
| 202 TokenType.AMPERSAND, | 130 analyzer.ScannerErrorCode errorCode, int offset, List<Object> arguments) { |
| 203 TokenType.AMPERSAND_AMPERSAND, | 131 fail('Unexpected error $errorCode while scanning offset $offset\n' |
| 204 TokenType.AMPERSAND_AMPERSAND_EQ, | 132 ' arguments: $arguments'); |
| 205 TokenType.AMPERSAND_EQ, | |
| 206 TokenType.BANG, | |
| 207 TokenType.BANG_EQ, | |
| 208 TokenType.BAR, | |
| 209 TokenType.BAR_BAR, | |
| 210 TokenType.BAR_BAR_EQ, | |
| 211 TokenType.BAR_EQ, | |
| 212 TokenType.CARET, | |
| 213 TokenType.CARET_EQ, | |
| 214 TokenType.EQ, | |
| 215 TokenType.EQ_EQ, | |
| 216 TokenType.GT, | |
| 217 TokenType.GT_EQ, | |
| 218 TokenType.GT_GT, | |
| 219 TokenType.GT_GT_EQ, | |
| 220 TokenType.INDEX, | |
| 221 TokenType.INDEX_EQ, | |
| 222 TokenType.LT, | |
| 223 TokenType.LT_EQ, | |
| 224 TokenType.LT_LT, | |
| 225 TokenType.LT_LT_EQ, | |
| 226 TokenType.MINUS, | |
| 227 TokenType.MINUS_EQ, | |
| 228 TokenType.MINUS_MINUS, | |
| 229 TokenType.PERCENT, | |
| 230 TokenType.PERCENT_EQ, | |
| 231 TokenType.PERIOD_PERIOD, | |
| 232 TokenType.PLUS, | |
| 233 TokenType.PLUS_EQ, | |
| 234 TokenType.PLUS_PLUS, | |
| 235 TokenType.QUESTION, | |
| 236 TokenType.QUESTION_PERIOD, | |
| 237 TokenType.QUESTION_QUESTION, | |
| 238 TokenType.QUESTION_QUESTION_EQ, | |
| 239 TokenType.SLASH, | |
| 240 TokenType.SLASH_EQ, | |
| 241 TokenType.STAR, | |
| 242 TokenType.STAR_EQ, | |
| 243 TokenType.TILDE, | |
| 244 TokenType.TILDE_SLASH, | |
| 245 TokenType.TILDE_SLASH_EQ, | |
| 246 ]); | |
| 247 | |
| 248 void assertIsOperator(String source, bool isOperator) { | |
| 249 if (source == null || source.isEmpty) return; | |
| 250 var scanner = new StringScanner(source, includeComments: true); | |
| 251 var token = scanner.tokenize(); | |
| 252 expect(token.isOperator, isOperator, reason: source); | |
| 253 } | |
| 254 | |
| 255 var operatorLexemes = | |
| 256 new Set.from(operatorTokenTypes.map((tt) => tt.lexeme)); | |
| 257 | |
| 258 for (PrecedenceInfo info in PrecedenceInfo.all) { | |
| 259 assertIsOperator(info.value, operatorLexemes.contains(info.value)); | |
| 260 } | |
| 261 | |
| 262 for (TokenType tt in new List.from(allTokenTypes)) { | |
| 263 assertIsOperator(tt.lexeme, operatorTokenTypes.contains(tt)); | |
| 264 } | |
| 265 } | |
| 266 | |
| 267 void test_precedence() { | |
| 268 for (TokenType tt in allTokenTypes) { | |
| 269 for (PrecedenceInfo info in PrecedenceInfo.all) { | |
| 270 if (info.value == tt.lexeme || info.value == tt.name.toLowerCase()) { | |
| 271 expect(tt.precedence, info.precedence, reason: tt.name); | |
| 272 } | |
| 273 } | |
| 274 } | |
| 275 } | 133 } |
| 276 } | 134 } |
| OLD | NEW |