| 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:front_end/src/fasta/parser/token_stream_rewriter.dart'; | 5 import 'package:front_end/src/fasta/parser/token_stream_rewriter.dart'; |
| 6 import 'package:front_end/src/fasta/scanner/token.dart'; | 6 import 'package:front_end/src/fasta/scanner/token.dart'; |
| 7 import 'package:front_end/src/scanner/token.dart' show TokenType; | 7 import 'package:front_end/src/scanner/token.dart' show TokenType; |
| 8 import 'package:test/test.dart'; | 8 import 'package:test/test.dart'; |
| 9 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 9 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 10 | 10 |
| 11 main() { | 11 main() { |
| 12 defineReflectiveSuite(() { | 12 defineReflectiveSuite(() { |
| 13 defineReflectiveTests(TokenStreamRewriterTest_NoPrevious); | 13 defineReflectiveTests(TokenStreamRewriterTest_NoPrevious); |
| 14 defineReflectiveTests(TokenStreamRewriterTest_UsingPrevious); | 14 defineReflectiveTests(TokenStreamRewriterTest_UsingPrevious); |
| 15 }); | 15 }); |
| 16 } | 16 } |
| 17 | 17 |
| 18 /// Abstract base class for tests of [TokenStreamRewriter]. | 18 /// Abstract base class for tests of [TokenStreamRewriter]. |
| 19 abstract class TokenStreamRewriterTest { | 19 abstract class TokenStreamRewriterTest { |
| 20 /// Indicates whether the tests should set up [Token.previousToken]. | 20 /// Indicates whether the tests should set up [Token.previous]. |
| 21 bool get setPrevious; | 21 bool get setPrevious; |
| 22 | 22 |
| 23 void test_insert_at_end() { | 23 void test_insert_at_end() { |
| 24 var a = _makeToken(0, 'a'); | 24 var a = _makeToken(0, 'a'); |
| 25 var b = _makeToken(1, 'b'); | 25 var b = _makeToken(1, 'b'); |
| 26 var eof = _link([a]); | 26 var eof = _link([a]); |
| 27 var rewriter = new TokenStreamRewriter(a); | 27 var rewriter = new TokenStreamRewriter(a); |
| 28 rewriter.insertTokenBefore(b, eof); | 28 rewriter.insertTokenBefore(b, eof); |
| 29 expect(rewriter.firstToken, same(a)); | 29 expect(rewriter.firstToken, same(a)); |
| 30 expect(a.next, same(b)); | 30 expect(a.next, same(b)); |
| 31 expect(b.next, same(eof)); | 31 expect(b.next, same(eof)); |
| 32 expect(eof.previousToken, same(b)); | 32 expect(eof.previous, same(b)); |
| 33 expect(b.previousToken, same(a)); | 33 expect(b.previous, same(a)); |
| 34 } | 34 } |
| 35 | 35 |
| 36 void test_insert_at_start() { | 36 void test_insert_at_start() { |
| 37 var a = _makeToken(0, 'a'); | 37 var a = _makeToken(0, 'a'); |
| 38 var b = _makeToken(1, 'b'); | 38 var b = _makeToken(1, 'b'); |
| 39 _link([b]); | 39 _link([b]); |
| 40 var rewriter = new TokenStreamRewriter(b); | 40 var rewriter = new TokenStreamRewriter(b); |
| 41 rewriter.insertTokenBefore(a, b); | 41 rewriter.insertTokenBefore(a, b); |
| 42 expect(rewriter.firstToken, same(a)); | 42 expect(rewriter.firstToken, same(a)); |
| 43 expect(a.next, same(b)); | 43 expect(a.next, same(b)); |
| 44 expect(a.previousToken.next, same(a)); | 44 expect(a.previous.next, same(a)); |
| 45 expect(b.previousToken, same(a)); | 45 expect(b.previous, same(a)); |
| 46 } | 46 } |
| 47 | 47 |
| 48 void test_resume_at_previous_insertion_point() { | 48 void test_resume_at_previous_insertion_point() { |
| 49 var a = _makeToken(0, 'a'); | 49 var a = _makeToken(0, 'a'); |
| 50 var b = _makeToken(1, 'b'); | 50 var b = _makeToken(1, 'b'); |
| 51 var c = _makeToken(2, 'c'); | 51 var c = _makeToken(2, 'c'); |
| 52 var d = _makeToken(3, 'd'); | 52 var d = _makeToken(3, 'd'); |
| 53 var e = _makeToken(4, 'e'); | 53 var e = _makeToken(4, 'e'); |
| 54 _link([a, b, e]); | 54 _link([a, b, e]); |
| 55 var rewriter = new TokenStreamRewriter(a); | 55 var rewriter = new TokenStreamRewriter(a); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 expect(c.next, same(d)); | 98 expect(c.next, same(d)); |
| 99 expect(d.next, same(e)); | 99 expect(d.next, same(e)); |
| 100 } | 100 } |
| 101 | 101 |
| 102 /// Links together the given [tokens] and adds an EOF token to the end of the | 102 /// Links together the given [tokens] and adds an EOF token to the end of the |
| 103 /// token stream. | 103 /// token stream. |
| 104 /// | 104 /// |
| 105 /// The EOF token is returned. | 105 /// The EOF token is returned. |
| 106 Token _link(Iterable<Token> tokens) { | 106 Token _link(Iterable<Token> tokens) { |
| 107 Token head = new SymbolToken.eof(-1); | 107 Token head = new SymbolToken.eof(-1); |
| 108 if (!setPrevious) head.previousToken = null; | 108 if (!setPrevious) head.previous = null; |
| 109 for (var token in tokens) { | 109 for (var token in tokens) { |
| 110 head.next = token; | 110 head.next = token; |
| 111 if (setPrevious) token.previousToken = head; | 111 if (setPrevious) token.previous = head; |
| 112 head = token; | 112 head = token; |
| 113 } | 113 } |
| 114 int eofOffset = head.charOffset + head.lexeme.length; | 114 int eofOffset = head.charOffset + head.lexeme.length; |
| 115 if (eofOffset < 0) eofOffset = 0; | 115 if (eofOffset < 0) eofOffset = 0; |
| 116 Token eof = new SymbolToken.eof(eofOffset); | 116 Token eof = new SymbolToken.eof(eofOffset); |
| 117 if (!setPrevious) eof.previousToken = null; | 117 if (!setPrevious) eof.previous = null; |
| 118 head.next = eof; | 118 head.next = eof; |
| 119 if (setPrevious) eof.previousToken = head; | 119 if (setPrevious) eof.previous = head; |
| 120 return eof; | 120 return eof; |
| 121 } | 121 } |
| 122 | 122 |
| 123 BeginGroupToken _makeBeginGroupToken(int charOffset) { | 123 BeginGroupToken _makeBeginGroupToken(int charOffset) { |
| 124 return new BeginGroupToken(TokenType.OPEN_PAREN, charOffset); | 124 return new BeginGroupToken(TokenType.OPEN_PAREN, charOffset); |
| 125 } | 125 } |
| 126 | 126 |
| 127 StringToken _makeToken(int charOffset, String text) { | 127 StringToken _makeToken(int charOffset, String text) { |
| 128 return new StringToken.fromString(null, text, charOffset); | 128 return new StringToken.fromString(null, text, charOffset); |
| 129 } | 129 } |
| 130 } | 130 } |
| 131 | 131 |
| 132 /// Concrete implementation of [TokenStreamRewriterTest] in which | 132 /// Concrete implementation of [TokenStreamRewriterTest] in which |
| 133 /// [Token.previousToken] values are set to null. | 133 /// [Token.previous] values are set to null. |
| 134 /// | 134 /// |
| 135 /// This forces [TokenStreamRewriter] to use its more complex heursitc for | 135 /// This forces [TokenStreamRewriter] to use its more complex heursitc for |
| 136 /// finding previous tokens. | 136 /// finding previous tokens. |
| 137 @reflectiveTest | 137 @reflectiveTest |
| 138 class TokenStreamRewriterTest_NoPrevious extends TokenStreamRewriterTest { | 138 class TokenStreamRewriterTest_NoPrevious extends TokenStreamRewriterTest { |
| 139 bool get setPrevious => false; | 139 bool get setPrevious => false; |
| 140 } | 140 } |
| 141 | 141 |
| 142 /// Concrete implementation of [TokenStreamRewriterTest] in which | 142 /// Concrete implementation of [TokenStreamRewriterTest] in which |
| 143 /// [Token.previousToken] values are set to non-null. | 143 /// [Token.previous] values are set to non-null. |
| 144 /// | 144 /// |
| 145 /// Since [TokenStreamRewriter] makes use of [Token.previousToken] when it can, | 145 /// Since [TokenStreamRewriter] makes use of [Token.previous] when it can, |
| 146 /// these tests do not exercise the more complex heuristics for finding previous | 146 /// these tests do not exercise the more complex heuristics for finding previous |
| 147 /// tokens. | 147 /// tokens. |
| 148 @reflectiveTest | 148 @reflectiveTest |
| 149 class TokenStreamRewriterTest_UsingPrevious extends TokenStreamRewriterTest { | 149 class TokenStreamRewriterTest_UsingPrevious extends TokenStreamRewriterTest { |
| 150 bool get setPrevious => true; | 150 bool get setPrevious => true; |
| 151 } | 151 } |
| OLD | NEW |