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

Side by Side Diff: pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart

Issue 2732193007: Create a TokenStreamRewriter class. (Closed)
Patch Set: Created 3 years, 9 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
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 import 'package:front_end/src/fasta/parser/token_stream_rewriter.dart';
6 import 'package:front_end/src/fasta/scanner/precedence.dart';
7 import 'package:front_end/src/fasta/scanner/token.dart';
8 import 'package:test/test.dart';
9 import 'package:test_reflective_loader/test_reflective_loader.dart';
ahe 2017/03/09 13:47:08 At some point we should talk about test frameworks
10
11 main() {
12 defineReflectiveSuite(() {
13 defineReflectiveTests(TokenStreamRewriterTest_NoPrevious);
14 defineReflectiveTests(TokenStreamRewriterTest_UsingPrevious);
15 });
16 }
17
18 /// Abstract base class for tests of [TokenStreamRewriter].
19 abstract class TokenStreamRewriterTest {
20 /// Indicates whether the tests should set up [Token.previousToken].
21 bool get setPrevious;
22
23 void test_insert_at_end() {
24 var a = _makeToken(0, 'a');
25 var b = _makeToken(1, 'b');
26 var eof = _link([a]);
27 var rewriter = new TokenStreamRewriter(a);
28 rewriter.insertTokenBefore(b, eof);
29 expect(rewriter.firstToken, same(a));
30 expect(a.next, same(b));
31 expect(b.next, same(eof));
32 expect(eof.previousToken, same(b));
33 expect(b.previousToken, same(a));
34 }
35
36 void test_insert_at_start() {
37 var a = _makeToken(0, 'a');
38 var b = _makeToken(1, 'b');
39 _link([b]);
40 var rewriter = new TokenStreamRewriter(b);
41 rewriter.insertTokenBefore(a, b);
42 expect(rewriter.firstToken, same(a));
43 expect(a.next, same(b));
44 expect(a.previousToken.next, same(a));
45 expect(b.previousToken, same(a));
46 }
47
48 void test_resume_at_previous_insertion_point() {
49 var a = _makeToken(0, 'a');
50 var b = _makeToken(1, 'b');
51 var c = _makeToken(2, 'c');
52 var d = _makeToken(3, 'd');
53 var e = _makeToken(4, 'e');
54 _link([a, b, e]);
55 var rewriter = new TokenStreamRewriter(a);
56 rewriter.insertTokenBefore(d, e);
57 expect(b.next, same(d));
58 expect(d.next, same(e));
59 a.next = null;
60 // The next call to rewriter should be able to find the insertion point
61 // without using a.next.
62 rewriter.insertTokenBefore(c, d);
63 expect(b.next, same(c));
64 expect(c.next, same(d));
65 }
66
67 void test_second_insertion_earlier_in_stream() {
68 var a = _makeToken(0, 'a');
69 var b = _makeToken(1, 'b');
70 var c = _makeToken(2, 'c');
71 var d = _makeToken(3, 'd');
72 var e = _makeToken(4, 'e');
73 _link([a, c, e]);
74 var rewriter = new TokenStreamRewriter(a);
75 rewriter.insertTokenBefore(d, e);
76 expect(c.next, same(d));
77 expect(d.next, same(e));
78 // The next call to rewriter should be able to find the insertion point
79 // even though it is before the insertion point used above.
80 rewriter.insertTokenBefore(b, c);
81 expect(a.next, same(b));
82 expect(b.next, same(c));
83 }
84
85 void test_skip_group() {
86 var a = _makeBeginGroupToken(0);
87 var b = _makeToken(1, 'b');
88 var c = _makeToken(2, 'c');
89 var d = _makeToken(3, 'd');
90 var e = _makeToken(4, 'e');
91 a.endGroup = c;
92 _link([a, b, c, e]);
93 // The rewriter should skip from a to c when finding the insertion position;
94 // we test this by corrupting b's next pointer.
95 b.next = null;
96 var rewriter = new TokenStreamRewriter(a);
97 rewriter.insertTokenBefore(d, e);
98 expect(c.next, same(d));
99 expect(d.next, same(e));
100 }
101
102 /// Links together the given [tokens] and adds an EOF token to the end of the
103 /// token stream.
104 ///
105 /// The EOF token is returned.
106 Token _link(Iterable<Token> tokens) {
107 Token head = new SymbolToken(EOF_INFO, -1);
108 for (var token in tokens) {
109 head.next = token;
110 if (setPrevious) token.previousToken = head;
111 head = token;
112 }
113 int eofOffset = head.charOffset + head.value.length;
114 if (eofOffset < 0) eofOffset = 0;
115 Token eof = new SymbolToken(EOF_INFO, eofOffset);
116 head.next = eof;
117 if (setPrevious) eof.previousToken = head;
118 return eof;
119 }
120
121 BeginGroupToken _makeBeginGroupToken(int charOffset) {
122 return new BeginGroupToken(OPEN_PAREN_INFO, charOffset);
123 }
124
125 StringToken _makeToken(int charOffset, String text) {
126 return new StringToken.fromString(null, text, charOffset);
127 }
128 }
129
130 /// Concrete implementation of [TokenStreamRewriterTest] in which
131 /// [Token.previousToken] values are set to null.
132 ///
133 /// This forces [TokenStreamRewriter] to use its more complex heursitc for
134 /// finding previous tokens.
135 @reflectiveTest
136 class TokenStreamRewriterTest_NoPrevious extends TokenStreamRewriterTest {
137 bool get setPrevious => false;
138 }
139
140 /// Concrete implementation of [TokenStreamRewriterTest] in which
141 /// [Token.previousToken] values are set to non-null.
142 ///
143 /// Since [TokenStreamRewriter] makes use of [Token.previousToken] when it can,
144 /// these tests do not exercise the more complex heuristics for finding previous
145 /// tokens.
146 @reflectiveTest
147 class TokenStreamRewriterTest_UsingPrevious extends TokenStreamRewriterTest {
148 bool get setPrevious => true;
149 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698