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

Side by Side Diff: pkg/analyzer/test/src/task/dart_test.dart

Issue 1386023002: Resolve ordering issues. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Alphebetize Created 5 years, 2 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
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.task.dart_test; 5 library test.src.task.dart_test;
6 6
7 import 'package:analyzer/src/context/cache.dart'; 7 import 'package:analyzer/src/context/cache.dart';
8 import 'package:analyzer/src/generated/ast.dart'; 8 import 'package:analyzer/src/generated/ast.dart';
9 import 'package:analyzer/src/generated/constant.dart'; 9 import 'package:analyzer/src/generated/constant.dart';
10 import 'package:analyzer/src/generated/element.dart'; 10 import 'package:analyzer/src/generated/element.dart';
(...skipping 25 matching lines...) Expand all
36 runReflectiveTests(BuildEnumMemberElementsTaskTest); 36 runReflectiveTests(BuildEnumMemberElementsTaskTest);
37 runReflectiveTests(BuildExportNamespaceTaskTest); 37 runReflectiveTests(BuildExportNamespaceTaskTest);
38 runReflectiveTests(BuildLibraryElementTaskTest); 38 runReflectiveTests(BuildLibraryElementTaskTest);
39 runReflectiveTests(BuildPublicNamespaceTaskTest); 39 runReflectiveTests(BuildPublicNamespaceTaskTest);
40 runReflectiveTests(BuildSourceExportClosureTaskTest); 40 runReflectiveTests(BuildSourceExportClosureTaskTest);
41 runReflectiveTests(BuildSourceImportExportClosureTaskTest); 41 runReflectiveTests(BuildSourceImportExportClosureTaskTest);
42 runReflectiveTests(BuildTypeProviderTaskTest); 42 runReflectiveTests(BuildTypeProviderTaskTest);
43 runReflectiveTests(ComputeConstantDependenciesTaskTest); 43 runReflectiveTests(ComputeConstantDependenciesTaskTest);
44 runReflectiveTests(ComputeConstantValueTaskTest); 44 runReflectiveTests(ComputeConstantValueTaskTest);
45 runReflectiveTests(ComputeInferableStaticVariableDependenciesTaskTest); 45 runReflectiveTests(ComputeInferableStaticVariableDependenciesTaskTest);
46 runReflectiveTests(ComputeLibraryCycleTaskTest);
46 runReflectiveTests(ContainingLibrariesTaskTest); 47 runReflectiveTests(ContainingLibrariesTaskTest);
47 runReflectiveTests(DartErrorsTaskTest); 48 runReflectiveTests(DartErrorsTaskTest);
48 runReflectiveTests(EvaluateUnitConstantsTaskTest); 49 runReflectiveTests(EvaluateUnitConstantsTaskTest);
49 runReflectiveTests(GatherUsedImportedElementsTaskTest); 50 runReflectiveTests(GatherUsedImportedElementsTaskTest);
50 runReflectiveTests(GatherUsedLocalElementsTaskTest); 51 runReflectiveTests(GatherUsedLocalElementsTaskTest);
51 runReflectiveTests(GenerateHintsTaskTest); 52 runReflectiveTests(GenerateHintsTaskTest);
52 runReflectiveTests(GenerateLintsTaskTest); 53 runReflectiveTests(GenerateLintsTaskTest);
53 runReflectiveTests(InferInstanceMembersInUnitTaskTest); 54 runReflectiveTests(InferInstanceMembersInUnitTaskTest);
54 runReflectiveTests(InferStaticVariableTypesInUnitTaskTest); 55 runReflectiveTests(InferStaticVariableTypesInUnitTaskTest);
55 runReflectiveTests(InferStaticVariableTypeTaskTest); 56 runReflectiveTests(InferStaticVariableTypeTaskTest);
56 runReflectiveTests(LibraryErrorsReadyTaskTest); 57 runReflectiveTests(LibraryErrorsReadyTaskTest);
57 runReflectiveTests(LibraryUnitErrorsTaskTest); 58 runReflectiveTests(LibraryUnitErrorsTaskTest);
58 runReflectiveTests(ParseDartTaskTest); 59 runReflectiveTests(ParseDartTaskTest);
59 runReflectiveTests(PartiallyResolveUnitReferencesTaskTest); 60 runReflectiveTests(PartiallyResolveUnitReferencesTaskTest);
60 runReflectiveTests(ResolveFunctionBodiesInUnitTaskTest); 61 runReflectiveTests(ResolveInstanceFieldsInUnitTaskTest);
61 runReflectiveTests(ResolveLibraryTypeNamesTaskTest); 62 runReflectiveTests(ResolveLibraryTypeNamesTaskTest);
63 runReflectiveTests(ResolveUnitTaskTest);
62 runReflectiveTests(ResolveUnitTypeNamesTaskTest); 64 runReflectiveTests(ResolveUnitTypeNamesTaskTest);
63 runReflectiveTests(ResolveVariableReferencesTaskTest); 65 runReflectiveTests(ResolveVariableReferencesTaskTest);
64 runReflectiveTests(ScanDartTaskTest); 66 runReflectiveTests(ScanDartTaskTest);
65 runReflectiveTests(StrongModeInferenceTest); 67 runReflectiveTests(StrongModeInferenceTest);
66 runReflectiveTests(VerifyUnitTaskTest); 68 runReflectiveTests(VerifyUnitTaskTest);
67 } 69 }
68 70
69 isInstanceOf isBuildCompilationUnitElementTask = 71 isInstanceOf isBuildCompilationUnitElementTask =
70 new isInstanceOf<BuildCompilationUnitElementTask>(); 72 new isInstanceOf<BuildCompilationUnitElementTask>();
71 isInstanceOf isBuildDirectiveElementsTask = 73 isInstanceOf isBuildDirectiveElementsTask =
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 new isInstanceOf<InferStaticVariableTypesInUnitTask>(); 109 new isInstanceOf<InferStaticVariableTypesInUnitTask>();
108 isInstanceOf isInferStaticVariableTypeTask = 110 isInstanceOf isInferStaticVariableTypeTask =
109 new isInstanceOf<InferStaticVariableTypeTask>(); 111 new isInstanceOf<InferStaticVariableTypeTask>();
110 isInstanceOf isLibraryErrorsReadyTask = 112 isInstanceOf isLibraryErrorsReadyTask =
111 new isInstanceOf<LibraryErrorsReadyTask>(); 113 new isInstanceOf<LibraryErrorsReadyTask>();
112 isInstanceOf isLibraryUnitErrorsTask = 114 isInstanceOf isLibraryUnitErrorsTask =
113 new isInstanceOf<LibraryUnitErrorsTask>(); 115 new isInstanceOf<LibraryUnitErrorsTask>();
114 isInstanceOf isParseDartTask = new isInstanceOf<ParseDartTask>(); 116 isInstanceOf isParseDartTask = new isInstanceOf<ParseDartTask>();
115 isInstanceOf isPartiallyResolveUnitReferencesTask = 117 isInstanceOf isPartiallyResolveUnitReferencesTask =
116 new isInstanceOf<PartiallyResolveUnitReferencesTask>(); 118 new isInstanceOf<PartiallyResolveUnitReferencesTask>();
117 isInstanceOf isResolveFunctionBodiesInUnitTask =
118 new isInstanceOf<ResolveFunctionBodiesInUnitTask>();
119 isInstanceOf isResolveLibraryTypeNamesTask = 119 isInstanceOf isResolveLibraryTypeNamesTask =
120 new isInstanceOf<ResolveLibraryTypeNamesTask>(); 120 new isInstanceOf<ResolveLibraryTypeNamesTask>();
121 isInstanceOf isResolveUnitTask = new isInstanceOf<ResolveUnitTask>();
121 isInstanceOf isResolveUnitTypeNamesTask = 122 isInstanceOf isResolveUnitTypeNamesTask =
122 new isInstanceOf<ResolveUnitTypeNamesTask>(); 123 new isInstanceOf<ResolveUnitTypeNamesTask>();
123 isInstanceOf isResolveVariableReferencesTask = 124 isInstanceOf isResolveVariableReferencesTask =
124 new isInstanceOf<ResolveVariableReferencesTask>(); 125 new isInstanceOf<ResolveVariableReferencesTask>();
125 isInstanceOf isScanDartTask = new isInstanceOf<ScanDartTask>(); 126 isInstanceOf isScanDartTask = new isInstanceOf<ScanDartTask>();
126 isInstanceOf isVerifyUnitTask = new isInstanceOf<VerifyUnitTask>(); 127 isInstanceOf isVerifyUnitTask = new isInstanceOf<VerifyUnitTask>();
127 128
128 final LintCode _testLintCode = new LintCode('test lint', 'test lint code'); 129 final LintCode _testLintCode = new LintCode('test lint', 'test lint code');
129 130
130 @reflectiveTest 131 @reflectiveTest
(...skipping 1291 matching lines...) Expand 10 before | Expand all | Expand 10 after
1422 return unit; 1423 return unit;
1423 } 1424 }
1424 1425
1425 CompilationUnit _resolveUnit(String content) => 1426 CompilationUnit _resolveUnit(String content) =>
1426 _resolveSource(newSource('/test.dart', content)); 1427 _resolveSource(newSource('/test.dart', content));
1427 } 1428 }
1428 1429
1429 @reflectiveTest 1430 @reflectiveTest
1430 class ComputeInferableStaticVariableDependenciesTaskTest 1431 class ComputeInferableStaticVariableDependenciesTaskTest
1431 extends _AbstractDartTaskTest { 1432 extends _AbstractDartTaskTest {
1433 @override
1434 void setUp() {
1435 super.setUp();
1436 // Variable dependencies are only available in strong mode.
1437 enableStrongMode();
1438 }
1439
1432 test_perform() { 1440 test_perform() {
1433 AnalysisTarget source = newSource( 1441 AnalysisTarget source = newSource(
1434 '/test.dart', 1442 '/test.dart',
1435 ''' 1443 '''
1436 const a = b; 1444 const a = b;
1437 const b = 0; 1445 const b = 0;
1438 '''); 1446 ''');
1439 LibrarySpecificUnit target = new LibrarySpecificUnit(source, source); 1447 LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
1440 computeResult(target, RESOLVED_UNIT5); 1448 computeResult(target, RESOLVED_UNIT5);
1441 CompilationUnit unit = outputs[RESOLVED_UNIT5]; 1449 CompilationUnit unit = outputs[RESOLVED_UNIT5];
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1487 computeResult(part, SOURCE_KIND); 1495 computeResult(part, SOURCE_KIND);
1488 computeResult(part, CONTAINING_LIBRARIES, 1496 computeResult(part, CONTAINING_LIBRARIES,
1489 matcher: isContainingLibrariesTask); 1497 matcher: isContainingLibrariesTask);
1490 expect(outputs, hasLength(1)); 1498 expect(outputs, hasLength(1));
1491 List<Source> containingLibraries = outputs[CONTAINING_LIBRARIES]; 1499 List<Source> containingLibraries = outputs[CONTAINING_LIBRARIES];
1492 expect(containingLibraries, unorderedEquals([library])); 1500 expect(containingLibraries, unorderedEquals([library]));
1493 } 1501 }
1494 } 1502 }
1495 1503
1496 @reflectiveTest 1504 @reflectiveTest
1505 class ComputeLibraryCycleTaskTest extends _AbstractDartTaskTest {
1506 @override
1507 void setUp() {
1508 super.setUp();
1509 enableStrongMode();
1510 }
1511
1512 void test_library_cycle_singleton() {
1513 Source source = newSource(
1514 '/test.dart',
1515 '''
1516 import 'dart:core';
1517 ''');
1518 computeResult(new LibrarySpecificUnit(source, source), LIBRARY_CYCLE);
1519 List<LibraryElement> component = outputs[LIBRARY_CYCLE];
1520 List<CompilationUnitElement> units = outputs[LIBRARY_CYCLE_UNITS];
1521 List<CompilationUnitElement> deps = outputs[LIBRARY_CYCLE_DEPENDENCIES];
1522 expect(component, hasLength(1));
1523 expect(units, hasLength(1));
1524 expect(deps, hasLength(1));
1525 }
1526
1527 void test_library_cycle_linear() {
1528 List<Source> sources = newSources({
1529 '/a.dart': '''
1530 ''',
1531 '/b.dart': '''
1532 import 'a.dart';
1533 '''
1534 });
1535 List<Map<ResultDescriptor, dynamic>> results =
1536 computeLibraryResultsMap(sources, LIBRARY_CYCLE);
1537 List<LibraryElement> component0 = results[0][LIBRARY_CYCLE];
1538 List<LibraryElement> component1 = results[1][LIBRARY_CYCLE];
1539 expect(component0, hasLength(1));
1540 expect(component1, hasLength(1));
1541
1542 List<CompilationUnitElement> units0 = results[0][LIBRARY_CYCLE_UNITS];
1543 List<CompilationUnitElement> units1 = results[1][LIBRARY_CYCLE_UNITS];
1544 expect(units0, hasLength(1));
1545 expect(units1, hasLength(1));
1546
1547 List<CompilationUnitElement> dep0 = results[0][LIBRARY_CYCLE_DEPENDENCIES];
1548 List<CompilationUnitElement> dep1 = results[1][LIBRARY_CYCLE_DEPENDENCIES];
1549 expect(dep0, hasLength(1)); // dart:core
1550 expect(dep1, hasLength(2)); // dart:core, a.dart
1551 }
1552
1553 void test_library_cycle_tree() {
1554 List<Source> sources = newSources({
1555 '/a.dart': '''
1556 ''',
1557 '/b.dart': '''
1558 ''',
1559 '/c.dart': '''
1560 import 'a.dart';
1561 import 'b.dart';
1562 '''
1563 });
1564 List<Map<ResultDescriptor, dynamic>> results =
1565 computeLibraryResultsMap(sources, LIBRARY_CYCLE);
1566 List<LibraryElement> component0 = results[0][LIBRARY_CYCLE];
1567 List<LibraryElement> component1 = results[1][LIBRARY_CYCLE];
1568 List<LibraryElement> component2 = results[2][LIBRARY_CYCLE];
1569 expect(component0, hasLength(1));
1570 expect(component1, hasLength(1));
1571 expect(component2, hasLength(1));
1572
1573 List<CompilationUnitElement> units0 = results[0][LIBRARY_CYCLE_UNITS];
1574 List<CompilationUnitElement> units1 = results[1][LIBRARY_CYCLE_UNITS];
1575 List<CompilationUnitElement> units2 = results[2][LIBRARY_CYCLE_UNITS];
1576 expect(units0, hasLength(1));
1577 expect(units1, hasLength(1));
1578 expect(units2, hasLength(1));
1579
1580 List<CompilationUnitElement> dep0 = results[0][LIBRARY_CYCLE_DEPENDENCIES];
1581 List<CompilationUnitElement> dep1 = results[1][LIBRARY_CYCLE_DEPENDENCIES];
1582 List<CompilationUnitElement> dep2 = results[2][LIBRARY_CYCLE_DEPENDENCIES];
1583 expect(dep0, hasLength(1)); // dart:core
1584 expect(dep1, hasLength(1)); // dart:core,
1585 expect(dep2, hasLength(3)); // dart:core, a.dart, b.dart
1586 }
1587
1588 void test_library_cycle_loop() {
1589 List<Source> sources = newSources({
1590 '/a.dart': '''
1591 import 'c.dart';
1592 ''',
1593 '/b.dart': '''
1594 import 'a.dart';
1595 ''',
1596 '/c.dart': '''
1597 import 'b.dart';
1598 '''
1599 });
1600 List<Map<ResultDescriptor, dynamic>> results =
1601 computeLibraryResultsMap(sources, LIBRARY_CYCLE).toList();
1602 List<LibraryElement> component0 = results[0][LIBRARY_CYCLE];
1603 List<LibraryElement> component1 = results[1][LIBRARY_CYCLE];
1604 List<LibraryElement> component2 = results[2][LIBRARY_CYCLE];
1605
1606 expect(component0, hasLength(3));
1607 expect(component1, hasLength(3));
1608 expect(component2, hasLength(3));
1609
1610 List<CompilationUnitElement> units0 = results[0][LIBRARY_CYCLE_UNITS];
1611 List<CompilationUnitElement> units1 = results[1][LIBRARY_CYCLE_UNITS];
1612 List<CompilationUnitElement> units2 = results[2][LIBRARY_CYCLE_UNITS];
1613 expect(units0, hasLength(3));
1614 expect(units1, hasLength(3));
1615 expect(units2, hasLength(3));
1616
1617 List<CompilationUnitElement> dep0 = results[0][LIBRARY_CYCLE_DEPENDENCIES];
1618 List<CompilationUnitElement> dep1 = results[1][LIBRARY_CYCLE_DEPENDENCIES];
1619 List<CompilationUnitElement> dep2 = results[2][LIBRARY_CYCLE_DEPENDENCIES];
1620 expect(dep0, hasLength(1)); // dart:core
1621 expect(dep1, hasLength(1)); // dart:core
1622 expect(dep2, hasLength(1)); // dart:core
1623 }
1624
1625 void test_library_cycle_self_loop() {
1626 List<Source> sources = newSources({
1627 '/a.dart': '''
1628 import 'a.dart';
1629 '''
1630 });
1631 List<Map<ResultDescriptor, dynamic>> results =
1632 computeLibraryResultsMap(sources, LIBRARY_CYCLE).toList();
1633 List<LibraryElement> component0 = results[0][LIBRARY_CYCLE];
1634 expect(component0, hasLength(1));
1635
1636 List<CompilationUnitElement> units0 = results[0][LIBRARY_CYCLE_UNITS];
1637 expect(units0, hasLength(1));
1638
1639 List<CompilationUnitElement> dep0 = results[0][LIBRARY_CYCLE_DEPENDENCIES];
1640 expect(dep0, hasLength(1)); // dart:core
1641 }
1642
1643 void test_library_double_loop() {
1644 List<Source> sources = newSources({
1645 '/a.dart': '''
1646 import 'b.dart';
1647 ''',
1648 '/b.dart': '''
1649 import 'a.dart';
1650 ''',
1651 '/c.dart': '''
1652 import 'd.dart' as foo;
1653 import 'a.dart' as bar;
1654 export 'b.dart';
1655 ''',
1656 '/d.dart': '''
1657 import 'c.dart' as foo;
1658 import 'b.dart' as bar;
1659 export 'a.dart';
1660 '''
1661 });
1662 List<Map<ResultDescriptor, dynamic>> results =
1663 computeLibraryResultsMap(sources, LIBRARY_CYCLE).toList();
1664 List<LibraryElement> component0 = results[0][LIBRARY_CYCLE];
1665 List<LibraryElement> component1 = results[1][LIBRARY_CYCLE];
1666 List<LibraryElement> component2 = results[2][LIBRARY_CYCLE];
1667 List<LibraryElement> component3 = results[3][LIBRARY_CYCLE];
1668
1669 expect(component0, hasLength(2));
1670 expect(component1, hasLength(2));
1671 expect(component2, hasLength(2));
1672 expect(component3, hasLength(2));
1673
1674 List<CompilationUnitElement> units0 = results[0][LIBRARY_CYCLE_UNITS];
1675 List<CompilationUnitElement> units1 = results[1][LIBRARY_CYCLE_UNITS];
1676 List<CompilationUnitElement> units2 = results[2][LIBRARY_CYCLE_UNITS];
1677 List<CompilationUnitElement> units3 = results[3][LIBRARY_CYCLE_UNITS];
1678 expect(units0, hasLength(2));
1679 expect(units1, hasLength(2));
1680 expect(units2, hasLength(2));
1681 expect(units3, hasLength(2));
1682
1683 List<CompilationUnitElement> dep0 = results[0][LIBRARY_CYCLE_DEPENDENCIES];
1684 List<CompilationUnitElement> dep1 = results[1][LIBRARY_CYCLE_DEPENDENCIES];
1685 List<CompilationUnitElement> dep2 = results[2][LIBRARY_CYCLE_DEPENDENCIES];
1686 List<CompilationUnitElement> dep3 = results[3][LIBRARY_CYCLE_DEPENDENCIES];
1687 expect(dep0, hasLength(1)); // dart:core
1688 expect(dep1, hasLength(1)); // dart:core
1689 expect(dep3, hasLength(3)); // dart:core, a.dart, b.dart
1690 expect(dep3, hasLength(3)); // dart:core, a.dart, b.dart
1691 }
1692
1693 void test_library_double_loop_parts() {
1694 List<Source> sources = newSources({
1695 '/a.dart': '''
1696 import 'b.dart';
1697 part 'aa.dart';
1698 part 'ab.dart';
1699 ''',
1700 '/b.dart': '''
1701 import 'a.dart';
1702 ''',
1703 '/aa.dart': '''
1704 ''',
1705 '/ab.dart': '''
1706 ''',
1707 '/c.dart': '''
1708 import 'd.dart' as foo;
1709 import 'a.dart' as bar;
1710 export 'b.dart';
1711 ''',
1712 '/d.dart': '''
1713 import 'c.dart' as foo;
1714 import 'b.dart' as bar;
1715 export 'a.dart';
1716 part 'da.dart';
1717 part 'db.dart';
1718 ''',
1719 '/da.dart': '''
1720 ''',
1721 '/db.dart': '''
1722 '''
1723 });
1724 computeResult(
1725 new LibrarySpecificUnit(sources[0], sources[0]), LIBRARY_CYCLE);
1726 Map<ResultDescriptor, dynamic> results0 = outputs;
1727 computeResult(
1728 new LibrarySpecificUnit(sources[1], sources[1]), LIBRARY_CYCLE);
1729 Map<ResultDescriptor, dynamic> results1 = outputs;
1730 computeResult(
1731 new LibrarySpecificUnit(sources[0], sources[2]), LIBRARY_CYCLE);
1732 Map<ResultDescriptor, dynamic> results2 = outputs;
1733 computeResult(
1734 new LibrarySpecificUnit(sources[0], sources[3]), LIBRARY_CYCLE);
1735 Map<ResultDescriptor, dynamic> results3 = outputs;
1736 computeResult(
1737 new LibrarySpecificUnit(sources[4], sources[4]), LIBRARY_CYCLE);
1738 Map<ResultDescriptor, dynamic> results4 = outputs;
1739 computeResult(
1740 new LibrarySpecificUnit(sources[5], sources[5]), LIBRARY_CYCLE);
1741 Map<ResultDescriptor, dynamic> results5 = outputs;
1742 computeResult(
1743 new LibrarySpecificUnit(sources[5], sources[6]), LIBRARY_CYCLE);
1744 Map<ResultDescriptor, dynamic> results6 = outputs;
1745 computeResult(
1746 new LibrarySpecificUnit(sources[5], sources[7]), LIBRARY_CYCLE);
1747 Map<ResultDescriptor, dynamic> results7 = outputs;
1748
1749 List<LibraryElement> component0 = results0[LIBRARY_CYCLE];
1750 List<LibraryElement> component1 = results1[LIBRARY_CYCLE];
1751 List<LibraryElement> component2 = results2[LIBRARY_CYCLE];
1752 List<LibraryElement> component3 = results3[LIBRARY_CYCLE];
1753 List<LibraryElement> component4 = results4[LIBRARY_CYCLE];
1754 List<LibraryElement> component5 = results5[LIBRARY_CYCLE];
1755 List<LibraryElement> component6 = results6[LIBRARY_CYCLE];
1756 List<LibraryElement> component7 = results7[LIBRARY_CYCLE];
1757
1758 expect(component0, hasLength(2));
1759 expect(component1, hasLength(2));
1760 expect(component2, hasLength(2));
1761 expect(component3, hasLength(2));
1762 expect(component4, hasLength(2));
1763 expect(component5, hasLength(2));
1764 expect(component6, hasLength(2));
1765 expect(component7, hasLength(2));
1766
1767 List<CompilationUnitElement> units0 = results0[LIBRARY_CYCLE_UNITS];
1768 List<CompilationUnitElement> units1 = results1[LIBRARY_CYCLE_UNITS];
1769 List<CompilationUnitElement> units2 = results2[LIBRARY_CYCLE_UNITS];
1770 List<CompilationUnitElement> units3 = results3[LIBRARY_CYCLE_UNITS];
1771 List<CompilationUnitElement> units4 = results4[LIBRARY_CYCLE_UNITS];
1772 List<CompilationUnitElement> units5 = results5[LIBRARY_CYCLE_UNITS];
1773 List<CompilationUnitElement> units6 = results6[LIBRARY_CYCLE_UNITS];
1774 List<CompilationUnitElement> units7 = results7[LIBRARY_CYCLE_UNITS];
1775 expect(units0, hasLength(4));
1776 expect(units1, hasLength(4));
1777 expect(units2, hasLength(4));
1778 expect(units3, hasLength(4));
1779 expect(units4, hasLength(4));
1780 expect(units5, hasLength(4));
1781 expect(units6, hasLength(4));
1782 expect(units7, hasLength(4));
1783
1784 List<CompilationUnitElement> dep0 = results0[LIBRARY_CYCLE_DEPENDENCIES];
1785 List<CompilationUnitElement> dep1 = results1[LIBRARY_CYCLE_DEPENDENCIES];
1786 List<CompilationUnitElement> dep2 = results2[LIBRARY_CYCLE_DEPENDENCIES];
1787 List<CompilationUnitElement> dep3 = results3[LIBRARY_CYCLE_DEPENDENCIES];
1788 List<CompilationUnitElement> dep4 = results4[LIBRARY_CYCLE_DEPENDENCIES];
1789 List<CompilationUnitElement> dep5 = results5[LIBRARY_CYCLE_DEPENDENCIES];
1790 List<CompilationUnitElement> dep6 = results6[LIBRARY_CYCLE_DEPENDENCIES];
1791 List<CompilationUnitElement> dep7 = results7[LIBRARY_CYCLE_DEPENDENCIES];
1792 expect(dep0, hasLength(1)); // dart:core
1793 expect(dep1, hasLength(1)); // dart:core
1794 expect(dep2, hasLength(1)); // dart:core
1795 expect(dep3, hasLength(1)); // dart:core
1796 expect(dep4, hasLength(5)); // dart:core, a.dart, aa.dart, ab.dart, b.dart
1797 expect(dep5, hasLength(5)); // dart:core, a.dart, aa.dart, ab.dart, b.dart
1798 expect(dep6, hasLength(5)); // dart:core, a.dart, aa.dart, ab.dart, b.dart
1799 expect(dep7, hasLength(5)); // dart:core, a.dart, aa.dart, ab.dart, b.dart
1800 }
1801 }
1802
1803 @reflectiveTest
1497 class DartErrorsTaskTest extends _AbstractDartTaskTest { 1804 class DartErrorsTaskTest extends _AbstractDartTaskTest {
1498 test_perform_definingCompilationUnit() { 1805 test_perform_definingCompilationUnit() {
1499 AnalysisTarget library = 1806 AnalysisTarget library =
1500 newSource('/test.dart', 'library test; import "dart:math";'); 1807 newSource('/test.dart', 'library test; import "dart:math";');
1501 computeResult(library, INCLUDED_PARTS); 1808 computeResult(library, INCLUDED_PARTS);
1502 computeResult(library, DART_ERRORS, matcher: isDartErrorsTask); 1809 computeResult(library, DART_ERRORS, matcher: isDartErrorsTask);
1503 expect(outputs, hasLength(1)); 1810 expect(outputs, hasLength(1));
1504 List<AnalysisError> errors = outputs[DART_ERRORS]; 1811 List<AnalysisError> errors = outputs[DART_ERRORS];
1505 expect(errors, hasLength(1)); 1812 expect(errors, hasLength(1));
1506 } 1813 }
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
1948 Y m(Z x) {} 2255 Y m(Z x) {}
1949 } 2256 }
1950 class B extends A { 2257 class B extends A {
1951 var f; 2258 var f;
1952 m(x) {} 2259 m(x) {}
1953 } 2260 }
1954 class X {} 2261 class X {}
1955 class Y {} 2262 class Y {}
1956 class Z {} 2263 class Z {}
1957 '''); 2264 ''');
1958 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT7, 2265 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT8,
1959 matcher: isInferInstanceMembersInUnitTask); 2266 matcher: isInferInstanceMembersInUnitTask);
1960 CompilationUnit unit = outputs[RESOLVED_UNIT7]; 2267 CompilationUnit unit = outputs[RESOLVED_UNIT8];
1961 VariableDeclaration field = getFieldInClass(unit, 'B', 'f'); 2268 VariableDeclaration field = getFieldInClass(unit, 'B', 'f');
1962 MethodDeclaration method = getMethodInClass(unit, 'B', 'm'); 2269 MethodDeclaration method = getMethodInClass(unit, 'B', 'm');
1963 DartType typeX = getClass(unit, 'X').element.type; 2270 DartType typeX = getClass(unit, 'X').element.type;
1964 DartType typeY = getClass(unit, 'Y').element.type; 2271 DartType typeY = getClass(unit, 'Y').element.type;
1965 DartType typeZ = getClass(unit, 'Z').element.type; 2272 DartType typeZ = getClass(unit, 'Z').element.type;
1966 2273
1967 expect(field.element.type, typeX); 2274 expect(field.element.type, typeX);
1968 expect(method.element.returnType, typeY); 2275 expect(method.element.returnType, typeY);
1969 expect(method.element.parameters[0].type, typeZ); 2276 expect(method.element.parameters[0].type, typeZ);
1970 } 2277 }
(...skipping 11 matching lines...) Expand all
1982 '/second.dart', 2289 '/second.dart',
1983 ''' 2290 '''
1984 import 'first.dart'; 2291 import 'first.dart';
1985 2292
1986 const b = a; 2293 const b = a;
1987 class M { 2294 class M {
1988 String c = a; 2295 String c = a;
1989 } 2296 }
1990 '''); 2297 ''');
1991 computeResult( 2298 computeResult(
1992 new LibrarySpecificUnit(firstSource, firstSource), RESOLVED_UNIT7, 2299 new LibrarySpecificUnit(firstSource, firstSource), RESOLVED_UNIT8,
1993 matcher: isInferInstanceMembersInUnitTask); 2300 matcher: isInferInstanceMembersInUnitTask);
1994 CompilationUnit firstUnit = outputs[RESOLVED_UNIT7]; 2301 CompilationUnit firstUnit = outputs[RESOLVED_UNIT8];
1995 computeResult( 2302 computeResult(
1996 new LibrarySpecificUnit(secondSource, secondSource), RESOLVED_UNIT7); 2303 new LibrarySpecificUnit(secondSource, secondSource), RESOLVED_UNIT8);
1997 CompilationUnit secondUnit = outputs[RESOLVED_UNIT7]; 2304 CompilationUnit secondUnit = outputs[RESOLVED_UNIT8];
1998 2305
1999 VariableDeclaration variableA = getTopLevelVariable(firstUnit, 'a'); 2306 VariableDeclaration variableA = getTopLevelVariable(firstUnit, 'a');
2000 VariableDeclaration variableB = getTopLevelVariable(secondUnit, 'b'); 2307 VariableDeclaration variableB = getTopLevelVariable(secondUnit, 'b');
2001 VariableDeclaration variableC = getFieldInClass(secondUnit, 'M', 'c'); 2308 VariableDeclaration variableC = getFieldInClass(secondUnit, 'M', 'c');
2002 InterfaceType stringType = context.typeProvider.stringType; 2309 InterfaceType stringType = context.typeProvider.stringType;
2003 2310
2004 expect(variableA.element.type, stringType); 2311 expect(variableA.element.type, stringType);
2005 expect(variableB.element.type, stringType); 2312 expect(variableB.element.type, stringType);
2006 expect(variableB.initializer.staticType, stringType); 2313 expect(variableB.initializer.staticType, stringType);
2007 expect(variableC.element.type, stringType); 2314 expect(variableC.element.type, stringType);
2008 expect(variableC.initializer.staticType, stringType); 2315 expect(variableC.initializer.staticType, stringType);
2009 } 2316 }
2010 2317
2011 void test_perform_reresolution() { 2318 void test_perform_reresolution() {
2012 enableStrongMode(); 2319 enableStrongMode();
2013 AnalysisTarget source = newSource( 2320 AnalysisTarget source = newSource(
2014 '/test.dart', 2321 '/test.dart',
2015 ''' 2322 '''
2016 const topLevel = ''; 2323 const topLevel = '';
2017 class C { 2324 class C {
2018 String field = topLevel; 2325 String field = topLevel;
2019 } 2326 }
2020 '''); 2327 ''');
2021 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT7); 2328 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT8);
2022 CompilationUnit unit = outputs[RESOLVED_UNIT7]; 2329 CompilationUnit unit = outputs[RESOLVED_UNIT8];
2023 VariableDeclaration topLevelDecl = getTopLevelVariable(unit, 'topLevel'); 2330 VariableDeclaration topLevelDecl = getTopLevelVariable(unit, 'topLevel');
2024 VariableDeclaration fieldDecl = getFieldInClass(unit, 'C', 'field'); 2331 VariableDeclaration fieldDecl = getFieldInClass(unit, 'C', 'field');
2025 VariableElement topLevel = topLevelDecl.name.staticElement; 2332 VariableElement topLevel = topLevelDecl.name.staticElement;
2026 VariableElement field = fieldDecl.name.staticElement; 2333 VariableElement field = fieldDecl.name.staticElement;
2027 2334
2028 InterfaceType stringType = context.typeProvider.stringType; 2335 InterfaceType stringType = context.typeProvider.stringType;
2029 expect(topLevel.type, stringType); 2336 expect(topLevel.type, stringType);
2030 expect(field.type, stringType); 2337 expect(field.type, stringType);
2031 expect(fieldDecl.initializer.staticType, stringType); 2338 expect(fieldDecl.initializer.staticType, stringType);
2032 } 2339 }
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
2158 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5); 2465 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5);
2159 CompilationUnit unit = outputs[RESOLVED_UNIT5]; 2466 CompilationUnit unit = outputs[RESOLVED_UNIT5];
2160 VariableDeclaration declaration = getTopLevelVariable(unit, 'topLevel'); 2467 VariableDeclaration declaration = getTopLevelVariable(unit, 'topLevel');
2161 VariableElement variable = declaration.name.staticElement; 2468 VariableElement variable = declaration.name.staticElement;
2162 InferStaticVariableTypeTask inferTask = 2469 InferStaticVariableTypeTask inferTask =
2163 new InferStaticVariableTypeTask(task.context, variable); 2470 new InferStaticVariableTypeTask(task.context, variable);
2164 expect(inferTask.getDeclaration(unit), declaration); 2471 expect(inferTask.getDeclaration(unit), declaration);
2165 } 2472 }
2166 2473
2167 void test_perform() { 2474 void test_perform() {
2475 enableStrongMode();
2168 AnalysisTarget source = newSource( 2476 AnalysisTarget source = newSource(
2169 '/test3.dart', 2477 '/test3.dart',
2170 ''' 2478 '''
2171 var topLevel3 = ''; 2479 var topLevel3 = '';
2172 class C { 2480 class C {
2173 var field3 = topLevel3; 2481 var field3 = topLevel3;
2174 } 2482 }
2175 '''); 2483 ''');
2176 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5); 2484 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5);
2177 CompilationUnit unit = outputs[RESOLVED_UNIT5]; 2485 CompilationUnit unit = outputs[RESOLVED_UNIT5];
2178 VariableDeclaration topLevelDecl = getTopLevelVariable(unit, 'topLevel3'); 2486 VariableDeclaration topLevelDecl = getTopLevelVariable(unit, 'topLevel3');
2179 VariableDeclaration fieldDecl = getFieldInClass(unit, 'C', 'field3'); 2487 VariableDeclaration fieldDecl = getFieldInClass(unit, 'C', 'field3');
2180 VariableElement topLevel = topLevelDecl.name.staticElement; 2488 VariableElement topLevel = topLevelDecl.name.staticElement;
2181 VariableElement field = fieldDecl.name.staticElement; 2489 VariableElement field = fieldDecl.name.staticElement;
2182 2490
2183 computeResult(field, INFERRED_STATIC_VARIABLE, 2491 computeResult(field, INFERRED_STATIC_VARIABLE,
2184 matcher: isInferStaticVariableTypeTask); 2492 matcher: isInferStaticVariableTypeTask);
2185 InterfaceType stringType = context.typeProvider.stringType; 2493 InterfaceType stringType = context.typeProvider.stringType;
2186 expect(topLevel.type, stringType); 2494 expect(topLevel.type, stringType);
2187 expect(field.type, stringType); 2495 expect(field.type, stringType);
2188 expect(fieldDecl.initializer.staticType, stringType); 2496 expect(fieldDecl.initializer.staticType, stringType);
2189 expect(outputs[INFER_STATIC_VARIABLE_ERRORS], hasLength(0));
2190 } 2497 }
2191 2498
2192 void test_perform_const() { 2499 void test_perform_const() {
2500 enableStrongMode();
2193 AnalysisTarget source = newSource( 2501 AnalysisTarget source = newSource(
2194 '/test.dart', 2502 '/test.dart',
2195 ''' 2503 '''
2196 const topLevel = "hello"; 2504 const topLevel = "hello";
2197 class C { 2505 class C {
2198 var field = topLevel; 2506 var field = topLevel;
2199 } 2507 }
2200 '''); 2508 ''');
2201 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5); 2509 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5);
2202 CompilationUnit unit = outputs[RESOLVED_UNIT5]; 2510 CompilationUnit unit = outputs[RESOLVED_UNIT5];
2203 VariableElement topLevel = 2511 VariableElement topLevel =
2204 getTopLevelVariable(unit, 'topLevel').name.staticElement; 2512 getTopLevelVariable(unit, 'topLevel').name.staticElement;
2205 VariableElement field = 2513 VariableElement field =
2206 getFieldInClass(unit, 'C', 'field').name.staticElement; 2514 getFieldInClass(unit, 'C', 'field').name.staticElement;
2207 2515
2208 computeResult(field, INFERRED_STATIC_VARIABLE, 2516 computeResult(field, INFERRED_STATIC_VARIABLE,
2209 matcher: isInferStaticVariableTypeTask); 2517 matcher: isInferStaticVariableTypeTask);
2210 InterfaceType stringType = context.typeProvider.stringType; 2518 InterfaceType stringType = context.typeProvider.stringType;
2211 expect(topLevel.type, stringType); 2519 expect(topLevel.type, stringType);
2212 expect(field.type, stringType); 2520 expect(field.type, stringType);
2213 expect(outputs[INFER_STATIC_VARIABLE_ERRORS], hasLength(0));
2214 } 2521 }
2215 2522
2216 void test_perform_cycle() { 2523 void test_perform_cycle() {
2524 enableStrongMode();
2217 AnalysisTarget source = newSource( 2525 AnalysisTarget source = newSource(
2218 '/test.dart', 2526 '/test.dart',
2219 ''' 2527 '''
2220 var piFirst = true; 2528 var piFirst = true;
2221 var pi = piFirst ? 3.14 : tau / 2; 2529 var pi = piFirst ? 3.14 : tau / 2;
2222 var tau = piFirst ? pi * 2 : 6.28; 2530 var tau = piFirst ? pi * 2 : 6.28;
2223 '''); 2531 ''');
2224 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5); 2532 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5);
2225 CompilationUnit unit = outputs[RESOLVED_UNIT5]; 2533 CompilationUnit unit = outputs[RESOLVED_UNIT5];
2226 VariableElement piFirst = 2534 VariableElement piFirst =
2227 getTopLevelVariable(unit, 'piFirst').name.staticElement; 2535 getTopLevelVariable(unit, 'piFirst').name.staticElement;
2228 VariableElement pi = getTopLevelVariable(unit, 'pi').name.staticElement; 2536 VariableElement pi = getTopLevelVariable(unit, 'pi').name.staticElement;
2229 VariableElement tau = getTopLevelVariable(unit, 'tau').name.staticElement; 2537 VariableElement tau = getTopLevelVariable(unit, 'tau').name.staticElement;
2230 2538
2231 computeResult(piFirst, INFERRED_STATIC_VARIABLE, 2539 computeResult(piFirst, INFERRED_STATIC_VARIABLE,
2232 matcher: isInferStaticVariableTypeTask); 2540 matcher: isInferStaticVariableTypeTask);
2233 expect(piFirst.type, context.typeProvider.boolType); 2541 expect(piFirst.type, context.typeProvider.boolType);
2234 expect(pi.type.isDynamic, isTrue); 2542 expect(pi.type.isDynamic, isTrue);
2235 expect(tau.type.isDynamic, isTrue); 2543 expect(tau.type.isDynamic, isTrue);
2236 expect(outputs[INFER_STATIC_VARIABLE_ERRORS], hasLength(0));
2237 } 2544 }
2238 2545
2239 void test_perform_error() { 2546 void test_perform_error() {
2547 enableStrongMode();
2240 AnalysisTarget source = newSource( 2548 AnalysisTarget source = newSource(
2241 '/test.dart', 2549 '/test.dart',
2242 ''' 2550 '''
2243 var a = '' / null; 2551 var a = '' / null;
2244 '''); 2552 ''');
2245 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5); 2553 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5);
2246 CompilationUnit unit = outputs[RESOLVED_UNIT5]; 2554 CompilationUnit unit = outputs[RESOLVED_UNIT5];
2247 VariableElement a = getTopLevelVariable(unit, 'a').name.staticElement; 2555 VariableElement a = getTopLevelVariable(unit, 'a').name.staticElement;
2248 2556
2249 computeResult(a, INFERRED_STATIC_VARIABLE, 2557 computeResult(a, INFERRED_STATIC_VARIABLE,
2250 matcher: isInferStaticVariableTypeTask); 2558 matcher: isInferStaticVariableTypeTask);
2251 expect(a.type.isDynamic, isTrue); 2559 expect(a.type.isDynamic, isTrue);
2252 expect(outputs[INFER_STATIC_VARIABLE_ERRORS], hasLength(1));
2253 } 2560 }
2254 2561
2255 void test_perform_null() { 2562 void test_perform_null() {
2563 enableStrongMode();
2256 AnalysisTarget source = newSource( 2564 AnalysisTarget source = newSource(
2257 '/test.dart', 2565 '/test.dart',
2258 ''' 2566 '''
2259 var a = null; 2567 var a = null;
2260 '''); 2568 ''');
2261 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5); 2569 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5);
2262 CompilationUnit unit = outputs[RESOLVED_UNIT5]; 2570 CompilationUnit unit = outputs[RESOLVED_UNIT5];
2263 VariableElement a = getTopLevelVariable(unit, 'a').name.staticElement; 2571 VariableElement a = getTopLevelVariable(unit, 'a').name.staticElement;
2264 2572
2265 computeResult(a, INFERRED_STATIC_VARIABLE, 2573 computeResult(a, INFERRED_STATIC_VARIABLE,
2266 matcher: isInferStaticVariableTypeTask); 2574 matcher: isInferStaticVariableTypeTask);
2267 expect(a.type.isDynamic, isTrue); 2575 expect(a.type.isDynamic, isTrue);
2268 expect(outputs[INFER_STATIC_VARIABLE_ERRORS], hasLength(0));
2269 }
2270
2271 void test_perform_reresolution() {
2272 AnalysisTarget source = newSource(
2273 '/test.dart',
2274 '''
2275 const topLevel = '';
2276 class C {
2277 String field = topLevel;
2278 }
2279 ''');
2280 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5);
2281 CompilationUnit unit = outputs[RESOLVED_UNIT5];
2282 VariableDeclaration topLevelDecl = getTopLevelVariable(unit, 'topLevel');
2283 VariableDeclaration fieldDecl = getFieldInClass(unit, 'C', 'field');
2284 VariableElement topLevel = topLevelDecl.name.staticElement;
2285 VariableElement field = fieldDecl.name.staticElement;
2286
2287 computeResult(field, INFERRED_STATIC_VARIABLE,
2288 matcher: isInferStaticVariableTypeTask);
2289 InterfaceType stringType = context.typeProvider.stringType;
2290 expect(topLevel.type, stringType);
2291 expect(field.type, stringType);
2292 expect(fieldDecl.initializer.staticType, stringType);
2293 expect(outputs[INFER_STATIC_VARIABLE_ERRORS], hasLength(0));
2294 } 2576 }
2295 } 2577 }
2296 2578
2297 @reflectiveTest 2579 @reflectiveTest
2298 class LibraryErrorsReadyTaskTest extends _AbstractDartTaskTest { 2580 class LibraryErrorsReadyTaskTest extends _AbstractDartTaskTest {
2299 test_perform() { 2581 test_perform() {
2300 Source library = newSource( 2582 Source library = newSource(
2301 '/lib.dart', 2583 '/lib.dart',
2302 r''' 2584 r'''
2303 library lib; 2585 library lib;
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
2491 class A {} 2773 class A {}
2492 class C { 2774 class C {
2493 static final f = ''; 2775 static final f = '';
2494 var g = 0; 2776 var g = 0;
2495 } 2777 }
2496 '''); 2778 ''');
2497 LibrarySpecificUnit target = new LibrarySpecificUnit(source, source); 2779 LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
2498 computeResult(target, RESOLVED_UNIT5, 2780 computeResult(target, RESOLVED_UNIT5,
2499 matcher: isPartiallyResolveUnitReferencesTask); 2781 matcher: isPartiallyResolveUnitReferencesTask);
2500 // Test the outputs 2782 // Test the outputs
2501 expect(outputs[INFERABLE_STATIC_VARIABLES_IN_UNIT], hasLength(5)); 2783 expect(outputs[INFERABLE_STATIC_VARIABLES_IN_UNIT], hasLength(4));
2502 CompilationUnit unit = outputs[RESOLVED_UNIT5]; 2784 CompilationUnit unit = outputs[RESOLVED_UNIT5];
2503 expect(unit, same(outputs[RESOLVED_UNIT5])); 2785 expect(unit, same(outputs[RESOLVED_UNIT5]));
2504 // Test the state of the AST 2786 // Test the state of the AST
2505 TopLevelVariableDeclaration a = unit.declarations[0]; 2787 TopLevelVariableDeclaration a = unit.declarations[0];
2506 VariableDeclaration variableA = a.variables.variables[0]; 2788 VariableDeclaration variableA = a.variables.variables[0];
2507 SimpleIdentifier initializer = variableA.initializer; 2789 SimpleIdentifier initializer = variableA.initializer;
2508 expect(initializer.staticElement, isNotNull); 2790 expect(initializer.staticElement, isNotNull);
2509 // Test the error generation
2510 _fillErrorListener(PARTIALLY_RESOLVE_REFERENCES_ERRORS);
2511 errorListener.assertNoErrors();
2512 } 2791 }
2513 2792
2514 test_perform_importExport() { 2793 test_perform_importExport() {
2515 newSource( 2794 newSource(
2516 '/a.dart', 2795 '/a.dart',
2517 ''' 2796 '''
2518 library a; 2797 library a;
2519 class A<T> { 2798 class A<T> {
2520 T m() {} 2799 T m() {}
2521 } 2800 }
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
2612 2891
2613 ConstructorDeclaration constructor = members[0]; 2892 ConstructorDeclaration constructor = members[0];
2614 expectReference(constructor.body, false); 2893 expectReference(constructor.body, false);
2615 2894
2616 MethodDeclaration method = members[1]; 2895 MethodDeclaration method = members[1];
2617 expectReference(method.body, false); 2896 expectReference(method.body, false);
2618 } 2897 }
2619 } 2898 }
2620 2899
2621 @reflectiveTest 2900 @reflectiveTest
2622 class ResolveFunctionBodiesInUnitTaskTest extends _AbstractDartTaskTest { 2901 class ResolveInstanceFieldsInUnitTaskTest extends _AbstractDartTaskTest {
2623 void test_perform() { 2902 @override
2624 AnalysisTarget source = newSource( 2903 void setUp() {
2625 '/test.dart', 2904 super.setUp();
2626 ''' 2905 enableStrongMode();
2627 void f() { 2906 }
2628 var c = new C(); 2907
2629 c.m(); 2908 // Test inference of instance fields across units
2630 } 2909 void test_perform_inference_instance() {
2631 class C { 2910 List<Source> sources = newSources({
2632 void m() { 2911 '/a.dart': '''
2633 f(); 2912 import 'b.dart';
2634 } 2913 class A {
2635 } 2914 final a2 = new B().b2;
2636 '''); 2915 }
2637 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT8, 2916
2638 matcher: isResolveFunctionBodiesInUnitTask); 2917 class B {
2639 CompilationUnit unit = outputs[RESOLVED_UNIT8]; 2918 final b2 = 1;
2640 2919 }
2641 FunctionDeclaration f = unit.declarations[0]; 2920 ''',
2642 _assertResolved(f.functionExpression.body); 2921 '/main.dart': '''
2643 2922 import "a.dart";
2644 MethodDeclaration m = (unit.declarations[1] as ClassDeclaration).members[0]; 2923
2645 _assertResolved(m.body); 2924 test1() {
2646 2925 int x = 0;
2647 expect(outputs[RESOLVE_FUNCTION_BODIES_ERRORS], hasLength(0)); 2926 x = new A().a2;
2648 } 2927 }
2649 2928 '''
2650 void _assertResolved(FunctionBody body) { 2929 });
2651 ResolutionVerifier verifier = new ResolutionVerifier(); 2930 InterfaceType intType = context.typeProvider.intType;
2652 body.accept(verifier); 2931 DartType dynamicType = context.typeProvider.dynamicType;
2653 verifier.assertResolved(); 2932
2933 computeResult(
2934 new LibrarySpecificUnit(sources[0], sources[0]), RESOLVED_UNIT7);
2935 CompilationUnit unit0 = outputs[RESOLVED_UNIT7];
2936
2937 // A.a2 should now be resolved on the rhs, but not yet inferred.
2938 assertVariableDeclarationTypes(
2939 getFieldInClass(unit0, "A", "a2"), dynamicType, dynamicType);
2940
2941 // B.b2 shoud be resolved on the rhs, but not yet inferred.
2942 assertVariableDeclarationTypes(
2943 getFieldInClass(unit0, "B", "b2"), dynamicType, intType);
2944
2945 computeResult(
2946 new LibrarySpecificUnit(sources[1], sources[1]), RESOLVED_UNIT7);
2947 CompilationUnit unit1 = outputs[RESOLVED_UNIT7];
2948
2949 // A.a2 should now be fully resolved and inferred.
2950 assertVariableDeclarationTypes(
2951 getFieldInClass(unit0, "A", "a2"), dynamicType, dynamicType);
2952
2953 // B.b2 should now be fully resolved and inferred.
2954 assertVariableDeclarationTypes(
2955 getFieldInClass(unit0, "B", "b2"), intType, intType);
2956 }
2957
2958 // Test inference of instance fields across units
2959 void test_perform_inference_cross_unit_instance() {
2960 List<Source> sources = newSources({
2961 '/a.dart': '''
2962 import 'b.dart';
2963 class A {
2964 final a2 = new B().b2;
2965 }
2966 ''',
2967 '/b.dart': '''
2968 class B {
2969 final b2 = 1;
2970 }
2971 ''',
2972 '/main.dart': '''
2973 import "a.dart";
2974
2975 test1() {
2976 int x = 0;
2977 x = new A().a2;
2978 }
2979 '''
2980 });
2981 InterfaceType intType = context.typeProvider.intType;
2982 DartType dynamicType = context.typeProvider.dynamicType;
2983
2984 computeResult(
2985 new LibrarySpecificUnit(sources[1], sources[1]), RESOLVED_UNIT7);
2986 CompilationUnit unit1 = outputs[RESOLVED_UNIT7];
2987
2988 // B.b2 shoud be resolved on the rhs, but not yet inferred.
2989 assertVariableDeclarationTypes(
2990 getFieldInClass(unit1, "B", "b2"), dynamicType, intType);
2991
2992 computeResult(
2993 new LibrarySpecificUnit(sources[0], sources[0]), RESOLVED_UNIT7);
2994 CompilationUnit unit0 = outputs[RESOLVED_UNIT7];
2995
2996 // B.b2 should now be fully resolved and inferred.
2997 assertVariableDeclarationTypes(
2998 getFieldInClass(unit1, "B", "b2"), intType, intType);
2999
3000 // A.a2 should now be resolved on the rhs, but not yet inferred.
3001 assertVariableDeclarationTypes(
3002 getFieldInClass(unit0, "A", "a2"), dynamicType, intType);
3003
3004 computeResult(
3005 new LibrarySpecificUnit(sources[2], sources[2]), RESOLVED_UNIT7);
3006 CompilationUnit unit2 = outputs[RESOLVED_UNIT7];
3007
3008 // A.a2 should now be fully resolved and inferred.
3009 assertVariableDeclarationTypes(
3010 getFieldInClass(unit0, "A", "a2"), intType, intType);
3011
3012 assertVariableDeclarationTypes(
3013 getFieldInClass(unit1, "B", "b2"), intType, intType);
3014 }
3015
3016 // Test inference of instance fields across units with cycles
3017 void test_perform_inference_cross_unit_instance_cyclic() {
3018 List<Source> sources = newSources({
3019 '/a.dart': '''
3020 import 'b.dart';
3021 class A {
3022 final a2 = new B().b2;
3023 }
3024 ''',
3025 '/b.dart': '''
3026 import 'a.dart';
3027 class B {
3028 final b2 = 1;
3029 }
3030 ''',
3031 '/main.dart': '''
3032 import "a.dart";
3033
3034 test1() {
3035 int x = 0;
3036 x = new A().a2;
3037 }
3038 '''
3039 });
3040 InterfaceType intType = context.typeProvider.intType;
3041 DartType dynamicType = context.typeProvider.dynamicType;
3042
3043 computeResult(
3044 new LibrarySpecificUnit(sources[0], sources[0]), RESOLVED_UNIT7);
3045 CompilationUnit unit0 = outputs[RESOLVED_UNIT7];
3046
3047 // A.a2 should now be resolved on the rhs, but not yet inferred.
3048 assertVariableDeclarationTypes(
3049 getFieldInClass(unit0, "A", "a2"), dynamicType, dynamicType);
3050
3051 computeResult(
3052 new LibrarySpecificUnit(sources[2], sources[2]), RESOLVED_UNIT7);
3053 CompilationUnit unit2 = outputs[RESOLVED_UNIT7];
3054
3055 // A.a2 should now be fully resolved and inferred.
3056 assertVariableDeclarationTypes(
3057 getFieldInClass(unit0, "A", "a2"), dynamicType, dynamicType);
3058 }
3059
3060 // Test inference between static and instance fields
3061 void test_perform_inference_cross_unit_static_instance() {
3062 List<Source> sources = newSources({
3063 '/a.dart': '''
3064 import 'b.dart';
3065 class A {
3066 static final a1 = B.b1;
3067 final a2 = new B().b2;
3068 }
3069 ''',
3070 '/b.dart': '''
3071 class B {
3072 static final b1 = 1;
3073 final b2 = 1;
3074 }
3075 ''',
3076 '/main.dart': '''
3077 import "a.dart";
3078
3079 test1() {
3080 int x = 0;
3081 // inference in A now works.
3082 x = A.a1;
3083 x = new A().a2;
3084 }
3085 '''
3086 });
3087 InterfaceType intType = context.typeProvider.intType;
3088 DartType dynamicType = context.typeProvider.dynamicType;
3089
3090 computeResult(
3091 new LibrarySpecificUnit(sources[1], sources[1]), RESOLVED_UNIT7);
3092 CompilationUnit unit1 = outputs[RESOLVED_UNIT7];
3093
3094 assertVariableDeclarationTypes(
3095 getFieldInClass(unit1, "B", "b1"), intType, intType);
3096 assertVariableDeclarationTypes(
3097 getFieldInClass(unit1, "B", "b2"), dynamicType, intType);
3098
3099 computeResult(
3100 new LibrarySpecificUnit(sources[0], sources[0]), RESOLVED_UNIT7);
3101 CompilationUnit unit0 = outputs[RESOLVED_UNIT7];
3102
3103 assertVariableDeclarationTypes(
3104 getFieldInClass(unit0, "A", "a1"), intType, intType);
3105 assertVariableDeclarationTypes(
3106 getFieldInClass(unit0, "A", "a2"), dynamicType, intType);
3107
3108 assertVariableDeclarationTypes(
3109 getFieldInClass(unit1, "B", "b1"), intType, intType);
3110 assertVariableDeclarationTypes(
3111 getFieldInClass(unit1, "B", "b2"), intType, intType);
3112
3113 computeResult(
3114 new LibrarySpecificUnit(sources[2], sources[2]), RESOLVED_UNIT7);
3115 CompilationUnit unit2 = outputs[RESOLVED_UNIT7];
3116
3117 assertVariableDeclarationTypes(
3118 getFieldInClass(unit0, "A", "a1"), intType, intType);
3119 assertVariableDeclarationTypes(
3120 getFieldInClass(unit0, "A", "a2"), intType, intType);
3121
3122 assertVariableDeclarationTypes(
3123 getFieldInClass(unit1, "B", "b1"), intType, intType);
3124 assertVariableDeclarationTypes(
3125 getFieldInClass(unit1, "B", "b2"), intType, intType);
2654 } 3126 }
2655 } 3127 }
2656 3128
2657 @reflectiveTest 3129 @reflectiveTest
2658 class ResolveLibraryTypeNamesTaskTest extends _AbstractDartTaskTest { 3130 class ResolveLibraryTypeNamesTaskTest extends _AbstractDartTaskTest {
2659 test_perform() { 3131 test_perform() {
2660 Source sourceLib = newSource( 3132 Source sourceLib = newSource(
2661 '/my_lib.dart', 3133 '/my_lib.dart',
2662 ''' 3134 '''
2663 library my_lib; 3135 library my_lib;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2708 { 3180 {
2709 ClassElement clazz = library.getType('A'); 3181 ClassElement clazz = library.getType('A');
2710 expect(clazz.displayName, 'A'); 3182 expect(clazz.displayName, 'A');
2711 clazz = clazz.supertype.element; 3183 clazz = clazz.supertype.element;
2712 expect(clazz.displayName, 'B'); 3184 expect(clazz.displayName, 'B');
2713 } 3185 }
2714 } 3186 }
2715 } 3187 }
2716 3188
2717 @reflectiveTest 3189 @reflectiveTest
3190 class ResolveUnitTaskTest extends _AbstractDartTaskTest {
3191 void test_perform() {
3192 AnalysisTarget source = newSource(
3193 '/test.dart',
3194 '''
3195 void f() {
3196 var c = new C();
3197 c.m();
3198 }
3199 class C {
3200 void m() {
3201 f();
3202 }
3203 }
3204 ''');
3205 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT9,
3206 matcher: isResolveUnitTask);
3207 CompilationUnit unit = outputs[RESOLVED_UNIT9];
3208
3209 FunctionDeclaration f = unit.declarations[0];
3210 _assertResolved(f.functionExpression.body);
3211
3212 MethodDeclaration m = (unit.declarations[1] as ClassDeclaration).members[0];
3213 _assertResolved(m.body);
3214
3215 expect(outputs[RESOLVE_UNIT_ERRORS], hasLength(0));
3216 }
3217
3218 void _assertResolved(FunctionBody body) {
3219 ResolutionVerifier verifier = new ResolutionVerifier();
3220 body.accept(verifier);
3221 verifier.assertResolved();
3222 }
3223 }
3224
3225 @reflectiveTest
2718 class ResolveUnitTypeNamesTaskTest extends _AbstractDartTaskTest { 3226 class ResolveUnitTypeNamesTaskTest extends _AbstractDartTaskTest {
2719 test_perform() { 3227 test_perform() {
2720 Source source = newSource( 3228 Source source = newSource(
2721 '/test.dart', 3229 '/test.dart',
2722 ''' 3230 '''
2723 class A {} 3231 class A {}
2724 class B extends A {} 3232 class B extends A {}
2725 int f(String p) => p.length; 3233 int f(String p) => p.length;
2726 '''); 3234 ''');
2727 LibrarySpecificUnit target = new LibrarySpecificUnit(source, source); 3235 LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
2927 } 3435 }
2928 3436
2929 void _performScanTask(String content) { 3437 void _performScanTask(String content) {
2930 AnalysisTarget target = newSource('/test.dart', content); 3438 AnalysisTarget target = newSource('/test.dart', content);
2931 computeResult(target, TOKEN_STREAM, matcher: isScanDartTask); 3439 computeResult(target, TOKEN_STREAM, matcher: isScanDartTask);
2932 } 3440 }
2933 } 3441 }
2934 3442
2935 @reflectiveTest 3443 @reflectiveTest
2936 class StrongModeInferenceTest extends _AbstractDartTaskTest { 3444 class StrongModeInferenceTest extends _AbstractDartTaskTest {
2937 void assertAssignmentStatementTypes(
2938 Statement stmt, DartType leftType, DartType rightType) {
2939 AssignmentExpression assgn = (stmt as ExpressionStatement).expression;
2940 expect(assgn.leftHandSide.staticType, leftType);
2941 expect(assgn.rightHandSide.staticType, rightType);
2942 }
2943
2944 // Check that even within a static variable cycle, inferred
2945 // types get propagated to the members of the cycle.
2946 void assertVariableDeclarationStatementTypes(
2947 Statement stmt, DartType varType, DartType initializerType) {
2948 VariableDeclaration decl =
2949 (stmt as VariableDeclarationStatement).variables.variables[0];
2950 assertVariableDeclarationTypes(decl, varType, initializerType);
2951 }
2952
2953 void assertVariableDeclarationTypes(
2954 VariableDeclaration decl, DartType varType, DartType initializerType) {
2955 expect(decl.element.type, varType);
2956 expect(decl.initializer.staticType, initializerType);
2957 }
2958
2959 void fail_perform_inference_cross_unit_instance() {
2960 List<Source> sources = newSources({
2961 '/a7.dart': '''
2962 import 'b7.dart';
2963 class A {
2964 final a2 = new B().b2;
2965 }
2966 ''',
2967 '/b7.dart': '''
2968 class B {
2969 final b2 = 1;
2970 }
2971 ''',
2972 '/main7.dart': '''
2973 import "a7.dart";
2974
2975 test1() {
2976 int x = 0;
2977 x = new A().a2;
2978 }
2979 '''
2980 });
2981 List<dynamic> units =
2982 computeLibraryResults(sources, RESOLVED_UNIT8).toList();
2983 CompilationUnit unit0 = units[0];
2984 CompilationUnit unit1 = units[1];
2985 CompilationUnit unit2 = units[2];
2986
2987 InterfaceType intType = context.typeProvider.intType;
2988
2989 assertVariableDeclarationTypes(
2990 getFieldInClass(unit0, "A", "a2"), intType, intType);
2991
2992 assertVariableDeclarationTypes(
2993 getFieldInClass(unit1, "B", "b2"), intType, intType);
2994
2995 List<Statement> statements =
2996 getStatementsInTopLevelFunction(unit2, "test1");
2997
2998 assertAssignmentStatementTypes(statements[1], intType, intType);
2999 }
3000
3001 void fail_perform_inference_cross_unit_static_instance() {
3002 List<Source> sources = newSources({
3003 '/a.dart': '''
3004 import 'b.dart';
3005 class A {
3006 static final a1 = B.b1;
3007 final a2 = new B().b2;
3008 }
3009 ''',
3010 '/b.dart': '''
3011 class B {
3012 static final b1 = 1;
3013 final b2 = 1;
3014 }
3015 ''',
3016 '/main.dart': '''
3017 import "a.dart";
3018
3019 test1() {
3020 int x = 0;
3021 // inference in A now works.
3022 x = A.a1;
3023 x = new A().a2;
3024 }
3025 '''
3026 });
3027 List<dynamic> units =
3028 computeLibraryResults(sources, RESOLVED_UNIT8).toList();
3029 CompilationUnit unit0 = units[0];
3030 CompilationUnit unit1 = units[1];
3031 CompilationUnit unit2 = units[2];
3032
3033 InterfaceType intType = context.typeProvider.intType;
3034
3035 assertVariableDeclarationTypes(
3036 getFieldInClass(unit0, "A", "a1"), intType, intType);
3037 assertVariableDeclarationTypes(
3038 getFieldInClass(unit0, "A", "a2"), intType, intType);
3039
3040 assertVariableDeclarationTypes(
3041 getFieldInClass(unit1, "B", "b1"), intType, intType);
3042 assertVariableDeclarationTypes(
3043 getFieldInClass(unit1, "B", "b2"), intType, intType);
3044
3045 List<Statement> statements =
3046 getStatementsInTopLevelFunction(unit2, "test1");
3047
3048 assertAssignmentStatementTypes(statements[1], intType, intType);
3049 assertAssignmentStatementTypes(statements[2], intType, intType);
3050 }
3051
3052 @override 3445 @override
3053 void setUp() { 3446 void setUp() {
3054 super.setUp(); 3447 super.setUp();
3055 enableStrongMode(); 3448 enableStrongMode();
3056 } 3449 }
3057 3450
3058 // Test that local variables in method bodies are inferred appropriately 3451 // Check that even within a static variable cycle, inferred
3452 // types get propagated to the members of the cycle.
3059 void test_perform_cycle() { 3453 void test_perform_cycle() {
3060 AnalysisTarget source = newSource( 3454 AnalysisTarget source = newSource(
3061 '/test.dart', 3455 '/test.dart',
3062 ''' 3456 '''
3063 var piFirst = true; 3457 var piFirst = true;
3064 var pi = piFirst ? 3.14 : tau / 2; 3458 var pi = piFirst ? 3.14 : tau / 2;
3065 var tau = piFirst ? pi * 2 : 6.28; 3459 var tau = piFirst ? pi * 2 : 6.28;
3066 '''); 3460 ''');
3067 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT8); 3461 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT9);
3068 CompilationUnit unit = outputs[RESOLVED_UNIT8]; 3462 CompilationUnit unit = outputs[RESOLVED_UNIT9];
3069 VariableElement piFirst = 3463 VariableElement piFirst =
3070 getTopLevelVariable(unit, 'piFirst').name.staticElement; 3464 getTopLevelVariable(unit, 'piFirst').name.staticElement;
3071 VariableElement pi = getTopLevelVariable(unit, 'pi').name.staticElement; 3465 VariableElement pi = getTopLevelVariable(unit, 'pi').name.staticElement;
3072 VariableElement tau = getTopLevelVariable(unit, 'tau').name.staticElement; 3466 VariableElement tau = getTopLevelVariable(unit, 'tau').name.staticElement;
3073 Expression piFirstUse = (getTopLevelVariable(unit, 'tau').initializer 3467 Expression piFirstUse = (getTopLevelVariable(unit, 'tau').initializer
3074 as ConditionalExpression).condition; 3468 as ConditionalExpression).condition;
3075 3469
3076 expect(piFirstUse.staticType, context.typeProvider.boolType); 3470 expect(piFirstUse.staticType, context.typeProvider.boolType);
3077 expect(piFirst.type, context.typeProvider.boolType); 3471 expect(piFirst.type, context.typeProvider.boolType);
3078 expect(pi.type.isDynamic, isTrue); 3472 expect(pi.type.isDynamic, isTrue);
3079 expect(tau.type.isDynamic, isTrue); 3473 expect(tau.type.isDynamic, isTrue);
3080 } 3474 }
3081 3475
3082 // Test inference interactions between local variables and fields 3476 void test_perform_local_explicit_disabled() {
3083 void test_perform_inference_cross_unit_cyclic() { 3477 AnalysisTarget source = newSource(
3084 AnalysisTarget firstSource = newSource(
3085 '/a.dart',
3086 '''
3087 import 'test.dart';
3088 var x = 2;
3089 class A { static var x = 2; }
3090 ''');
3091 AnalysisTarget secondSource = newSource(
3092 '/test.dart', 3478 '/test.dart',
3093 ''' 3479 '''
3094 import 'a.dart'; 3480 test() {
3095 var y = x; 3481 int x = 3;
3096 class B { static var y = A.x; } 3482 x = "hi";
3097 3483 }
3098 test1() {
3099 int t = 3;
3100 t = x;
3101 t = y;
3102 t = A.x;
3103 t = B.y;
3104 }
3105 '''); 3484 ''');
3106 computeResult( 3485 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT9);
3107 new LibrarySpecificUnit(firstSource, firstSource), RESOLVED_UNIT8); 3486 CompilationUnit unit = outputs[RESOLVED_UNIT9];
3108 CompilationUnit unit1 = outputs[RESOLVED_UNIT8];
3109 computeResult(
3110 new LibrarySpecificUnit(secondSource, secondSource), RESOLVED_UNIT8);
3111 CompilationUnit unit2 = outputs[RESOLVED_UNIT8];
3112
3113 InterfaceType intType = context.typeProvider.intType;
3114
3115 assertVariableDeclarationTypes(
3116 getTopLevelVariable(unit1, "x"), intType, intType);
3117 assertVariableDeclarationTypes(
3118 getFieldInClass(unit1, "A", "x"), intType, intType);
3119
3120 assertVariableDeclarationTypes(
3121 getTopLevelVariable(unit2, "y"), intType, intType);
3122 assertVariableDeclarationTypes(
3123 getFieldInClass(unit2, "B", "y"), intType, intType);
3124
3125 List<Statement> statements =
3126 getStatementsInTopLevelFunction(unit2, "test1");
3127
3128 assertAssignmentStatementTypes(statements[1], intType, intType);
3129 assertAssignmentStatementTypes(statements[2], intType, intType);
3130 assertAssignmentStatementTypes(statements[3], intType, intType);
3131 assertAssignmentStatementTypes(statements[4], intType, intType);
3132 }
3133
3134 // Test inference interactions between local variables and top level
3135 // variables
3136 void test_perform_inference_cross_unit_non_cyclic() {
3137 AnalysisTarget firstSource = newSource(
3138 '/a.dart',
3139 '''
3140 var x = 2;
3141 class A { static var x = 2; }
3142 ''');
3143 AnalysisTarget secondSource = newSource(
3144 '/test.dart',
3145 '''
3146 import 'a.dart';
3147 var y = x;
3148 class B { static var y = A.x; }
3149
3150 test1() {
3151 x = /*severe:StaticTypeError*/"hi";
3152 y = /*severe:StaticTypeError*/"hi";
3153 A.x = /*severe:StaticTypeError*/"hi";
3154 B.y = /*severe:StaticTypeError*/"hi";
3155 }
3156 ''');
3157 computeResult(
3158 new LibrarySpecificUnit(firstSource, firstSource), RESOLVED_UNIT8);
3159 CompilationUnit unit1 = outputs[RESOLVED_UNIT8];
3160 computeResult(
3161 new LibrarySpecificUnit(secondSource, secondSource), RESOLVED_UNIT8);
3162 CompilationUnit unit2 = outputs[RESOLVED_UNIT8];
3163 3487
3164 InterfaceType intType = context.typeProvider.intType; 3488 InterfaceType intType = context.typeProvider.intType;
3165 InterfaceType stringType = context.typeProvider.stringType; 3489 InterfaceType stringType = context.typeProvider.stringType;
3166 3490
3167 assertVariableDeclarationTypes( 3491 List<Statement> statements = getStatementsInTopLevelFunction(unit, "test");
3168 getTopLevelVariable(unit1, "x"), intType, intType); 3492 VariableDeclaration decl =
3169 assertVariableDeclarationTypes( 3493 (statements[0] as VariableDeclarationStatement).variables.variables[0];
3170 getFieldInClass(unit1, "A", "x"), intType, intType); 3494 expect(decl.element.type, intType);
3495 expect(decl.initializer.staticType, intType);
3171 3496
3172 assertVariableDeclarationTypes( 3497 ExpressionStatement statement = statements[1];
3173 getTopLevelVariable(unit2, "y"), intType, intType); 3498 AssignmentExpression assgn = statement.expression;
3174 assertVariableDeclarationTypes( 3499 expect(assgn.leftHandSide.staticType, intType);
3175 getFieldInClass(unit2, "B", "y"), intType, intType); 3500 expect(assgn.rightHandSide.staticType, stringType);
3176
3177 List<Statement> statements =
3178 getStatementsInTopLevelFunction(unit2, "test1");
3179
3180 assertAssignmentStatementTypes(statements[0], intType, stringType);
3181 assertAssignmentStatementTypes(statements[1], intType, stringType);
3182 } 3501 }
3183 3502
3184 // Test that inference does not propagate from null 3503 // Test that local variables in method bodies are inferred appropriately
3185 void test_perform_inference_local_variables() { 3504 void test_perform_inference_local_variables() {
3186 AnalysisTarget source = newSource( 3505 AnalysisTarget source = newSource(
3187 '/test.dart', 3506 '/test.dart',
3188 ''' 3507 '''
3189 test() { 3508 test() {
3190 int x = 3; 3509 int x = 3;
3191 x = "hi"; 3510 x = "hi";
3192 var y = 3; 3511 var y = 3;
3193 y = "hi"; 3512 y = "hi";
3194 } 3513 }
3195 '''); 3514 ''');
3196 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT8); 3515 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT9);
3197 CompilationUnit unit = outputs[RESOLVED_UNIT8]; 3516 CompilationUnit unit = outputs[RESOLVED_UNIT9];
3198 3517
3199 InterfaceType intType = context.typeProvider.intType; 3518 InterfaceType intType = context.typeProvider.intType;
3200 InterfaceType stringType = context.typeProvider.stringType; 3519 InterfaceType stringType = context.typeProvider.stringType;
3201 3520
3202 List<Statement> statements = getStatementsInTopLevelFunction(unit, "test"); 3521 List<Statement> statements = getStatementsInTopLevelFunction(unit, "test");
3203 3522
3204 assertVariableDeclarationStatementTypes(statements[0], intType, intType); 3523 assertVariableDeclarationStatementTypes(statements[0], intType, intType);
3205 assertAssignmentStatementTypes(statements[1], intType, stringType); 3524 assertAssignmentStatementTypes(statements[1], intType, stringType);
3206 assertVariableDeclarationStatementTypes(statements[2], intType, intType); 3525 assertVariableDeclarationStatementTypes(statements[2], intType, intType);
3207 assertAssignmentStatementTypes(statements[3], intType, stringType); 3526 assertAssignmentStatementTypes(statements[3], intType, stringType);
3208 } 3527 }
3209 3528
3210 // Test inference across units (non-cyclic) 3529 // Test inference interactions between local variables and fields
3211 void test_perform_inference_local_variables_fields() { 3530 void test_perform_inference_local_variables_fields() {
3212 AnalysisTarget source = newSource( 3531 AnalysisTarget source = newSource(
3213 '/test.dart', 3532 '/test.dart',
3214 ''' 3533 '''
3215 class A { 3534 class A {
3216 int x = 0; 3535 int x = 0;
3217 3536
3218 test1() { 3537 test1() {
3219 var a = x; 3538 var a = x;
3220 a = "hi"; 3539 a = "hi";
3221 a = 3; 3540 a = 3;
3222 var b = y; 3541 var b = y;
3223 b = "hi"; 3542 b = "hi";
3224 b = 4; 3543 b = 4;
3225 var c = z; 3544 var c = z;
3226 c = "hi"; 3545 c = "hi";
3227 c = 4; 3546 c = 4;
3228 } 3547 }
3229 3548
3230 int y; // field def after use 3549 int y; // field def after use
3231 final z = 42; // should infer `int` 3550 final z = 42; // should infer `int`
3232 } 3551 }
3233 '''); 3552 ''');
3234 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT8); 3553 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT9);
3235 CompilationUnit unit = outputs[RESOLVED_UNIT8]; 3554 CompilationUnit unit = outputs[RESOLVED_UNIT9];
3236 3555
3237 InterfaceType intType = context.typeProvider.intType; 3556 InterfaceType intType = context.typeProvider.intType;
3238 InterfaceType stringType = context.typeProvider.stringType; 3557 InterfaceType stringType = context.typeProvider.stringType;
3239 3558
3240 List<Statement> statements = getStatementsInMethod(unit, "A", "test1"); 3559 List<Statement> statements = getStatementsInMethod(unit, "A", "test1");
3241 3560
3242 assertVariableDeclarationStatementTypes(statements[0], intType, intType); 3561 assertVariableDeclarationStatementTypes(statements[0], intType, intType);
3243 assertAssignmentStatementTypes(statements[1], intType, stringType); 3562 assertAssignmentStatementTypes(statements[1], intType, stringType);
3244 assertAssignmentStatementTypes(statements[2], intType, intType); 3563 assertAssignmentStatementTypes(statements[2], intType, intType);
3245 3564
3246 assertVariableDeclarationStatementTypes(statements[3], intType, intType); 3565 assertVariableDeclarationStatementTypes(statements[3], intType, intType);
3247 assertAssignmentStatementTypes(statements[4], intType, stringType); 3566 assertAssignmentStatementTypes(statements[4], intType, stringType);
3248 assertAssignmentStatementTypes(statements[5], intType, intType); 3567 assertAssignmentStatementTypes(statements[5], intType, intType);
3249 3568
3250 assertVariableDeclarationStatementTypes(statements[6], intType, intType); 3569 assertVariableDeclarationStatementTypes(statements[6], intType, intType);
3251 assertAssignmentStatementTypes(statements[7], intType, stringType); 3570 assertAssignmentStatementTypes(statements[7], intType, stringType);
3252 assertAssignmentStatementTypes(statements[8], intType, intType); 3571 assertAssignmentStatementTypes(statements[8], intType, intType);
3253 3572
3254 assertVariableDeclarationTypes( 3573 assertVariableDeclarationTypes(
3255 getFieldInClass(unit, "A", "x"), intType, intType); 3574 getFieldInClass(unit, "A", "x"), intType, intType);
3256 assertVariableDeclarationTypes( 3575 assertVariableDeclarationTypes(
3257 getFieldInClass(unit, "A", "z"), intType, intType); 3576 getFieldInClass(unit, "A", "z"), intType, intType);
3258 } 3577 }
3259 3578
3260 // Test inference across units (cyclic) 3579 // Test inference interactions between local variables and top level
3580 // variables
3261 void test_perform_inference_local_variables_topLevel() { 3581 void test_perform_inference_local_variables_topLevel() {
3262 AnalysisTarget source = newSource( 3582 AnalysisTarget source = newSource(
3263 '/test.dart', 3583 '/test.dart',
3264 ''' 3584 '''
3265 int x = 0; 3585 int x = 0;
3266 3586
3267 test1() { 3587 test1() {
3268 var a = x; 3588 var a = x;
3269 a = /*severe:StaticTypeError*/"hi"; 3589 a = /*severe:StaticTypeError*/"hi";
3270 a = 3; 3590 a = 3;
3271 var b = y; 3591 var b = y;
3272 b = /*severe:StaticTypeError*/"hi"; 3592 b = /*severe:StaticTypeError*/"hi";
3273 b = 4; 3593 b = 4;
3274 var c = z; 3594 var c = z;
3275 c = /*severe:StaticTypeError*/"hi"; 3595 c = /*severe:StaticTypeError*/"hi";
3276 c = 4; 3596 c = 4;
3277 } 3597 }
3278 3598
3279 int y = 0; // field def after use 3599 int y = 0; // field def after use
3280 final z = 42; // should infer `int` 3600 final z = 42; // should infer `int`
3281 '''); 3601 ''');
3282 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT8); 3602 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT9);
3283 CompilationUnit unit = outputs[RESOLVED_UNIT8]; 3603 CompilationUnit unit = outputs[RESOLVED_UNIT9];
3284 3604
3285 InterfaceType intType = context.typeProvider.intType; 3605 InterfaceType intType = context.typeProvider.intType;
3286 InterfaceType stringType = context.typeProvider.stringType; 3606 InterfaceType stringType = context.typeProvider.stringType;
3287 3607
3288 List<Statement> statements = getStatementsInTopLevelFunction(unit, "test1"); 3608 List<Statement> statements = getStatementsInTopLevelFunction(unit, "test1");
3289 3609
3290 assertVariableDeclarationStatementTypes(statements[0], intType, intType); 3610 assertVariableDeclarationStatementTypes(statements[0], intType, intType);
3291 assertAssignmentStatementTypes(statements[1], intType, stringType); 3611 assertAssignmentStatementTypes(statements[1], intType, stringType);
3292 assertAssignmentStatementTypes(statements[2], intType, intType); 3612 assertAssignmentStatementTypes(statements[2], intType, intType);
3293 3613
3294 assertVariableDeclarationStatementTypes(statements[3], intType, intType); 3614 assertVariableDeclarationStatementTypes(statements[3], intType, intType);
3295 assertAssignmentStatementTypes(statements[4], intType, stringType); 3615 assertAssignmentStatementTypes(statements[4], intType, stringType);
3296 assertAssignmentStatementTypes(statements[5], intType, intType); 3616 assertAssignmentStatementTypes(statements[5], intType, intType);
3297 3617
3298 assertVariableDeclarationStatementTypes(statements[6], intType, intType); 3618 assertVariableDeclarationStatementTypes(statements[6], intType, intType);
3299 assertAssignmentStatementTypes(statements[7], intType, stringType); 3619 assertAssignmentStatementTypes(statements[7], intType, stringType);
3300 assertAssignmentStatementTypes(statements[8], intType, intType); 3620 assertAssignmentStatementTypes(statements[8], intType, intType);
3301 3621
3302 assertVariableDeclarationTypes( 3622 assertVariableDeclarationTypes(
3303 getTopLevelVariable(unit, "x"), intType, intType); 3623 getTopLevelVariable(unit, "x"), intType, intType);
3304 assertVariableDeclarationTypes( 3624 assertVariableDeclarationTypes(
3305 getTopLevelVariable(unit, "y"), intType, intType); 3625 getTopLevelVariable(unit, "y"), intType, intType);
3306 assertVariableDeclarationTypes( 3626 assertVariableDeclarationTypes(
3307 getTopLevelVariable(unit, "z"), intType, intType); 3627 getTopLevelVariable(unit, "z"), intType, intType);
3308 } 3628 }
3309 3629
3310 // Test inference of instance fields across units 3630 // Test that inference does not propagate from null
3311 // TODO(leafp): Fix this
3312 // https://github.com/dart-lang/dev_compiler/issues/354
3313 void test_perform_inference_null() { 3631 void test_perform_inference_null() {
3314 AnalysisTarget source = newSource( 3632 AnalysisTarget source = newSource(
3315 '/test.dart', 3633 '/test.dart',
3316 ''' 3634 '''
3317 var x = null; 3635 var x = null;
3318 var y = 3; 3636 var y = 3;
3319 class A { 3637 class A {
3320 static var x = null; 3638 static var x = null;
3321 static var y = 3; 3639 static var y = 3;
3322 3640
3323 var x2 = null; 3641 var x2 = null;
3324 var y2 = 3; 3642 var y2 = 3;
3325 } 3643 }
3326 3644
3327 test() { 3645 test() {
3328 x = "hi"; 3646 x = "hi";
3329 y = /*severe:StaticTypeError*/"hi"; 3647 y = /*severe:StaticTypeError*/"hi";
3330 A.x = "hi"; 3648 A.x = "hi";
3331 A.y = /*severe:StaticTypeError*/"hi"; 3649 A.y = /*severe:StaticTypeError*/"hi";
3332 new A().x2 = "hi"; 3650 new A().x2 = "hi";
3333 new A().y2 = /*severe:StaticTypeError*/"hi"; 3651 new A().y2 = /*severe:StaticTypeError*/"hi";
3334 } 3652 }
3335 '''); 3653 ''');
3336 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT8); 3654 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT9);
3337 CompilationUnit unit = outputs[RESOLVED_UNIT8]; 3655 CompilationUnit unit = outputs[RESOLVED_UNIT9];
3338 3656
3339 InterfaceType intType = context.typeProvider.intType; 3657 InterfaceType intType = context.typeProvider.intType;
3340 InterfaceType stringType = context.typeProvider.stringType; 3658 InterfaceType stringType = context.typeProvider.stringType;
3341 DartType bottomType = context.typeProvider.bottomType; 3659 DartType bottomType = context.typeProvider.bottomType;
3342 DartType dynamicType = context.typeProvider.dynamicType; 3660 DartType dynamicType = context.typeProvider.dynamicType;
3343 3661
3344 assertVariableDeclarationTypes( 3662 assertVariableDeclarationTypes(
3345 getTopLevelVariable(unit, "x"), dynamicType, bottomType); 3663 getTopLevelVariable(unit, "x"), dynamicType, bottomType);
3346 assertVariableDeclarationTypes( 3664 assertVariableDeclarationTypes(
3347 getTopLevelVariable(unit, "y"), intType, intType); 3665 getTopLevelVariable(unit, "y"), intType, intType);
3348 assertVariableDeclarationTypes( 3666 assertVariableDeclarationTypes(
3349 getFieldInClass(unit, "A", "x"), dynamicType, bottomType); 3667 getFieldInClass(unit, "A", "x"), dynamicType, bottomType);
3350 assertVariableDeclarationTypes( 3668 assertVariableDeclarationTypes(
3351 getFieldInClass(unit, "A", "y"), intType, intType); 3669 getFieldInClass(unit, "A", "y"), intType, intType);
3352 assertVariableDeclarationTypes( 3670 assertVariableDeclarationTypes(
3353 getFieldInClass(unit, "A", "x2"), dynamicType, bottomType); 3671 getFieldInClass(unit, "A", "x2"), dynamicType, bottomType);
3354 assertVariableDeclarationTypes( 3672 assertVariableDeclarationTypes(
3355 getFieldInClass(unit, "A", "y2"), intType, intType); 3673 getFieldInClass(unit, "A", "y2"), intType, intType);
3356 3674
3357 List<Statement> statements = getStatementsInTopLevelFunction(unit, "test"); 3675 List<Statement> statements = getStatementsInTopLevelFunction(unit, "test");
3358 3676
3359 assertAssignmentStatementTypes(statements[0], dynamicType, stringType); 3677 assertAssignmentStatementTypes(statements[0], dynamicType, stringType);
3360 assertAssignmentStatementTypes(statements[1], intType, stringType); 3678 assertAssignmentStatementTypes(statements[1], intType, stringType);
3361 assertAssignmentStatementTypes(statements[2], dynamicType, stringType); 3679 assertAssignmentStatementTypes(statements[2], dynamicType, stringType);
3362 assertAssignmentStatementTypes(statements[3], intType, stringType); 3680 assertAssignmentStatementTypes(statements[3], intType, stringType);
3363 assertAssignmentStatementTypes(statements[4], dynamicType, stringType); 3681 assertAssignmentStatementTypes(statements[4], dynamicType, stringType);
3364 assertAssignmentStatementTypes(statements[5], intType, stringType); 3682 assertAssignmentStatementTypes(statements[5], intType, stringType);
3365 } 3683 }
3366 3684
3685 // Test inference across units (non-cyclic)
3686 void test_perform_inference_cross_unit_non_cyclic() {
3687 AnalysisTarget firstSource = newSource(
3688 '/a.dart',
3689 '''
3690 var x = 2;
3691 class A { static var x = 2; }
3692 ''');
3693 AnalysisTarget secondSource = newSource(
3694 '/test.dart',
3695 '''
3696 import 'a.dart';
3697 var y = x;
3698 class B { static var y = A.x; }
3699
3700 test1() {
3701 x = /*severe:StaticTypeError*/"hi";
3702 y = /*severe:StaticTypeError*/"hi";
3703 A.x = /*severe:StaticTypeError*/"hi";
3704 B.y = /*severe:StaticTypeError*/"hi";
3705 }
3706 ''');
3707 computeResult(
3708 new LibrarySpecificUnit(firstSource, firstSource), RESOLVED_UNIT9);
3709 CompilationUnit unit1 = outputs[RESOLVED_UNIT9];
3710 computeResult(
3711 new LibrarySpecificUnit(secondSource, secondSource), RESOLVED_UNIT9);
3712 CompilationUnit unit2 = outputs[RESOLVED_UNIT9];
3713
3714 InterfaceType intType = context.typeProvider.intType;
3715 InterfaceType stringType = context.typeProvider.stringType;
3716
3717 assertVariableDeclarationTypes(
3718 getTopLevelVariable(unit1, "x"), intType, intType);
3719 assertVariableDeclarationTypes(
3720 getFieldInClass(unit1, "A", "x"), intType, intType);
3721
3722 assertVariableDeclarationTypes(
3723 getTopLevelVariable(unit2, "y"), intType, intType);
3724 assertVariableDeclarationTypes(
3725 getFieldInClass(unit2, "B", "y"), intType, intType);
3726
3727 List<Statement> statements =
3728 getStatementsInTopLevelFunction(unit2, "test1");
3729
3730 assertAssignmentStatementTypes(statements[0], intType, stringType);
3731 assertAssignmentStatementTypes(statements[1], intType, stringType);
3732 }
3733
3734 // Test inference across units (cyclic)
3735 void test_perform_inference_cross_unit_cyclic() {
3736 AnalysisTarget firstSource = newSource(
3737 '/a.dart',
3738 '''
3739 import 'test.dart';
3740 var x = 2;
3741 class A { static var x = 2; }
3742 ''');
3743 AnalysisTarget secondSource = newSource(
3744 '/test.dart',
3745 '''
3746 import 'a.dart';
3747 var y = x;
3748 class B { static var y = A.x; }
3749
3750 test1() {
3751 int t = 3;
3752 t = x;
3753 t = y;
3754 t = A.x;
3755 t = B.y;
3756 }
3757 ''');
3758 computeResult(
3759 new LibrarySpecificUnit(firstSource, firstSource), RESOLVED_UNIT9);
3760 CompilationUnit unit1 = outputs[RESOLVED_UNIT9];
3761 computeResult(
3762 new LibrarySpecificUnit(secondSource, secondSource), RESOLVED_UNIT9);
3763 CompilationUnit unit2 = outputs[RESOLVED_UNIT9];
3764
3765 InterfaceType intType = context.typeProvider.intType;
3766
3767 assertVariableDeclarationTypes(
3768 getTopLevelVariable(unit1, "x"), intType, intType);
3769 assertVariableDeclarationTypes(
3770 getFieldInClass(unit1, "A", "x"), intType, intType);
3771
3772 assertVariableDeclarationTypes(
3773 getTopLevelVariable(unit2, "y"), intType, intType);
3774 assertVariableDeclarationTypes(
3775 getFieldInClass(unit2, "B", "y"), intType, intType);
3776
3777 List<Statement> statements =
3778 getStatementsInTopLevelFunction(unit2, "test1");
3779
3780 assertAssignmentStatementTypes(statements[1], intType, intType);
3781 assertAssignmentStatementTypes(statements[2], intType, intType);
3782 assertAssignmentStatementTypes(statements[3], intType, intType);
3783 assertAssignmentStatementTypes(statements[4], intType, intType);
3784 }
3785
3786 // Test inference of instance fields across units
3787 void test_perform_inference_cross_unit_instance() {
3788 List<Source> sources = newSources({
3789 '/a.dart': '''
3790 import 'b.dart';
3791 class A {
3792 final a2 = new B().b2;
3793 }
3794 ''',
3795 '/b.dart': '''
3796 class B {
3797 final b2 = 1;
3798 }
3799 ''',
3800 '/main.dart': '''
3801 import "a.dart";
3802
3803 test1() {
3804 int x = 0;
3805 x = new A().a2;
3806 }
3807 '''
3808 });
3809 List<dynamic> units =
3810 computeLibraryResults(sources, RESOLVED_UNIT9).toList();
3811 CompilationUnit unit0 = units[0];
3812 CompilationUnit unit1 = units[1];
3813 CompilationUnit unit2 = units[2];
3814
3815 InterfaceType intType = context.typeProvider.intType;
3816
3817 assertVariableDeclarationTypes(
3818 getFieldInClass(unit0, "A", "a2"), intType, intType);
3819
3820 assertVariableDeclarationTypes(
3821 getFieldInClass(unit1, "B", "b2"), intType, intType);
3822
3823 List<Statement> statements =
3824 getStatementsInTopLevelFunction(unit2, "test1");
3825
3826 assertAssignmentStatementTypes(statements[1], intType, intType);
3827 }
3828
3367 // Test inference between static and instance fields 3829 // Test inference between static and instance fields
3368 // TODO(leafp): Fix this 3830 void test_perform_inference_cross_unit_static_instance() {
3369 // https://github.com/dart-lang/dev_compiler/issues/354 3831 List<Source> sources = newSources({
3370 void test_perform_local_explicit_disabled() { 3832 '/a.dart': '''
3371 AnalysisTarget source = newSource( 3833 import 'b.dart';
3372 '/test.dart', 3834 class A {
3373 ''' 3835 static final a1 = B.b1;
3374 test() { 3836 final a2 = new B().b2;
3375 int x = 3; 3837 }
3376 x = "hi"; 3838 ''',
3377 } 3839 '/b.dart': '''
3378 '''); 3840 class B {
3379 computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT8); 3841 static final b1 = 1;
3380 CompilationUnit unit = outputs[RESOLVED_UNIT8]; 3842 final b2 = 1;
3843 }
3844 ''',
3845 '/main.dart': '''
3846 import "a.dart";
3847
3848 test1() {
3849 int x = 0;
3850 // inference in A now works.
3851 x = A.a1;
3852 x = new A().a2;
3853 }
3854 '''
3855 });
3856 List<dynamic> units =
3857 computeLibraryResults(sources, RESOLVED_UNIT9).toList();
3858 CompilationUnit unit0 = units[0];
3859 CompilationUnit unit1 = units[1];
3860 CompilationUnit unit2 = units[2];
3861
3862 InterfaceType intType = context.typeProvider.intType;
3863
3864 assertVariableDeclarationTypes(
3865 getFieldInClass(unit0, "A", "a1"), intType, intType);
3866 assertVariableDeclarationTypes(
3867 getFieldInClass(unit0, "A", "a2"), intType, intType);
3868
3869 assertVariableDeclarationTypes(
3870 getFieldInClass(unit1, "B", "b1"), intType, intType);
3871 assertVariableDeclarationTypes(
3872 getFieldInClass(unit1, "B", "b2"), intType, intType);
3873
3874 List<Statement> statements =
3875 getStatementsInTopLevelFunction(unit2, "test1");
3876
3877 assertAssignmentStatementTypes(statements[1], intType, intType);
3878 assertAssignmentStatementTypes(statements[2], intType, intType);
3879 }
3880
3881 // Test inference between fields and method bodies
3882 void test_perform_inference_cross_unit_instance_member() {
3883 List<Source> sources = newSources({
3884 '/a.dart': '''
3885 import 'b.dart';
3886 var bar = new B();
3887 void foo() {
3888 String x = bar.f.z;
3889 }
3890 ''',
3891 '/b.dart': '''
3892 class C {
3893 var z = 3;
3894 }
3895
3896 class B {
3897 var f = new C();
3898 }
3899 ''',
3900 '/c.dart': '''
3901 import 'b.dart';
3902 var bar = new B();
3903 void foo() {
3904 String x = bar.f.z;
3905 }
3906 '''
3907 });
3908 List<dynamic> units =
3909 computeLibraryResults(sources, RESOLVED_UNIT9).toList();
3910 CompilationUnit unit0 = units[0];
3911 CompilationUnit unit1 = units[1];
3912 CompilationUnit unit2 = units[2];
3381 3913
3382 InterfaceType intType = context.typeProvider.intType; 3914 InterfaceType intType = context.typeProvider.intType;
3383 InterfaceType stringType = context.typeProvider.stringType; 3915 InterfaceType stringType = context.typeProvider.stringType;
3384 3916
3385 List<Statement> statements = getStatementsInTopLevelFunction(unit, "test"); 3917 assertVariableDeclarationStatementTypes(
3386 VariableDeclaration decl = 3918 getStatementsInTopLevelFunction(unit0, "foo")[0], stringType, intType);
3387 (statements[0] as VariableDeclarationStatement).variables.variables[0]; 3919 assertVariableDeclarationStatementTypes(
3388 expect(decl.element.type, intType); 3920 getStatementsInTopLevelFunction(unit2, "foo")[0], stringType, intType);
3389 expect(decl.initializer.staticType, intType);
3390
3391 ExpressionStatement statement = statements[1];
3392 AssignmentExpression assgn = statement.expression;
3393 expect(assgn.leftHandSide.staticType, intType);
3394 expect(assgn.rightHandSide.staticType, stringType);
3395 } 3921 }
3396 } 3922 }
3397 3923
3398 @reflectiveTest 3924 @reflectiveTest
3399 class VerifyUnitTaskTest extends _AbstractDartTaskTest { 3925 class VerifyUnitTaskTest extends _AbstractDartTaskTest {
3400 test_perform_constantError() { 3926 test_perform_constantError() {
3401 Source source = newSource( 3927 Source source = newSource(
3402 '/test.dart', 3928 '/test.dart',
3403 ''' 3929 '''
3404 main(int p) { 3930 main(int p) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
3462 errorListener.assertErrorsWithCodes( 3988 errorListener.assertErrorsWithCodes(
3463 <ErrorCode>[StaticTypeWarningCode.NON_BOOL_CONDITION]); 3989 <ErrorCode>[StaticTypeWarningCode.NON_BOOL_CONDITION]);
3464 } 3990 }
3465 } 3991 }
3466 3992
3467 class _AbstractDartTaskTest extends AbstractContextTest { 3993 class _AbstractDartTaskTest extends AbstractContextTest {
3468 Source emptySource; 3994 Source emptySource;
3469 3995
3470 GatheringErrorListener errorListener = new GatheringErrorListener(); 3996 GatheringErrorListener errorListener = new GatheringErrorListener();
3471 3997
3998 void assertAssignmentStatementTypes(
3999 Statement stmt, DartType leftType, DartType rightType) {
4000 AssignmentExpression assgn = (stmt as ExpressionStatement).expression;
4001 expect(assgn.leftHandSide.staticType, leftType);
4002 expect(assgn.rightHandSide.staticType, rightType);
4003 }
4004
3472 void assertIsInvalid(AnalysisTarget target, ResultDescriptor descriptor) { 4005 void assertIsInvalid(AnalysisTarget target, ResultDescriptor descriptor) {
3473 CacheEntry entry = context.getCacheEntry(target); 4006 CacheEntry entry = context.getCacheEntry(target);
3474 expect(entry.isInvalid(descriptor), isTrue); 4007 expect(entry.isInvalid(descriptor), isTrue);
3475 } 4008 }
3476 4009
3477 void assertIsValid(AnalysisTarget target, ResultDescriptor descriptor) { 4010 void assertIsValid(AnalysisTarget target, ResultDescriptor descriptor) {
3478 CacheEntry entry = context.getCacheEntry(target); 4011 CacheEntry entry = context.getCacheEntry(target);
3479 expect(entry.isValid(descriptor), isTrue); 4012 expect(entry.isValid(descriptor), isTrue);
3480 } 4013 }
3481 4014
3482 void assertSameResults(List<ResultDescriptor> descriptors) { 4015 void assertSameResults(List<ResultDescriptor> descriptors) {
3483 descriptors.forEach((descriptor) { 4016 descriptors.forEach((descriptor) {
3484 var oldResult = oldOutputs[descriptor]; 4017 var oldResult = oldOutputs[descriptor];
3485 var newResult = outputs[descriptor]; 4018 var newResult = outputs[descriptor];
3486 expect(newResult, same(oldResult), reason: descriptor.name); 4019 expect(newResult, same(oldResult), reason: descriptor.name);
3487 }); 4020 });
3488 } 4021 }
3489 4022
4023 void assertVariableDeclarationTypes(
4024 VariableDeclaration decl, DartType varType, DartType initializerType) {
4025 expect(decl.element.type, varType);
4026 expect(decl.initializer.staticType, initializerType);
4027 }
4028
4029 void assertVariableDeclarationStatementTypes(
4030 Statement stmt, DartType varType, DartType initializerType) {
4031 VariableDeclaration decl =
4032 (stmt as VariableDeclarationStatement).variables.variables[0];
4033 assertVariableDeclarationTypes(decl, varType, initializerType);
4034 }
4035
3490 List<dynamic> computeLibraryResults( 4036 List<dynamic> computeLibraryResults(
3491 List<Source> sources, ResultDescriptor result, 4037 List<Source> sources, ResultDescriptor result,
3492 {isInstanceOf matcher: null}) { 4038 {isInstanceOf matcher: null}) {
3493 dynamic compute(Source source) { 4039 dynamic compute(Source source) {
3494 computeResult(new LibrarySpecificUnit(source, source), result, 4040 computeResult(new LibrarySpecificUnit(source, source), result,
3495 matcher: matcher); 4041 matcher: matcher);
3496 return outputs[result]; 4042 return outputs[result];
3497 } 4043 }
3498 return sources.map(compute).toList(); 4044 return sources.map(compute).toList();
3499 } 4045 }
3500 4046
4047 List<Map<ResultDescriptor, dynamic>> computeLibraryResultsMap(
4048 List<Source> sources, ResultDescriptor result,
4049 {isInstanceOf matcher: null}) {
4050 Map<ResultDescriptor, dynamic> compute(Source source) {
4051 computeResult(new LibrarySpecificUnit(source, source), result,
4052 matcher: matcher);
4053 return outputs;
4054 }
4055 return sources.map(compute).toList();
4056 }
4057
3501 /** 4058 /**
3502 * Create a script object with a single fragment containing the given 4059 * Create a script object with a single fragment containing the given
3503 * [scriptContent]. 4060 * [scriptContent].
3504 */ 4061 */
3505 DartScript createScript(String scriptContent) { 4062 DartScript createScript(String scriptContent) {
3506 String htmlContent = ''' 4063 String htmlContent = '''
3507 <!DOCTYPE html> 4064 <!DOCTYPE html>
3508 <html> 4065 <html>
3509 <head> 4066 <head>
3510 <title>test page</title> 4067 <title>test page</title>
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
3643 /** 4200 /**
3644 * Fill [errorListener] with [result] errors in the current [task]. 4201 * Fill [errorListener] with [result] errors in the current [task].
3645 */ 4202 */
3646 void _fillErrorListener(ResultDescriptor<List<AnalysisError>> result) { 4203 void _fillErrorListener(ResultDescriptor<List<AnalysisError>> result) {
3647 List<AnalysisError> errors = task.outputs[result]; 4204 List<AnalysisError> errors = task.outputs[result];
3648 expect(errors, isNotNull, reason: result.name); 4205 expect(errors, isNotNull, reason: result.name);
3649 errorListener = new GatheringErrorListener(); 4206 errorListener = new GatheringErrorListener();
3650 errorListener.addAll(errors); 4207 errorListener.addAll(errors);
3651 } 4208 }
3652 } 4209 }
OLDNEW
« pkg/analyzer/lib/src/task/dart.dart ('K') | « pkg/analyzer/lib/src/task/dart_work_manager.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698