Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 library test.src.serialization.elements_test; | 5 library test.src.serialization.elements_test; |
| 6 | 6 |
| 7 import 'dart:convert'; | 7 import 'dart:convert'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/constant/value.dart'; | 10 import 'package:analyzer/dart/constant/value.dart'; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 */ | 42 */ |
| 43 abstract class AbstractResynthesizeTest extends AbstractSingleUnitTest { | 43 abstract class AbstractResynthesizeTest extends AbstractSingleUnitTest { |
| 44 Set<Source> otherLibrarySources = new Set<Source>(); | 44 Set<Source> otherLibrarySources = new Set<Source>(); |
| 45 | 45 |
| 46 /** | 46 /** |
| 47 * Names of variables which have initializers that are not valid constants, | 47 * Names of variables which have initializers that are not valid constants, |
| 48 * so they are not resynthesized. | 48 * so they are not resynthesized. |
| 49 */ | 49 */ |
| 50 Set<String> variablesWithNotConstInitializers = new Set<String>(); | 50 Set<String> variablesWithNotConstInitializers = new Set<String>(); |
| 51 | 51 |
| 52 /** | |
| 53 * Tests may set this to `true` to indicate that a missing file at the time of | |
|
Brian Wilkerson
2016/08/11 23:49:35
Seems odd to talk about setting a getter to `true`
Paul Berry
2016/08/12 20:56:51
Resolved in an offline discussion. There was a sl
| |
| 54 * summary resynthesis shouldn't trigger an error. | |
| 55 */ | |
| 56 bool get allowMissingFiles; | |
| 57 | |
| 52 bool get checkPropagatedTypes => true; | 58 bool get checkPropagatedTypes => true; |
| 53 | 59 |
| 54 void addLibrary(String uri) { | 60 void addLibrary(String uri) { |
| 55 otherLibrarySources.add(context.sourceFactory.forUri(uri)); | 61 otherLibrarySources.add(context.sourceFactory.forUri(uri)); |
| 56 } | 62 } |
| 57 | 63 |
| 58 Source addLibrarySource(String filePath, String contents) { | 64 Source addLibrarySource(String filePath, String contents) { |
| 59 Source source = addSource(filePath, contents); | 65 Source source = addSource(filePath, contents); |
| 60 otherLibrarySources.add(source); | 66 otherLibrarySources.add(source); |
| 61 return source; | 67 return source; |
| (...skipping 1115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1177 } | 1183 } |
| 1178 if (dumpSummaries) { | 1184 if (dumpSummaries) { |
| 1179 unlinkedSummaries.forEach((String path, UnlinkedUnit unit) { | 1185 unlinkedSummaries.forEach((String path, UnlinkedUnit unit) { |
| 1180 print('Unlinked $path: ${JSON.encode(canonicalize(unit))}'); | 1186 print('Unlinked $path: ${JSON.encode(canonicalize(unit))}'); |
| 1181 }); | 1187 }); |
| 1182 linkedSummaries.forEach((String path, LinkedLibrary lib) { | 1188 linkedSummaries.forEach((String path, LinkedLibrary lib) { |
| 1183 print('Linked $path: ${JSON.encode(canonicalize(lib))}'); | 1189 print('Linked $path: ${JSON.encode(canonicalize(lib))}'); |
| 1184 }); | 1190 }); |
| 1185 } | 1191 } |
| 1186 return new TestSummaryResynthesizer( | 1192 return new TestSummaryResynthesizer( |
| 1187 null, context, unlinkedSummaries, linkedSummaries); | 1193 null, context, unlinkedSummaries, linkedSummaries, allowMissingFiles); |
| 1188 } | 1194 } |
| 1189 | 1195 |
| 1190 ElementImpl getActualElement(Element element, String desc) { | 1196 ElementImpl getActualElement(Element element, String desc) { |
| 1191 if (element == null) { | 1197 if (element == null) { |
| 1192 return null; | 1198 return null; |
| 1193 } else if (element is ElementImpl) { | 1199 } else if (element is ElementImpl) { |
| 1194 return element; | 1200 return element; |
| 1195 } else if (element is ElementHandle) { | 1201 } else if (element is ElementHandle) { |
| 1196 Element actualElement = element.actualElement; | 1202 Element actualElement = element.actualElement; |
| 1197 // A handle should never point to a member, because if it did, then | 1203 // A handle should never point to a member, because if it did, then |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1324 return element.isSetter; | 1330 return element.isSetter; |
| 1325 } | 1331 } |
| 1326 return false; | 1332 return false; |
| 1327 } else if (modifier == Modifier.STATIC) { | 1333 } else if (modifier == Modifier.STATIC) { |
| 1328 if (element is ExecutableElement) { | 1334 if (element is ExecutableElement) { |
| 1329 return element.isStatic; | 1335 return element.isStatic; |
| 1330 } | 1336 } |
| 1331 return false; | 1337 return false; |
| 1332 } else if (modifier == Modifier.SYNTHETIC) { | 1338 } else if (modifier == Modifier.SYNTHETIC) { |
| 1333 return element.isSynthetic; | 1339 return element.isSynthetic; |
| 1334 } else if (modifier == Modifier.URI_EXISTS) { | |
| 1335 if (element is ExportElement) { | |
| 1336 return element.uriExists; | |
| 1337 } else if (element is ImportElement) { | |
| 1338 return element.uriExists; | |
| 1339 } | |
| 1340 return false; | |
| 1341 } | 1340 } |
| 1342 throw new UnimplementedError( | 1341 throw new UnimplementedError( |
| 1343 'Modifier $modifier for ${element?.runtimeType}'); | 1342 'Modifier $modifier for ${element?.runtimeType}'); |
| 1344 } | 1343 } |
| 1345 } | 1344 } |
| 1346 | 1345 |
| 1347 @reflectiveTest | 1346 @reflectiveTest |
| 1348 class ResynthesizeElementTest extends ResynthesizeTest { | 1347 class ResynthesizeElementTest extends ResynthesizeTest { |
| 1349 @override | 1348 @override |
| 1349 bool allowMissingFiles = false; | |
| 1350 | |
| 1351 @override | |
| 1350 LibraryElementImpl checkLibrary(String text, | 1352 LibraryElementImpl checkLibrary(String text, |
| 1351 {bool allowErrors: false, bool dumpSummaries: false}) { | 1353 {bool allowErrors: false, bool dumpSummaries: false}) { |
| 1352 Source source = addTestSource(text); | 1354 Source source = addTestSource(text); |
| 1353 LibraryElementImpl original = context.computeLibraryElement(source); | 1355 LibraryElementImpl original = context.computeLibraryElement(source); |
| 1354 LibraryElementImpl resynthesized = resynthesizeLibraryElement( | 1356 LibraryElementImpl resynthesized = resynthesizeLibraryElement( |
| 1355 encodeLibrary(original, | 1357 encodeLibrary(original, |
| 1356 allowErrors: allowErrors, dumpSummaries: dumpSummaries), | 1358 allowErrors: allowErrors, dumpSummaries: dumpSummaries), |
| 1357 source.uri.toString(), | 1359 source.uri.toString(), |
| 1358 original); | 1360 original); |
| 1359 checkLibraryElements(original, resynthesized); | 1361 checkLibraryElements(original, resynthesized); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1415 } | 1417 } |
| 1416 if (dumpSummaries) { | 1418 if (dumpSummaries) { |
| 1417 unlinkedSummaries.forEach((String path, UnlinkedUnit unit) { | 1419 unlinkedSummaries.forEach((String path, UnlinkedUnit unit) { |
| 1418 print('Unlinked $path: ${JSON.encode(canonicalize(unit))}'); | 1420 print('Unlinked $path: ${JSON.encode(canonicalize(unit))}'); |
| 1419 }); | 1421 }); |
| 1420 linkedSummaries.forEach((String path, LinkedLibrary lib) { | 1422 linkedSummaries.forEach((String path, LinkedLibrary lib) { |
| 1421 print('Linked $path: ${JSON.encode(canonicalize(lib))}'); | 1423 print('Linked $path: ${JSON.encode(canonicalize(lib))}'); |
| 1422 }); | 1424 }); |
| 1423 } | 1425 } |
| 1424 return new TestSummaryResynthesizer( | 1426 return new TestSummaryResynthesizer( |
| 1425 null, context, unlinkedSummaries, linkedSummaries); | 1427 null, context, unlinkedSummaries, linkedSummaries, allowMissingFiles); |
| 1426 } | 1428 } |
| 1427 | 1429 |
| 1428 /** | 1430 /** |
| 1429 * Resynthesize the library element associated with [uri] using | 1431 * Resynthesize the library element associated with [uri] using |
| 1430 * [resynthesizer], and verify that it only had to consult one summary in | 1432 * [resynthesizer], and verify that it only had to consult one summary in |
| 1431 * order to do so. [original] is consulted merely to verify that no | 1433 * order to do so. [original] is consulted merely to verify that no |
| 1432 * unnecessary resynthesis work was performed. | 1434 * unnecessary resynthesis work was performed. |
| 1433 */ | 1435 */ |
| 1434 LibraryElementImpl resynthesizeLibraryElement( | 1436 LibraryElementImpl resynthesizeLibraryElement( |
| 1435 TestSummaryResynthesizer resynthesizer, | 1437 TestSummaryResynthesizer resynthesizer, |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 1447 LibraryElementImpl original = | 1449 LibraryElementImpl original = |
| 1448 context.computeLibraryElement(context.sourceFactory.forUri(uri)); | 1450 context.computeLibraryElement(context.sourceFactory.forUri(uri)); |
| 1449 LibraryElementImpl resynthesized = resynthesizeLibraryElement( | 1451 LibraryElementImpl resynthesized = resynthesizeLibraryElement( |
| 1450 encodeLibraryElement(original), uri, original); | 1452 encodeLibraryElement(original), uri, original); |
| 1451 checkLibraryElements(original, resynthesized); | 1453 checkLibraryElements(original, resynthesized); |
| 1452 } | 1454 } |
| 1453 } | 1455 } |
| 1454 | 1456 |
| 1455 @reflectiveTest | 1457 @reflectiveTest |
| 1456 abstract class ResynthesizeTest extends AbstractResynthesizeTest { | 1458 abstract class ResynthesizeTest extends AbstractResynthesizeTest { |
| 1459 /** | |
| 1460 * Tests may set this to `true` to indicate that a missing file at the time of | |
| 1461 * summary resynthesis shouldn't trigger an error. | |
| 1462 */ | |
| 1463 void set allowMissingFiles(bool value); | |
| 1464 | |
| 1457 LibraryElementImpl checkLibrary(String text, | 1465 LibraryElementImpl checkLibrary(String text, |
| 1458 {bool allowErrors: false, bool dumpSummaries: false}); | 1466 {bool allowErrors: false, bool dumpSummaries: false}); |
| 1459 | 1467 |
| 1460 /** | 1468 /** |
| 1461 * Return a [SummaryResynthesizer] to resynthesize the library with the | 1469 * Return a [SummaryResynthesizer] to resynthesize the library with the |
| 1462 * given [librarySource]. | 1470 * given [librarySource]. |
| 1463 */ | 1471 */ |
| 1464 SummaryResynthesizer encodeDecodeLibrarySource(Source librarySource); | 1472 SummaryResynthesizer encodeDecodeLibrarySource(Source librarySource); |
| 1465 | 1473 |
| 1466 fail_library_hasExtUri() { | 1474 fail_library_hasExtUri() { |
| (...skipping 3002 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4469 } | 4477 } |
| 4470 | 4478 |
| 4471 test_typedef_type_parameters_f_bound_simple() { | 4479 test_typedef_type_parameters_f_bound_simple() { |
| 4472 checkLibrary('typedef U F<T extends U, U>(T t);'); | 4480 checkLibrary('typedef U F<T extends U, U>(T t);'); |
| 4473 } | 4481 } |
| 4474 | 4482 |
| 4475 test_typedefs() { | 4483 test_typedefs() { |
| 4476 checkLibrary('f() {} g() {}'); | 4484 checkLibrary('f() {} g() {}'); |
| 4477 } | 4485 } |
| 4478 | 4486 |
| 4487 test_unresolved_export() { | |
| 4488 allowMissingFiles = true; | |
| 4489 checkLibrary("export 'foo.dart';", allowErrors: true); | |
| 4490 } | |
| 4491 | |
| 4492 test_unresolved_import() { | |
| 4493 allowMissingFiles = true; | |
| 4494 checkLibrary("import 'foo.dart';", allowErrors: true); | |
| 4495 } | |
| 4496 | |
| 4497 test_unresolved_part() { | |
| 4498 allowMissingFiles = true; | |
| 4499 checkLibrary("part 'foo.dart';", allowErrors: true); | |
| 4500 } | |
| 4501 | |
| 4479 test_unused_type_parameter() { | 4502 test_unused_type_parameter() { |
| 4480 checkLibrary(''' | 4503 checkLibrary(''' |
| 4481 class C<T> { | 4504 class C<T> { |
| 4482 void f() {} | 4505 void f() {} |
| 4483 } | 4506 } |
| 4484 C<int> c; | 4507 C<int> c; |
| 4485 var v = c.f; | 4508 var v = c.f; |
| 4486 '''); | 4509 '''); |
| 4487 } | 4510 } |
| 4488 | 4511 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4581 // the library element. | 4604 // the library element. |
| 4582 expect(resynthesizer.resynthesisCount, 1); | 4605 expect(resynthesizer.resynthesisCount, 1); |
| 4583 expect(result.location, location); | 4606 expect(result.location, location); |
| 4584 return result; | 4607 return result; |
| 4585 } | 4608 } |
| 4586 } | 4609 } |
| 4587 | 4610 |
| 4588 class TestSummaryResynthesizer extends SummaryResynthesizer { | 4611 class TestSummaryResynthesizer extends SummaryResynthesizer { |
| 4589 final Map<String, UnlinkedUnit> unlinkedSummaries; | 4612 final Map<String, UnlinkedUnit> unlinkedSummaries; |
| 4590 final Map<String, LinkedLibrary> linkedSummaries; | 4613 final Map<String, LinkedLibrary> linkedSummaries; |
| 4614 final bool allowMissingFiles; | |
| 4591 | 4615 |
| 4592 /** | 4616 /** |
| 4593 * The set of uris for which unlinked summaries have been requested using | 4617 * The set of uris for which unlinked summaries have been requested using |
| 4594 * [getUnlinkedSummary]. | 4618 * [getUnlinkedSummary]. |
| 4595 */ | 4619 */ |
| 4596 final Set<String> unlinkedSummariesRequested = new Set<String>(); | 4620 final Set<String> unlinkedSummariesRequested = new Set<String>(); |
| 4597 | 4621 |
| 4598 /** | 4622 /** |
| 4599 * The set of uris for which linked summaries have been requested using | 4623 * The set of uris for which linked summaries have been requested using |
| 4600 * [getLinkedSummary]. | 4624 * [getLinkedSummary]. |
| 4601 */ | 4625 */ |
| 4602 final Set<String> linkedSummariesRequested = new Set<String>(); | 4626 final Set<String> linkedSummariesRequested = new Set<String>(); |
| 4603 | 4627 |
| 4604 TestSummaryResynthesizer(SummaryResynthesizer parent, AnalysisContext context, | 4628 TestSummaryResynthesizer(SummaryResynthesizer parent, AnalysisContext context, |
| 4605 this.unlinkedSummaries, this.linkedSummaries) | 4629 this.unlinkedSummaries, this.linkedSummaries, this.allowMissingFiles) |
| 4606 : super(parent, context, context.typeProvider, context.sourceFactory, | 4630 : super(parent, context, context.typeProvider, context.sourceFactory, |
| 4607 context.analysisOptions.strongMode); | 4631 context.analysisOptions.strongMode); |
| 4608 | 4632 |
| 4609 @override | 4633 @override |
| 4610 LinkedLibrary getLinkedSummary(String uri) { | 4634 LinkedLibrary getLinkedSummary(String uri) { |
| 4611 linkedSummariesRequested.add(uri); | 4635 linkedSummariesRequested.add(uri); |
| 4612 LinkedLibrary serializedLibrary = linkedSummaries[uri]; | 4636 LinkedLibrary serializedLibrary = linkedSummaries[uri]; |
| 4613 if (serializedLibrary == null) { | 4637 if (serializedLibrary == null && !allowMissingFiles) { |
| 4614 fail('Unexpectedly tried to get linked summary for $uri'); | 4638 fail('Unexpectedly tried to get linked summary for $uri'); |
| 4615 } | 4639 } |
| 4616 return serializedLibrary; | 4640 return serializedLibrary; |
| 4617 } | 4641 } |
| 4618 | 4642 |
| 4619 @override | 4643 @override |
| 4620 UnlinkedUnit getUnlinkedSummary(String uri) { | 4644 UnlinkedUnit getUnlinkedSummary(String uri) { |
| 4621 unlinkedSummariesRequested.add(uri); | 4645 unlinkedSummariesRequested.add(uri); |
| 4622 UnlinkedUnit serializedUnit = unlinkedSummaries[uri]; | 4646 UnlinkedUnit serializedUnit = unlinkedSummaries[uri]; |
| 4623 if (serializedUnit == null) { | 4647 if (serializedUnit == null && !allowMissingFiles) { |
| 4624 fail('Unexpectedly tried to get unlinked summary for $uri'); | 4648 fail('Unexpectedly tried to get unlinked summary for $uri'); |
| 4625 } | 4649 } |
| 4626 return serializedUnit; | 4650 return serializedUnit; |
| 4627 } | 4651 } |
| 4628 | 4652 |
| 4629 @override | 4653 @override |
| 4630 bool hasLibrarySummary(String uri) { | 4654 bool hasLibrarySummary(String uri) { |
| 4631 return true; | 4655 return true; |
| 4632 } | 4656 } |
| 4633 } | 4657 } |
| OLD | NEW |