| Index: pkg/front_end/test/scanner_test.dart
|
| diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/front_end/test/scanner_test.dart
|
| similarity index 80%
|
| copy from pkg/analyzer/test/generated/scanner_test.dart
|
| copy to pkg/front_end/test/scanner_test.dart
|
| index 748bab49f09f603ccf8c6dcbd1f873a03f329150..69e802d3008e3b898096106cdaafabf806b56901 100644
|
| --- a/pkg/analyzer/test/generated/scanner_test.dart
|
| +++ b/pkg/front_end/test/scanner_test.dart
|
| @@ -1,21 +1,16 @@
|
| -// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
| +// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
|
| // for details. All rights reserved. Use of this source code is governed by a
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| -library analyzer.test.generated.scanner_test;
|
| -
|
| -import 'package:analyzer/dart/ast/token.dart';
|
| -import 'package:analyzer/error/error.dart';
|
| -import 'package:analyzer/error/listener.dart';
|
| -import 'package:analyzer/src/dart/ast/token.dart';
|
| -import 'package:analyzer/src/dart/scanner/reader.dart';
|
| -import 'package:analyzer/src/dart/scanner/scanner.dart';
|
| -import 'package:analyzer/src/generated/source.dart';
|
| +import 'package:front_end/src/base/errors.dart';
|
| +import 'package:front_end/src/base/jenkins_smi_hash.dart';
|
| +import 'package:front_end/src/scanner/errors.dart';
|
| +import 'package:front_end/src/scanner/reader.dart';
|
| +import 'package:front_end/src/scanner/scanner.dart';
|
| +import 'package:front_end/src/scanner/token.dart';
|
| import 'package:test/test.dart';
|
| import 'package:test_reflective_loader/test_reflective_loader.dart';
|
|
|
| -import 'test_support.dart';
|
| -
|
| main() {
|
| defineReflectiveSuite(() {
|
| defineReflectiveTests(CharSequenceReaderTest);
|
| @@ -25,62 +20,6 @@ main() {
|
| });
|
| }
|
|
|
| -class CharacterRangeReaderTest extends EngineTestCase {
|
| - void test_advance() {
|
| - CharSequenceReader baseReader = new CharSequenceReader("xyzzy");
|
| - CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 4);
|
| - expect(reader.advance(), 0x79);
|
| - expect(reader.advance(), 0x80);
|
| - expect(reader.advance(), 0x80);
|
| - expect(reader.advance(), -1);
|
| - expect(reader.advance(), -1);
|
| - }
|
| -
|
| - void test_creation() {
|
| - CharSequenceReader baseReader = new CharSequenceReader("xyzzy");
|
| - CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 4);
|
| - expect(reader, isNotNull);
|
| - }
|
| -
|
| - void test_getOffset() {
|
| - CharSequenceReader baseReader = new CharSequenceReader("xyzzy");
|
| - CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 2);
|
| - expect(reader.offset, 1);
|
| - reader.advance();
|
| - expect(reader.offset, 2);
|
| - reader.advance();
|
| - expect(reader.offset, 2);
|
| - }
|
| -
|
| - void test_getString() {
|
| - CharSequenceReader baseReader = new CharSequenceReader("__xyzzy__");
|
| - CharacterRangeReader reader = new CharacterRangeReader(baseReader, 2, 7);
|
| - reader.offset = 5;
|
| - expect(reader.getString(3, 0), "yzz");
|
| - expect(reader.getString(4, 1), "zzy");
|
| - }
|
| -
|
| - void test_peek() {
|
| - CharSequenceReader baseReader = new CharSequenceReader("xyzzy");
|
| - CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 3);
|
| - expect(reader.peek(), 0x79);
|
| - expect(reader.peek(), 0x79);
|
| - reader.advance();
|
| - expect(reader.peek(), 0x80);
|
| - expect(reader.peek(), 0x80);
|
| - reader.advance();
|
| - expect(reader.peek(), -1);
|
| - expect(reader.peek(), -1);
|
| - }
|
| -
|
| - void test_setOffset() {
|
| - CharSequenceReader baseReader = new CharSequenceReader("xyzzy");
|
| - CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 4);
|
| - reader.offset = 2;
|
| - expect(reader.offset, 2);
|
| - }
|
| -}
|
| -
|
| @reflectiveTest
|
| class CharSequenceReaderTest {
|
| void test_advance() {
|
| @@ -267,10 +206,8 @@ class ScannerTest {
|
| }
|
|
|
| void test_comment_disabled_multi() {
|
| - Scanner scanner = new Scanner(
|
| - null,
|
| - new CharSequenceReader("/* comment */ "),
|
| - AnalysisErrorListener.NULL_LISTENER);
|
| + Scanner scanner =
|
| + new _TestScanner(new CharSequenceReader("/* comment */ "));
|
| scanner.preserveComments = false;
|
| Token token = scanner.tokenize();
|
| expect(token, isNotNull);
|
| @@ -300,8 +237,8 @@ class ScannerTest {
|
| * bbb
|
| * c
|
| */''';
|
| - GatheringErrorListener listener = new GatheringErrorListener();
|
| - Scanner scanner = new Scanner(null, new CharSequenceReader(code), listener);
|
| + _ErrorListener listener = new _ErrorListener();
|
| + Scanner scanner = new _TestScanner(new CharSequenceReader(code), listener);
|
| scanner.tokenize();
|
| expect(
|
| scanner.lineStarts,
|
| @@ -400,19 +337,20 @@ class ScannerTest {
|
| }
|
|
|
| void test_illegalChar_cyrillicLetter_middle() {
|
| - _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 5, "Shche\u0433lov");
|
| + _assertError(
|
| + ScannerErrorCode.ILLEGAL_CHARACTER, 5, "Shche\u0433lov", [0x433]);
|
| }
|
|
|
| void test_illegalChar_cyrillicLetter_start() {
|
| - _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0429");
|
| + _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0429", [0x429]);
|
| }
|
|
|
| void test_illegalChar_nbsp() {
|
| - _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u00A0");
|
| + _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u00A0", [0xa0]);
|
| }
|
|
|
| void test_illegalChar_notLetter() {
|
| - _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0312");
|
| + _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0312", [0x312]);
|
| }
|
|
|
| void test_index() {
|
| @@ -623,51 +561,6 @@ class ScannerTest {
|
| _assertKeywordToken("with");
|
| }
|
|
|
| - void test_lineInfo_multilineComment() {
|
| - String source = "/*\r *\r */";
|
| - _assertLineInfo(source, [
|
| - new ScannerTest_ExpectedLocation(0, 1, 1),
|
| - new ScannerTest_ExpectedLocation(4, 2, 2),
|
| - new ScannerTest_ExpectedLocation(source.length - 1, 3, 3)
|
| - ]);
|
| - }
|
| -
|
| - void test_lineInfo_multilineString() {
|
| - String source = "'''a\r\nbc\r\nd'''";
|
| - _assertLineInfo(source, [
|
| - new ScannerTest_ExpectedLocation(0, 1, 1),
|
| - new ScannerTest_ExpectedLocation(7, 2, 2),
|
| - new ScannerTest_ExpectedLocation(source.length - 1, 3, 4)
|
| - ]);
|
| - }
|
| -
|
| - void test_lineInfo_multilineString_raw() {
|
| - String source = "var a = r'''\nblah\n''';\n\nfoo";
|
| - _assertLineInfo(source, [
|
| - new ScannerTest_ExpectedLocation(0, 1, 1),
|
| - new ScannerTest_ExpectedLocation(14, 2, 2),
|
| - new ScannerTest_ExpectedLocation(source.length - 2, 5, 2)
|
| - ]);
|
| - }
|
| -
|
| - void test_lineInfo_simpleClass() {
|
| - String source =
|
| - "class Test {\r\n String s = '...';\r\n int get x => s.MISSING_GETTER;\r\n}";
|
| - _assertLineInfo(source, [
|
| - new ScannerTest_ExpectedLocation(0, 1, 1),
|
| - new ScannerTest_ExpectedLocation(source.indexOf("MISSING_GETTER"), 3, 20),
|
| - new ScannerTest_ExpectedLocation(source.length - 1, 4, 1)
|
| - ]);
|
| - }
|
| -
|
| - void test_lineInfo_slashN() {
|
| - String source = "class Test {\n}";
|
| - _assertLineInfo(source, [
|
| - new ScannerTest_ExpectedLocation(0, 1, 1),
|
| - new ScannerTest_ExpectedLocation(source.indexOf("}"), 2, 1)
|
| - ]);
|
| - }
|
| -
|
| void test_lt() {
|
| _assertToken(TokenType.LT, "<");
|
| }
|
| @@ -798,9 +691,9 @@ class ScannerTest {
|
|
|
| void test_setSourceStart() {
|
| int offsetDelta = 42;
|
| - GatheringErrorListener listener = new GatheringErrorListener();
|
| + _ErrorListener listener = new _ErrorListener();
|
| Scanner scanner =
|
| - new Scanner(null, new SubSequenceReader("a", offsetDelta), listener);
|
| + new _TestScanner(new SubSequenceReader("a", offsetDelta), listener);
|
| scanner.setSourceStart(3, 9);
|
| scanner.tokenize();
|
| List<int> lineStarts = scanner.lineStarts;
|
| @@ -1069,7 +962,7 @@ class ScannerTest {
|
| }
|
|
|
| void test_unclosedPairInInterpolation() {
|
| - GatheringErrorListener listener = new GatheringErrorListener();
|
| + _ErrorListener listener = new _ErrorListener();
|
| _scanWithListener("'\${(}'", listener);
|
| }
|
|
|
| @@ -1110,13 +1003,12 @@ class ScannerTest {
|
| * [source] the source to be scanned to produce the error
|
| */
|
| void _assertError(
|
| - ScannerErrorCode expectedError, int expectedOffset, String source) {
|
| - GatheringErrorListener listener = new GatheringErrorListener();
|
| + ScannerErrorCode expectedError, int expectedOffset, String source,
|
| + [List<Object> arguments]) {
|
| + _ErrorListener listener = new _ErrorListener();
|
| _scanWithListener(source, listener);
|
| - listener.assertErrors([
|
| - new AnalysisError(null, expectedOffset, 1, expectedError,
|
| - [source.codeUnitAt(expectedOffset)])
|
| - ]);
|
| + listener.assertErrors(
|
| + [new _TestError(expectedOffset, 1, expectedError, arguments)]);
|
| }
|
|
|
| /**
|
| @@ -1130,12 +1022,10 @@ class ScannerTest {
|
| */
|
| void _assertErrorAndTokens(ScannerErrorCode expectedError, int expectedOffset,
|
| String source, List<Token> expectedTokens) {
|
| - GatheringErrorListener listener = new GatheringErrorListener();
|
| + _ErrorListener listener = new _ErrorListener();
|
| Token token = _scanWithListener(source, listener);
|
| - listener.assertErrors([
|
| - new AnalysisError(null, expectedOffset, 1, expectedError,
|
| - [source.codeUnitAt(expectedOffset)])
|
| - ]);
|
| + listener
|
| + .assertErrors([new _TestError(expectedOffset, 1, expectedError, null)]);
|
| _checkTokens(token, expectedTokens);
|
| }
|
|
|
| @@ -1165,24 +1055,6 @@ class ScannerTest {
|
| expect(token.next.type, TokenType.EOF);
|
| }
|
|
|
| - void _assertLineInfo(
|
| - String source, List<ScannerTest_ExpectedLocation> expectedLocations) {
|
| - GatheringErrorListener listener = new GatheringErrorListener();
|
| - _scanWithListener(source, listener);
|
| - listener.assertNoErrors();
|
| - LineInfo info = listener.getLineInfo(new TestSource());
|
| - expect(info, isNotNull);
|
| - int count = expectedLocations.length;
|
| - for (int i = 0; i < count; i++) {
|
| - ScannerTest_ExpectedLocation expectedLocation = expectedLocations[i];
|
| - LineInfo_Location location = info.getLocation(expectedLocation._offset);
|
| - expect(location.lineNumber, expectedLocation._lineNumber,
|
| - reason: 'Line number in location $i');
|
| - expect(location.columnNumber, expectedLocation._columnNumber,
|
| - reason: 'Column number in location $i');
|
| - }
|
| - }
|
| -
|
| /**
|
| * Assert that the token scanned from the given [source] has the
|
| * [expectedType].
|
| @@ -1268,7 +1140,7 @@ class ScannerTest {
|
| Token _scan(String source,
|
| {bool genericMethodComments: false,
|
| bool lazyAssignmentOperators: false}) {
|
| - GatheringErrorListener listener = new GatheringErrorListener();
|
| + _ErrorListener listener = new _ErrorListener();
|
| Token token = _scanWithListener(source, listener,
|
| genericMethodComments: genericMethodComments,
|
| lazyAssignmentOperators: lazyAssignmentOperators);
|
| @@ -1276,102 +1148,19 @@ class ScannerTest {
|
| return token;
|
| }
|
|
|
| - Token _scanWithListener(String source, GatheringErrorListener listener,
|
| + Token _scanWithListener(String source, _ErrorListener listener,
|
| {bool genericMethodComments: false,
|
| bool lazyAssignmentOperators: false}) {
|
| Scanner scanner =
|
| - new Scanner(null, new CharSequenceReader(source), listener);
|
| + new _TestScanner(new CharSequenceReader(source), listener);
|
| scanner.scanGenericMethodComments = genericMethodComments;
|
| scanner.scanLazyAssignmentOperators = lazyAssignmentOperators;
|
| - Token result = scanner.tokenize();
|
| - listener.setLineInfo(new TestSource(), scanner.lineStarts);
|
| - return result;
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * An `ExpectedLocation` encodes information about the expected location of a
|
| - * given offset in source code.
|
| - */
|
| -class ScannerTest_ExpectedLocation {
|
| - final int _offset;
|
| -
|
| - final int _lineNumber;
|
| -
|
| - final int _columnNumber;
|
| -
|
| - ScannerTest_ExpectedLocation(
|
| - this._offset, this._lineNumber, this._columnNumber);
|
| -}
|
| -
|
| -/**
|
| - * A `TokenStreamValidator` is used to validate the correct construction of a
|
| - * stream of tokens.
|
| - */
|
| -class TokenStreamValidator {
|
| - /**
|
| - * Validate that the stream of tokens that starts with the given [token] is
|
| - * correct.
|
| - */
|
| - void validate(Token token) {
|
| - StringBuffer buffer = new StringBuffer();
|
| - _validateStream(buffer, token);
|
| - if (buffer.length > 0) {
|
| - fail(buffer.toString());
|
| - }
|
| - }
|
| -
|
| - void _validateStream(StringBuffer buffer, Token token) {
|
| - if (token == null) {
|
| - return;
|
| - }
|
| - Token previousToken = null;
|
| - int previousEnd = -1;
|
| - Token currentToken = token;
|
| - while (currentToken != null && currentToken.type != TokenType.EOF) {
|
| - _validateStream(buffer, currentToken.precedingComments);
|
| - TokenType type = currentToken.type;
|
| - if (type == TokenType.OPEN_CURLY_BRACKET ||
|
| - type == TokenType.OPEN_PAREN ||
|
| - type == TokenType.OPEN_SQUARE_BRACKET ||
|
| - type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
|
| - if (currentToken is! BeginToken) {
|
| - buffer.write("\r\nExpected BeginToken, found ");
|
| - buffer.write(currentToken.runtimeType.toString());
|
| - buffer.write(" ");
|
| - _writeToken(buffer, currentToken);
|
| - }
|
| - }
|
| - int currentStart = currentToken.offset;
|
| - int currentLength = currentToken.length;
|
| - int currentEnd = currentStart + currentLength - 1;
|
| - if (currentStart <= previousEnd) {
|
| - buffer.write("\r\nInvalid token sequence: ");
|
| - _writeToken(buffer, previousToken);
|
| - buffer.write(" followed by ");
|
| - _writeToken(buffer, currentToken);
|
| - }
|
| - previousEnd = currentEnd;
|
| - previousToken = currentToken;
|
| - currentToken = currentToken.next;
|
| - }
|
| - }
|
| -
|
| - void _writeToken(StringBuffer buffer, Token token) {
|
| - buffer.write("[");
|
| - buffer.write(token.type);
|
| - buffer.write(", '");
|
| - buffer.write(token.lexeme);
|
| - buffer.write("', ");
|
| - buffer.write(token.offset);
|
| - buffer.write(", ");
|
| - buffer.write(token.length);
|
| - buffer.write("]");
|
| + return scanner.tokenize();
|
| }
|
| }
|
|
|
| @reflectiveTest
|
| -class TokenTypeTest extends EngineTestCase {
|
| +class TokenTypeTest {
|
| void test_isOperator() {
|
| expect(TokenType.AMPERSAND.isOperator, isTrue);
|
| expect(TokenType.AMPERSAND_AMPERSAND.isOperator, isTrue);
|
| @@ -1437,3 +1226,73 @@ class TokenTypeTest extends EngineTestCase {
|
| expect(TokenType.TILDE_SLASH.isUserDefinableOperator, isTrue);
|
| }
|
| }
|
| +
|
| +class _ErrorListener {
|
| + final errors = <_TestError>[];
|
| +
|
| + void assertErrors(List<_TestError> expectedErrors) {
|
| + expect(errors, unorderedEquals(expectedErrors));
|
| + }
|
| +
|
| + void assertNoErrors() {
|
| + assertErrors([]);
|
| + }
|
| +}
|
| +
|
| +class _TestError {
|
| + final int offset;
|
| + final int length;
|
| + final ErrorCode errorCode;
|
| + final List<Object> arguments;
|
| +
|
| + _TestError(this.offset, this.length, this.errorCode, this.arguments);
|
| +
|
| + @override
|
| + get hashCode {
|
| + var h = new JenkinsSmiHash()..add(offset)..add(length)..add(errorCode);
|
| + if (arguments != null) {
|
| + for (Object argument in arguments) {
|
| + h.add(argument);
|
| + }
|
| + }
|
| + return h.hashCode;
|
| + }
|
| +
|
| + @override
|
| + operator ==(Object other) {
|
| + if (other is _TestError &&
|
| + offset == other.offset &&
|
| + length == other.length &&
|
| + errorCode == other.errorCode) {
|
| + if (arguments == null) return other.arguments == null;
|
| + if (other.arguments == null) return false;
|
| + if (arguments.length != other.arguments.length) return false;
|
| + for (int i = 0; i < arguments.length; i++) {
|
| + if (arguments[i] != other.arguments[i]) return false;
|
| + }
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + @override
|
| + toString() {
|
| + var end = offset + length;
|
| + var argString = arguments == null ? '' : '(${arguments.join(', ')})';
|
| + return 'Error($offset..$end, $errorCode$argString)';
|
| + }
|
| +}
|
| +
|
| +class _TestScanner extends Scanner {
|
| + final _ErrorListener listener;
|
| +
|
| + _TestScanner(CharacterReader reader, [this.listener]) : super(reader);
|
| +
|
| + @override
|
| + void reportError(
|
| + ScannerErrorCode errorCode, int offset, List<Object> arguments) {
|
| + if (listener != null) {
|
| + listener.errors.add(new _TestError(offset, 1, errorCode, arguments));
|
| + }
|
| + }
|
| +}
|
|
|