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/element/element.dart'; | 10 import 'package:analyzer/dart/element/element.dart'; |
(...skipping 21 matching lines...) Expand all Loading... |
32 main() { | 32 main() { |
33 groupSep = ' | '; | 33 groupSep = ' | '; |
34 runReflectiveTests(ResynthTest); | 34 runReflectiveTests(ResynthTest); |
35 } | 35 } |
36 | 36 |
37 @reflectiveTest | 37 @reflectiveTest |
38 class ResynthTest extends ResolverTestCase { | 38 class ResynthTest extends ResolverTestCase { |
39 Set<Source> otherLibrarySources = new Set<Source>(); | 39 Set<Source> otherLibrarySources = new Set<Source>(); |
40 bool constantInitializersAreInvalid = false; | 40 bool constantInitializersAreInvalid = false; |
41 | 41 |
42 /** | |
43 * Determine the analysis options that should be used for this test. | |
44 */ | |
45 AnalysisOptionsImpl createOptions() => | |
46 new AnalysisOptionsImpl()..enableGenericMethods = true; | |
47 | |
48 void addLibrary(String uri) { | 42 void addLibrary(String uri) { |
49 otherLibrarySources.add(analysisContext2.sourceFactory.forUri(uri)); | 43 otherLibrarySources.add(analysisContext2.sourceFactory.forUri(uri)); |
50 } | 44 } |
51 | 45 |
52 void addLibrarySource(String filePath, String contents) { | 46 void addLibrarySource(String filePath, String contents) { |
53 otherLibrarySources.add(addNamedSource(filePath, contents)); | 47 otherLibrarySources.add(addNamedSource(filePath, contents)); |
54 } | 48 } |
55 | 49 |
56 /** | 50 /** |
57 * Verify that the given prefix is safe to elide from a resynthesized AST. | 51 * Verify that the given prefix is safe to elide from a resynthesized AST. |
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 compareConstAstLists( | 445 compareConstAstLists( |
452 r.typeArguments?.arguments, o.typeArguments?.arguments, desc); | 446 r.typeArguments?.arguments, o.typeArguments?.arguments, desc); |
453 compareConstAstLists(r.entries, o.entries, desc); | 447 compareConstAstLists(r.entries, o.entries, desc); |
454 } else if (o is InstanceCreationExpression && | 448 } else if (o is InstanceCreationExpression && |
455 r is InstanceCreationExpression) { | 449 r is InstanceCreationExpression) { |
456 compareElements(r.staticElement, o.staticElement, desc); | 450 compareElements(r.staticElement, o.staticElement, desc); |
457 ConstructorName oConstructor = o.constructorName; | 451 ConstructorName oConstructor = o.constructorName; |
458 ConstructorName rConstructor = r.constructorName; | 452 ConstructorName rConstructor = r.constructorName; |
459 expect(oConstructor, isNotNull, reason: desc); | 453 expect(oConstructor, isNotNull, reason: desc); |
460 expect(rConstructor, isNotNull, reason: desc); | 454 expect(rConstructor, isNotNull, reason: desc); |
461 compareConstructorElements( | 455 // Note: just compare rConstructor.staticElement and |
| 456 // oConstructor.staticElement as elements, because we just want to |
| 457 // check that they're pointing to the correct elements; we don't want |
| 458 // to check that their constructor initializers match, because that |
| 459 // could lead to infinite regress. |
| 460 compareElements( |
462 rConstructor.staticElement, oConstructor.staticElement, desc); | 461 rConstructor.staticElement, oConstructor.staticElement, desc); |
463 TypeName oType = oConstructor.type; | 462 TypeName oType = oConstructor.type; |
464 TypeName rType = rConstructor.type; | 463 TypeName rType = rConstructor.type; |
465 expect(oType, isNotNull, reason: desc); | 464 expect(oType, isNotNull, reason: desc); |
466 expect(rType, isNotNull, reason: desc); | 465 expect(rType, isNotNull, reason: desc); |
467 compareConstAsts(rType.name, oType.name, desc); | 466 compareConstAsts(rType.name, oType.name, desc); |
468 compareConstAsts(rConstructor.name, oConstructor.name, desc); | 467 compareConstAsts(rConstructor.name, oConstructor.name, desc); |
469 compareConstAstLists(rType.typeArguments?.arguments, | 468 compareConstAstLists(rType.typeArguments?.arguments, |
470 oType.typeArguments?.arguments, desc); | 469 oType.typeArguments?.arguments, desc); |
471 compareConstAstLists( | 470 compareConstAstLists( |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 } | 509 } |
511 } | 510 } |
512 } | 511 } |
513 | 512 |
514 void compareConstructorElements(ConstructorElement resynthesized, | 513 void compareConstructorElements(ConstructorElement resynthesized, |
515 ConstructorElement original, String desc) { | 514 ConstructorElement original, String desc) { |
516 if (original == null && resynthesized == null) { | 515 if (original == null && resynthesized == null) { |
517 return; | 516 return; |
518 } | 517 } |
519 compareExecutableElements(resynthesized, original, desc); | 518 compareExecutableElements(resynthesized, original, desc); |
| 519 ConstructorElementImpl resynthesizedImpl = |
| 520 getActualElement(resynthesized, desc); |
| 521 ConstructorElementImpl originalImpl = getActualElement(original, desc); |
520 if (original.isConst) { | 522 if (original.isConst) { |
521 ConstructorElementImpl resynthesizedImpl = | |
522 getActualElement(resynthesized, desc); | |
523 ConstructorElementImpl originalImpl = getActualElement(original, desc); | |
524 compareConstAstLists(resynthesizedImpl.constantInitializers, | 523 compareConstAstLists(resynthesizedImpl.constantInitializers, |
525 originalImpl.constantInitializers, desc); | 524 originalImpl.constantInitializers, desc); |
526 } | 525 } |
527 if (original.redirectedConstructor == null) { | 526 if (original.redirectedConstructor == null) { |
528 expect(resynthesized.redirectedConstructor, isNull, reason: desc); | 527 expect(resynthesized.redirectedConstructor, isNull, reason: desc); |
529 } else { | 528 } else { |
530 compareConstructorElements(resynthesized.redirectedConstructor, | 529 compareConstructorElements(resynthesized.redirectedConstructor, |
531 original.redirectedConstructor, '$desc redirectedConstructor'); | 530 original.redirectedConstructor, '$desc redirectedConstructor'); |
532 } | 531 } |
533 checkPossibleMember(resynthesized, original, desc); | 532 checkPossibleMember(resynthesized, original, desc); |
534 expect(resynthesized.nameEnd, original.nameEnd, reason: desc); | 533 expect(resynthesized.nameEnd, original.nameEnd, reason: desc); |
535 expect(resynthesized.periodOffset, original.periodOffset, reason: desc); | 534 expect(resynthesized.periodOffset, original.periodOffset, reason: desc); |
| 535 expect(resynthesizedImpl.isCycleFree, originalImpl.isCycleFree, |
| 536 reason: desc); |
536 } | 537 } |
537 | 538 |
538 void compareConstValues( | 539 void compareConstValues( |
539 DartObject resynthesized, DartObject original, String desc) { | 540 DartObject resynthesized, DartObject original, String desc) { |
540 if (original == null) { | 541 if (original == null) { |
541 expect(resynthesized, isNull, reason: desc); | 542 expect(resynthesized, isNull, reason: desc); |
542 } else { | 543 } else { |
543 expect(resynthesized, isNotNull, reason: desc); | 544 expect(resynthesized, isNotNull, reason: desc); |
544 compareTypes(resynthesized.type, original.type, desc); | 545 compareTypes(resynthesized.type, original.type, desc); |
545 expect(resynthesized.hasKnownValue, original.hasKnownValue, reason: desc); | 546 expect(resynthesized.hasKnownValue, original.hasKnownValue, reason: desc); |
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1024 compareConstAsts(initializer, originalActual.constantInitializer, | 1025 compareConstAsts(initializer, originalActual.constantInitializer, |
1025 '$desc initializer'); | 1026 '$desc initializer'); |
1026 } | 1027 } |
1027 } | 1028 } |
1028 } | 1029 } |
1029 checkPossibleMember(resynthesized, original, desc); | 1030 checkPossibleMember(resynthesized, original, desc); |
1030 checkPossibleLocalElements(resynthesized, original); | 1031 checkPossibleLocalElements(resynthesized, original); |
1031 } | 1032 } |
1032 | 1033 |
1033 /** | 1034 /** |
| 1035 * Determine the analysis options that should be used for this test. |
| 1036 */ |
| 1037 AnalysisOptionsImpl createOptions() => |
| 1038 new AnalysisOptionsImpl()..enableGenericMethods = true; |
| 1039 |
| 1040 /** |
1034 * Serialize the given [library] into a summary. Then create a | 1041 * Serialize the given [library] into a summary. Then create a |
1035 * [_TestSummaryResynthesizer] which can deserialize it, along with any | 1042 * [_TestSummaryResynthesizer] which can deserialize it, along with any |
1036 * references it makes to `dart:core`. | 1043 * references it makes to `dart:core`. |
1037 * | 1044 * |
1038 * Errors will lead to a test failure unless [allowErrors] is `true`. | 1045 * Errors will lead to a test failure unless [allowErrors] is `true`. |
1039 */ | 1046 */ |
1040 _TestSummaryResynthesizer encodeLibrary(LibraryElementImpl library, | 1047 _TestSummaryResynthesizer encodeLibrary(LibraryElementImpl library, |
1041 {bool allowErrors: false, bool dumpSummaries: false}) { | 1048 {bool allowErrors: false, bool dumpSummaries: false}) { |
1042 if (!allowErrors) { | 1049 if (!allowErrors) { |
1043 assertNoErrors(library.source); | 1050 assertNoErrors(library.source); |
(...skipping 1462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2506 | 2513 |
2507 test_constructor_redirected_thisInvocation_unnamed_generic() { | 2514 test_constructor_redirected_thisInvocation_unnamed_generic() { |
2508 checkLibrary(''' | 2515 checkLibrary(''' |
2509 class C<T> { | 2516 class C<T> { |
2510 C(); | 2517 C(); |
2511 C.named() : this(); | 2518 C.named() : this(); |
2512 } | 2519 } |
2513 '''); | 2520 '''); |
2514 } | 2521 } |
2515 | 2522 |
| 2523 test_constructor_withCycles_const() { |
| 2524 checkLibrary(''' |
| 2525 class C { |
| 2526 final x; |
| 2527 const C() : x = const D(); |
| 2528 } |
| 2529 class D { |
| 2530 final x; |
| 2531 const D() : x = const C(); |
| 2532 } |
| 2533 '''); |
| 2534 } |
| 2535 |
| 2536 test_constructor_withCycles_nonConst() { |
| 2537 checkLibrary(''' |
| 2538 class C { |
| 2539 final x; |
| 2540 C() : x = new D(); |
| 2541 } |
| 2542 class D { |
| 2543 final x; |
| 2544 D() : x = new C(); |
| 2545 } |
| 2546 '''); |
| 2547 } |
| 2548 |
2516 test_core() { | 2549 test_core() { |
2517 if (createOptions().strongMode) { | 2550 if (createOptions().strongMode) { |
2518 // The fake `dart:core` library is always in spec mode, so don't bother | 2551 // The fake `dart:core` library is always in spec mode, so don't bother |
2519 // trying to check that it resynthesizes properly; it won't. | 2552 // trying to check that it resynthesizes properly; it won't. |
2520 return; | 2553 return; |
2521 } | 2554 } |
2522 String uri = 'dart:core'; | 2555 String uri = 'dart:core'; |
2523 LibraryElementImpl original = | 2556 LibraryElementImpl original = |
2524 resolve2(analysisContext2.sourceFactory.forUri(uri)); | 2557 resolve2(analysisContext2.sourceFactory.forUri(uri)); |
2525 LibraryElementImpl resynthesized = resynthesizeLibraryElement( | 2558 LibraryElementImpl resynthesized = resynthesizeLibraryElement( |
(...skipping 1550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4076 fail('Unexpectedly tried to get unlinked summary for $uri'); | 4109 fail('Unexpectedly tried to get unlinked summary for $uri'); |
4077 } | 4110 } |
4078 return serializedUnit; | 4111 return serializedUnit; |
4079 } | 4112 } |
4080 | 4113 |
4081 @override | 4114 @override |
4082 bool hasLibrarySummary(String uri) { | 4115 bool hasLibrarySummary(String uri) { |
4083 return true; | 4116 return true; |
4084 } | 4117 } |
4085 } | 4118 } |
OLD | NEW |