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 'dart:async'; | 5 import 'dart:async'; |
6 | 6 |
7 import 'package:front_end/memory_file_system.dart'; | 7 import 'package:front_end/memory_file_system.dart'; |
8 import 'package:front_end/src/fasta/uri_translator_impl.dart'; | 8 import 'package:front_end/src/fasta/uri_translator_impl.dart'; |
9 import 'package:front_end/src/incremental/byte_store.dart'; | 9 import 'package:front_end/src/incremental/byte_store.dart'; |
10 import 'package:front_end/src/incremental/file_state.dart'; | 10 import 'package:front_end/src/incremental/file_state.dart'; |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 } | 142 } |
143 baz() => 44; | 143 baz() => 44; |
144 '''); | 144 '''); |
145 } | 145 } |
146 | 146 |
147 test_gc() async { | 147 test_gc() async { |
148 var a = writeFile('/a.dart', ''); | 148 var a = writeFile('/a.dart', ''); |
149 var b = writeFile('/b.dart', ''); | 149 var b = writeFile('/b.dart', ''); |
150 var c = writeFile('/c.dart', 'import "a.dart";'); | 150 var c = writeFile('/c.dart', 'import "a.dart";'); |
151 var d = writeFile('/d.dart', 'import "b.dart";'); | 151 var d = writeFile('/d.dart', 'import "b.dart";'); |
152 var e = writeFile( | 152 var e = writeFile('/e.dart', r''' |
153 '/e.dart', | |
154 r''' | |
155 import "c.dart"; | 153 import "c.dart"; |
156 import "d.dart"; | 154 import "d.dart"; |
157 '''); | 155 '''); |
158 | 156 |
159 var eFile = await fsState.getFile(e); | 157 var eFile = await fsState.getFile(e); |
160 | 158 |
161 // The root and four files. | 159 // The root and four files. |
162 expect(fsState.fileUris, contains(e)); | 160 expect(fsState.fileUris, contains(e)); |
163 expect(fsState.fileUris, contains(a)); | 161 expect(fsState.fileUris, contains(a)); |
164 expect(fsState.fileUris, contains(b)); | 162 expect(fsState.fileUris, contains(b)); |
165 expect(fsState.fileUris, contains(c)); | 163 expect(fsState.fileUris, contains(c)); |
166 expect(fsState.fileUris, contains(d)); | 164 expect(fsState.fileUris, contains(d)); |
167 | 165 |
168 // No changes after GC. | 166 // No changes after GC. |
169 expect(fsState.gc(e), isEmpty); | 167 expect(fsState.gc(e), isEmpty); |
170 expect(fsState.fileUris, contains(e)); | 168 expect(fsState.fileUris, contains(e)); |
171 expect(fsState.fileUris, contains(a)); | 169 expect(fsState.fileUris, contains(a)); |
172 expect(fsState.fileUris, contains(b)); | 170 expect(fsState.fileUris, contains(b)); |
173 expect(fsState.fileUris, contains(c)); | 171 expect(fsState.fileUris, contains(c)); |
174 expect(fsState.fileUris, contains(d)); | 172 expect(fsState.fileUris, contains(d)); |
175 | 173 |
176 // Update e.dart so that it does not reference c.dart anymore. | 174 // Update e.dart so that it does not reference c.dart anymore. |
177 // Then GC removes both c.dart and a.dart it references. | 175 // Then GC removes both c.dart and a.dart it references. |
178 writeFile( | 176 writeFile('/e.dart', r''' |
179 '/e.dart', | |
180 r''' | |
181 import "d.dart"; | 177 import "d.dart"; |
182 '''); | 178 '''); |
183 await eFile.refresh(); | 179 await eFile.refresh(); |
184 { | 180 { |
185 var gcFiles = fsState.gc(e); | 181 var gcFiles = fsState.gc(e); |
186 expect(gcFiles.map((file) => file.uri), unorderedEquals([a, c])); | 182 expect(gcFiles.map((file) => file.uri), unorderedEquals([a, c])); |
187 } | 183 } |
188 expect(fsState.fileUris, contains(e)); | 184 expect(fsState.fileUris, contains(e)); |
189 expect(fsState.fileUris, isNot(contains(a))); | 185 expect(fsState.fileUris, isNot(contains(a))); |
190 expect(fsState.fileUris, contains(b)); | 186 expect(fsState.fileUris, contains(b)); |
191 expect(fsState.fileUris, isNot(contains(c))); | 187 expect(fsState.fileUris, isNot(contains(c))); |
192 expect(fsState.fileUris, contains(d)); | 188 expect(fsState.fileUris, contains(d)); |
193 } | 189 } |
194 | 190 |
195 test_getFile() async { | 191 test_getFile() async { |
196 var a = writeFile('/a.dart', ''); | 192 var a = writeFile('/a.dart', ''); |
197 var b = writeFile('/b.dart', ''); | 193 var b = writeFile('/b.dart', ''); |
198 var c = writeFile('/c.dart', ''); | 194 var c = writeFile('/c.dart', ''); |
199 var d = writeFile( | 195 var d = writeFile('/d.dart', r''' |
200 '/d.dart', | |
201 r''' | |
202 import "a.dart"; | 196 import "a.dart"; |
203 export "b.dart"; | 197 export "b.dart"; |
204 part "c.dart"; | 198 part "c.dart"; |
205 '''); | 199 '''); |
206 | 200 |
207 FileState aFile = await fsState.getFile(a); | 201 FileState aFile = await fsState.getFile(a); |
208 FileState bFile = await fsState.getFile(b); | 202 FileState bFile = await fsState.getFile(b); |
209 FileState cFile = await fsState.getFile(c); | 203 FileState cFile = await fsState.getFile(c); |
210 FileState dFile = await fsState.getFile(d); | 204 FileState dFile = await fsState.getFile(d); |
211 | 205 |
(...skipping 14 matching lines...) Expand all Loading... |
226 expect(bFile.exists, isTrue); | 220 expect(bFile.exists, isTrue); |
227 _assertImportedUris(bFile, [_coreUri]); | 221 _assertImportedUris(bFile, [_coreUri]); |
228 expect(bFile.exportedLibraries, isEmpty); | 222 expect(bFile.exportedLibraries, isEmpty); |
229 expect(bFile.partFiles, isEmpty); | 223 expect(bFile.partFiles, isEmpty); |
230 } | 224 } |
231 | 225 |
232 test_getFile_exports() async { | 226 test_getFile_exports() async { |
233 var a = writeFile('/a.dart', ''); | 227 var a = writeFile('/a.dart', ''); |
234 var b = writeFile('/b.dart', ''); | 228 var b = writeFile('/b.dart', ''); |
235 var c = writeFile('/c.dart', ''); | 229 var c = writeFile('/c.dart', ''); |
236 var d = writeFile( | 230 var d = writeFile('/d.dart', r''' |
237 '/d.dart', | |
238 r''' | |
239 export "a.dart" show A, B; | 231 export "a.dart" show A, B; |
240 export "b.dart" hide C, D; | 232 export "b.dart" hide C, D; |
241 export "c.dart" show A, B, C, D hide C show A, D; | 233 export "c.dart" show A, B, C, D hide C show A, D; |
242 '''); | 234 '''); |
243 | 235 |
244 FileState aFile = await fsState.getFile(a); | 236 FileState aFile = await fsState.getFile(a); |
245 FileState bFile = await fsState.getFile(b); | 237 FileState bFile = await fsState.getFile(b); |
246 FileState cFile = await fsState.getFile(c); | 238 FileState cFile = await fsState.getFile(c); |
247 FileState dFile = await fsState.getFile(d); | 239 FileState dFile = await fsState.getFile(d); |
248 | 240 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 expect(export_.combinators[2].isShow, isTrue); | 273 expect(export_.combinators[2].isShow, isTrue); |
282 expect(export_.combinators[2].names, unorderedEquals(['A', 'D'])); | 274 expect(export_.combinators[2].names, unorderedEquals(['A', 'D'])); |
283 expect(export_.isExposed('A'), isTrue); | 275 expect(export_.isExposed('A'), isTrue); |
284 expect(export_.isExposed('B'), isFalse); | 276 expect(export_.isExposed('B'), isFalse); |
285 expect(export_.isExposed('C'), isFalse); | 277 expect(export_.isExposed('C'), isFalse); |
286 expect(export_.isExposed('D'), isTrue); | 278 expect(export_.isExposed('D'), isTrue); |
287 } | 279 } |
288 } | 280 } |
289 | 281 |
290 test_hasMixinApplication_false() async { | 282 test_hasMixinApplication_false() async { |
291 writeFile( | 283 writeFile('/a.dart', r''' |
292 '/a.dart', | |
293 r''' | |
294 class A {} | 284 class A {} |
295 class B extends Object with A {} | 285 class B extends Object with A {} |
296 '''); | 286 '''); |
297 var uri = writeFile( | 287 var uri = writeFile('/test.dart', r''' |
298 '/test.dart', | |
299 r''' | |
300 import 'a.dart'; | 288 import 'a.dart'; |
301 class T1 extends A {} | 289 class T1 extends A {} |
302 class T2 extends B {} | 290 class T2 extends B {} |
303 '''); | 291 '''); |
304 FileState file = await fsState.getFile(uri); | 292 FileState file = await fsState.getFile(uri); |
305 expect(file.hasMixinApplication, isFalse); | 293 expect(file.hasMixinApplication, isFalse); |
306 } | 294 } |
307 | 295 |
308 test_hasMixinApplication_true_class() async { | 296 test_hasMixinApplication_true_class() async { |
309 var uri = writeFile( | 297 var uri = writeFile('/test.dart', r''' |
310 '/test.dart', | |
311 r''' | |
312 class A {} | 298 class A {} |
313 class B extends Object with A {} | 299 class B extends Object with A {} |
314 '''); | 300 '''); |
315 FileState file = await fsState.getFile(uri); | 301 FileState file = await fsState.getFile(uri); |
316 expect(file.hasMixinApplication, isTrue); | 302 expect(file.hasMixinApplication, isTrue); |
317 } | 303 } |
318 | 304 |
319 test_hasMixinApplication_true_named() async { | 305 test_hasMixinApplication_true_named() async { |
320 var uri = writeFile( | 306 var uri = writeFile('/test.dart', r''' |
321 '/test.dart', | |
322 r''' | |
323 class A {} | 307 class A {} |
324 class B = Object with A; | 308 class B = Object with A; |
325 '''); | 309 '''); |
326 FileState file = await fsState.getFile(uri); | 310 FileState file = await fsState.getFile(uri); |
327 expect(file.hasMixinApplication, isTrue); | 311 expect(file.hasMixinApplication, isTrue); |
328 } | 312 } |
329 | 313 |
330 test_hasMixinApplicationLibrary_false() async { | 314 test_hasMixinApplicationLibrary_false() async { |
331 var partUri = writeFile( | 315 var partUri = writeFile('/part.dart', r''' |
332 '/part.dart', | |
333 r''' | |
334 part of test; | 316 part of test; |
335 class A {} | 317 class A {} |
336 '''); | 318 '''); |
337 var libUri = writeFile( | 319 var libUri = writeFile('/test.dart', r''' |
338 '/test.dart', | |
339 r''' | |
340 library test; | 320 library test; |
341 part 'part.dart'; | 321 part 'part.dart'; |
342 class B extends A {} | 322 class B extends A {} |
343 '''); | 323 '''); |
344 | 324 |
345 FileState part = await fsState.getFile(partUri); | 325 FileState part = await fsState.getFile(partUri); |
346 FileState lib = await fsState.getFile(libUri); | 326 FileState lib = await fsState.getFile(libUri); |
347 | 327 |
348 expect(part.hasMixinApplication, isFalse); | 328 expect(part.hasMixinApplication, isFalse); |
349 expect(lib.hasMixinApplication, isFalse); | 329 expect(lib.hasMixinApplication, isFalse); |
350 expect(lib.hasMixinApplicationLibrary, isFalse); | 330 expect(lib.hasMixinApplicationLibrary, isFalse); |
351 } | 331 } |
352 | 332 |
353 test_hasMixinApplicationLibrary_true_inDefiningUnit() async { | 333 test_hasMixinApplicationLibrary_true_inDefiningUnit() async { |
354 var partUri = writeFile( | 334 var partUri = writeFile('/part.dart', r''' |
355 '/part.dart', | |
356 r''' | |
357 part of test; | 335 part of test; |
358 class A {} | 336 class A {} |
359 '''); | 337 '''); |
360 var libUri = writeFile( | 338 var libUri = writeFile('/test.dart', r''' |
361 '/test.dart', | |
362 r''' | |
363 library test; | 339 library test; |
364 part 'part.dart'; | 340 part 'part.dart'; |
365 class B extends Object with A {} | 341 class B extends Object with A {} |
366 '''); | 342 '''); |
367 | 343 |
368 FileState part = await fsState.getFile(partUri); | 344 FileState part = await fsState.getFile(partUri); |
369 FileState lib = await fsState.getFile(libUri); | 345 FileState lib = await fsState.getFile(libUri); |
370 | 346 |
371 expect(part.hasMixinApplication, isFalse); | 347 expect(part.hasMixinApplication, isFalse); |
372 expect(lib.hasMixinApplication, isTrue); | 348 expect(lib.hasMixinApplication, isTrue); |
373 expect(lib.hasMixinApplicationLibrary, isTrue); | 349 expect(lib.hasMixinApplicationLibrary, isTrue); |
374 } | 350 } |
375 | 351 |
376 test_hasMixinApplicationLibrary_true_inPart() async { | 352 test_hasMixinApplicationLibrary_true_inPart() async { |
377 var partUri = writeFile( | 353 var partUri = writeFile('/part.dart', r''' |
378 '/part.dart', | |
379 r''' | |
380 part of test; | 354 part of test; |
381 class A {} | 355 class A {} |
382 class B extends Object with A {} | 356 class B extends Object with A {} |
383 '''); | 357 '''); |
384 var libUri = writeFile( | 358 var libUri = writeFile('/test.dart', r''' |
385 '/test.dart', | |
386 r''' | |
387 library test; | 359 library test; |
388 part 'part.dart'; | 360 part 'part.dart'; |
389 class C {} | 361 class C {} |
390 '''); | 362 '''); |
391 | 363 |
392 FileState part = await fsState.getFile(partUri); | 364 FileState part = await fsState.getFile(partUri); |
393 FileState lib = await fsState.getFile(libUri); | 365 FileState lib = await fsState.getFile(libUri); |
394 | 366 |
395 expect(part.hasMixinApplication, isTrue); | 367 expect(part.hasMixinApplication, isTrue); |
396 expect(lib.hasMixinApplication, isFalse); | 368 expect(lib.hasMixinApplication, isFalse); |
397 expect(lib.hasMixinApplicationLibrary, isTrue); | 369 expect(lib.hasMixinApplicationLibrary, isTrue); |
398 } | 370 } |
399 | 371 |
400 test_newFileListener() async { | 372 test_newFileListener() async { |
401 var a = writeFile('/a.dart', ''); | 373 var a = writeFile('/a.dart', ''); |
402 var b = writeFile('/b.dart', ''); | 374 var b = writeFile('/b.dart', ''); |
403 var c = writeFile( | 375 var c = writeFile('/c.dart', r''' |
404 '/c.dart', | |
405 r''' | |
406 import 'a.dart'; | 376 import 'a.dart'; |
407 '''); | 377 '''); |
408 | 378 |
409 FileState cFile = await fsState.getFile(c); | 379 FileState cFile = await fsState.getFile(c); |
410 | 380 |
411 // c.dart uses c.dart and a.dart, but not b.dart yet. | 381 // c.dart uses c.dart and a.dart, but not b.dart yet. |
412 expect(_newFileUris, contains(c)); | 382 expect(_newFileUris, contains(c)); |
413 expect(_newFileUris, contains(a)); | 383 expect(_newFileUris, contains(a)); |
414 expect(_newFileUris, isNot(contains(b))); | 384 expect(_newFileUris, isNot(contains(b))); |
415 _newFileUris.clear(); | 385 _newFileUris.clear(); |
416 | 386 |
417 // Update c.dart to use b.dart too. | 387 // Update c.dart to use b.dart too. |
418 writeFile( | 388 writeFile('/c.dart', r''' |
419 '/c.dart', | |
420 r''' | |
421 import 'a.dart'; | 389 import 'a.dart'; |
422 import 'b.dart'; | 390 import 'b.dart'; |
423 '''); | 391 '''); |
424 await cFile.refresh(); | 392 await cFile.refresh(); |
425 | 393 |
426 // b.dart is the only new file. | 394 // b.dart is the only new file. |
427 expect(_newFileUris, [b]); | 395 expect(_newFileUris, [b]); |
428 } | 396 } |
429 | 397 |
430 test_topologicalOrder_cycleBeforeTarget() async { | 398 test_topologicalOrder_cycleBeforeTarget() async { |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 Iterable<Uri> importedUris = _toUris(file.importedLibraries); | 503 Iterable<Uri> importedUris = _toUris(file.importedLibraries); |
536 expect(importedUris, unorderedEquals(expectedUris)); | 504 expect(importedUris, unorderedEquals(expectedUris)); |
537 } | 505 } |
538 | 506 |
539 Iterable<Uri> _toUris(List<FileState> files) { | 507 Iterable<Uri> _toUris(List<FileState> files) { |
540 return files.map((f) => f.uri); | 508 return files.map((f) => f.uri); |
541 } | 509 } |
542 | 510 |
543 Uri _writeFileDirectives(String path, | 511 Uri _writeFileDirectives(String path, |
544 {List<String> imports: const [], List<String> exports: const []}) { | 512 {List<String> imports: const [], List<String> exports: const []}) { |
545 return writeFile( | 513 return writeFile(path, ''' |
546 path, | |
547 ''' | |
548 ${imports.map((uri) => 'import "$uri";').join('\n')} | 514 ${imports.map((uri) => 'import "$uri";').join('\n')} |
549 ${exports.map((uri) => 'export "$uri";').join('\n')} | 515 ${exports.map((uri) => 'export "$uri";').join('\n')} |
550 '''); | 516 '''); |
551 } | 517 } |
552 } | 518 } |
OLD | NEW |