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

Side by Side Diff: pkg/analyzer/test/generated/resolver_test.dart

Issue 2551023005: Prepare for decoupling analyzer ASTs from element model. (Closed)
Patch Set: Created 4 years 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) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 analyzer.test.generated.resolver_test; 5 library analyzer.test.generated.resolver_test;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analyzer/dart/ast/ast.dart'; 9 import 'package:analyzer/dart/ast/ast.dart';
10 import 'package:analyzer/dart/ast/resolution_accessors.dart';
10 import 'package:analyzer/dart/ast/standard_ast_factory.dart'; 11 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
11 import 'package:analyzer/dart/ast/token.dart'; 12 import 'package:analyzer/dart/ast/token.dart';
12 import 'package:analyzer/dart/ast/visitor.dart'; 13 import 'package:analyzer/dart/ast/visitor.dart';
13 import 'package:analyzer/dart/element/element.dart'; 14 import 'package:analyzer/dart/element/element.dart';
14 import 'package:analyzer/dart/element/type.dart'; 15 import 'package:analyzer/dart/element/type.dart';
15 import 'package:analyzer/file_system/memory_file_system.dart'; 16 import 'package:analyzer/file_system/memory_file_system.dart';
16 import 'package:analyzer/src/dart/element/builder.dart'; 17 import 'package:analyzer/src/dart/element/builder.dart';
17 import 'package:analyzer/src/dart/element/element.dart'; 18 import 'package:analyzer/src/dart/element/element.dart';
18 import 'package:analyzer/src/dart/element/type.dart'; 19 import 'package:analyzer/src/dart/element/type.dart';
19 import 'package:analyzer/src/error/codes.dart'; 20 import 'package:analyzer/src/error/codes.dart';
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 if (invalidlyPropagatedExpressionCount > 0) { 473 if (invalidlyPropagatedExpressionCount > 0) {
473 buffer.writeln("Incorrectly propagated "); 474 buffer.writeln("Incorrectly propagated ");
474 buffer.write(invalidlyPropagatedExpressionCount); 475 buffer.write(invalidlyPropagatedExpressionCount);
475 buffer.write(" of "); 476 buffer.write(" of ");
476 buffer.write(_propagatedExpressionCount); 477 buffer.write(_propagatedExpressionCount);
477 buffer.writeln(" expressions:"); 478 buffer.writeln(" expressions:");
478 for (Expression expression in _invalidlyPropagatedExpressions) { 479 for (Expression expression in _invalidlyPropagatedExpressions) {
479 buffer.write(" "); 480 buffer.write(" ");
480 buffer.write(expression.toString()); 481 buffer.write(expression.toString());
481 buffer.write(" ["); 482 buffer.write(" [");
482 buffer.write(expression.staticType.displayName); 483 buffer.write(staticTypeForExpression(expression).displayName);
483 buffer.write(", "); 484 buffer.write(", ");
484 buffer.write(expression.propagatedType.displayName); 485 buffer.write(propagatedTypeForExpression(expression).displayName);
485 buffer.writeln("]"); 486 buffer.writeln("]");
486 buffer.write(" "); 487 buffer.write(" ");
487 buffer.write(_getFileName(expression)); 488 buffer.write(_getFileName(expression));
488 buffer.write(" : "); 489 buffer.write(" : ");
489 buffer.write(expression.offset); 490 buffer.write(expression.offset);
490 buffer.writeln(")"); 491 buffer.writeln(")");
491 } 492 }
492 } 493 }
493 fail(buffer.toString()); 494 fail(buffer.toString());
494 } 495 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 @override 532 @override
532 Object visitLabel(Label node) => null; 533 Object visitLabel(Label node) => null;
533 534
534 @override 535 @override
535 Object visitLibraryIdentifier(LibraryIdentifier node) => null; 536 Object visitLibraryIdentifier(LibraryIdentifier node) => null;
536 537
537 @override 538 @override
538 Object visitPrefixedIdentifier(PrefixedIdentifier node) { 539 Object visitPrefixedIdentifier(PrefixedIdentifier node) {
539 // In cases where we have a prefixed identifier where the prefix is dynamic, 540 // In cases where we have a prefixed identifier where the prefix is dynamic,
540 // we don't want to assert that the node will have a type. 541 // we don't want to assert that the node will have a type.
541 if (node.staticType == null && node.prefix.staticType.isDynamic) { 542 if (node.staticType == null && staticTypeForExpression(node.prefix).isDynami c) {
542 return null; 543 return null;
543 } 544 }
544 return super.visitPrefixedIdentifier(node); 545 return super.visitPrefixedIdentifier(node);
545 } 546 }
546 547
547 @override 548 @override
548 Object visitSimpleIdentifier(SimpleIdentifier node) { 549 Object visitSimpleIdentifier(SimpleIdentifier node) {
549 // In cases where identifiers are being used for something other than an 550 // In cases where identifiers are being used for something other than an
550 // expressions, then they can be ignored. 551 // expressions, then they can be ignored.
551 AstNode parent = node.parent; 552 AstNode parent = node.parent;
(...skipping 30 matching lines...) Expand all
582 } 583 }
583 584
584 String _getFileName(AstNode node) { 585 String _getFileName(AstNode node) {
585 // TODO (jwren) there are two copies of this method, one here and one in 586 // TODO (jwren) there are two copies of this method, one here and one in
586 // ResolutionVerifier, they should be resolved into a single method 587 // ResolutionVerifier, they should be resolved into a single method
587 if (node != null) { 588 if (node != null) {
588 AstNode root = node.root; 589 AstNode root = node.root;
589 if (root is CompilationUnit) { 590 if (root is CompilationUnit) {
590 CompilationUnit rootCU = root; 591 CompilationUnit rootCU = root;
591 if (rootCU.element != null) { 592 if (rootCU.element != null) {
592 return rootCU.element.source.fullName; 593 return elementForCompilationUnit(rootCU).source.fullName;
593 } else { 594 } else {
594 return "<unknown file- CompilationUnit.getElement() returned null>"; 595 return "<unknown file- CompilationUnit.getElement() returned null>";
595 } 596 }
596 } else { 597 } else {
597 return "<unknown file- CompilationUnit.getRoot() is not a CompilationUni t>"; 598 return "<unknown file- CompilationUnit.getRoot() is not a CompilationUni t>";
598 } 599 }
599 } 600 }
600 return "<unknown file- ASTNode is null>"; 601 return "<unknown file- ASTNode is null>";
601 } 602 }
602 } 603 }
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after
1078 return p; 1079 return p;
1079 } else { 1080 } else {
1080 return null; 1081 return null;
1081 } 1082 }
1082 }'''); 1083 }''');
1083 LibraryElement library = resolve2(source); 1084 LibraryElement library = resolve2(source);
1084 assertNoErrors(source); 1085 assertNoErrors(source);
1085 verify([source]); 1086 verify([source]);
1086 CompilationUnit unit = resolveCompilationUnit(source, library); 1087 CompilationUnit unit = resolveCompilationUnit(source, library);
1087 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration; 1088 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
1088 InterfaceType typeA = classA.element.type; 1089 InterfaceType typeA = elementForClassDeclaration(classA).type;
1089 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration; 1090 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
1090 BlockFunctionBody body = 1091 BlockFunctionBody body =
1091 function.functionExpression.body as BlockFunctionBody; 1092 function.functionExpression.body as BlockFunctionBody;
1092 IfStatement ifStatement = body.block.statements[0] as IfStatement; 1093 IfStatement ifStatement = body.block.statements[0] as IfStatement;
1093 ReturnStatement statement = 1094 ReturnStatement statement =
1094 (ifStatement.thenStatement as Block).statements[0] as ReturnStatement; 1095 (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
1095 SimpleIdentifier variableName = statement.expression as SimpleIdentifier; 1096 SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
1096 expect(variableName.propagatedType, same(typeA)); 1097 expect(variableName.propagatedType, same(typeA));
1097 } 1098 }
1098 1099
1099 void test_assert() { 1100 void test_assert() {
1100 Source source = addSource(r''' 1101 Source source = addSource(r'''
1101 class A {} 1102 class A {}
1102 A f(var p) { 1103 A f(var p) {
1103 assert (p is A); 1104 assert (p is A);
1104 return p; 1105 return p;
1105 }'''); 1106 }''');
1106 LibraryElement library = resolve2(source); 1107 LibraryElement library = resolve2(source);
1107 assertNoErrors(source); 1108 assertNoErrors(source);
1108 verify([source]); 1109 verify([source]);
1109 CompilationUnit unit = resolveCompilationUnit(source, library); 1110 CompilationUnit unit = resolveCompilationUnit(source, library);
1110 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration; 1111 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
1111 InterfaceType typeA = classA.element.type; 1112 InterfaceType typeA = elementForClassDeclaration(classA).type;
1112 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration; 1113 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
1113 BlockFunctionBody body = 1114 BlockFunctionBody body =
1114 function.functionExpression.body as BlockFunctionBody; 1115 function.functionExpression.body as BlockFunctionBody;
1115 ReturnStatement statement = body.block.statements[1] as ReturnStatement; 1116 ReturnStatement statement = body.block.statements[1] as ReturnStatement;
1116 SimpleIdentifier variableName = statement.expression as SimpleIdentifier; 1117 SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
1117 expect(variableName.propagatedType, same(typeA)); 1118 expect(variableName.propagatedType, same(typeA));
1118 } 1119 }
1119 1120
1120 void test_assignment() { 1121 void test_assignment() {
1121 Source source = addSource(r''' 1122 Source source = addSource(r'''
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1196 main(CanvasElement canvas) { 1197 main(CanvasElement canvas) {
1197 var context = canvas.getContext('2d'); 1198 var context = canvas.getContext('2d');
1198 }'''; 1199 }''';
1199 Source source = addSource(code); 1200 Source source = addSource(code);
1200 LibraryElement library = resolve2(source); 1201 LibraryElement library = resolve2(source);
1201 assertNoErrors(source); 1202 assertNoErrors(source);
1202 verify([source]); 1203 verify([source]);
1203 CompilationUnit unit = resolveCompilationUnit(source, library); 1204 CompilationUnit unit = resolveCompilationUnit(source, library);
1204 SimpleIdentifier identifier = EngineTestCase.findNode( 1205 SimpleIdentifier identifier = EngineTestCase.findNode(
1205 unit, code, "context", (node) => node is SimpleIdentifier); 1206 unit, code, "context", (node) => node is SimpleIdentifier);
1206 expect(identifier.propagatedType.name, "CanvasRenderingContext2D"); 1207 expect(propagatedTypeForExpression(identifier).name, "CanvasRenderingContext 2D");
1207 } 1208 }
1208 1209
1209 void test_forEach() { 1210 void test_forEach() {
1210 String code = r''' 1211 String code = r'''
1211 main() { 1212 main() {
1212 var list = <String> []; 1213 var list = <String> [];
1213 for (var e in list) { 1214 for (var e in list) {
1214 e; 1215 e;
1215 } 1216 }
1216 }'''; 1217 }''';
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
1649 Source source = addSource(r''' 1650 Source source = addSource(r'''
1650 class A {} 1651 class A {}
1651 A f(var p) { 1652 A f(var p) {
1652 return (p is A) ? p : null; 1653 return (p is A) ? p : null;
1653 }'''); 1654 }''');
1654 LibraryElement library = resolve2(source); 1655 LibraryElement library = resolve2(source);
1655 assertNoErrors(source); 1656 assertNoErrors(source);
1656 verify([source]); 1657 verify([source]);
1657 CompilationUnit unit = resolveCompilationUnit(source, library); 1658 CompilationUnit unit = resolveCompilationUnit(source, library);
1658 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration; 1659 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
1659 InterfaceType typeA = classA.element.type; 1660 InterfaceType typeA = elementForClassDeclaration(classA).type;
1660 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration; 1661 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
1661 BlockFunctionBody body = 1662 BlockFunctionBody body =
1662 function.functionExpression.body as BlockFunctionBody; 1663 function.functionExpression.body as BlockFunctionBody;
1663 ReturnStatement statement = body.block.statements[0] as ReturnStatement; 1664 ReturnStatement statement = body.block.statements[0] as ReturnStatement;
1664 ConditionalExpression conditional = 1665 ConditionalExpression conditional =
1665 statement.expression as ConditionalExpression; 1666 statement.expression as ConditionalExpression;
1666 SimpleIdentifier variableName = 1667 SimpleIdentifier variableName =
1667 conditional.thenExpression as SimpleIdentifier; 1668 conditional.thenExpression as SimpleIdentifier;
1668 expect(variableName.propagatedType, same(typeA)); 1669 expect(variableName.propagatedType, same(typeA));
1669 } 1670 }
1670 1671
1671 void test_is_if() { 1672 void test_is_if() {
1672 Source source = addSource(r''' 1673 Source source = addSource(r'''
1673 class A {} 1674 class A {}
1674 A f(var p) { 1675 A f(var p) {
1675 if (p is A) { 1676 if (p is A) {
1676 return p; 1677 return p;
1677 } else { 1678 } else {
1678 return null; 1679 return null;
1679 } 1680 }
1680 }'''); 1681 }''');
1681 LibraryElement library = resolve2(source); 1682 LibraryElement library = resolve2(source);
1682 assertNoErrors(source); 1683 assertNoErrors(source);
1683 verify([source]); 1684 verify([source]);
1684 CompilationUnit unit = resolveCompilationUnit(source, library); 1685 CompilationUnit unit = resolveCompilationUnit(source, library);
1685 // prepare A 1686 // prepare A
1686 InterfaceType typeA; 1687 InterfaceType typeA;
1687 { 1688 {
1688 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration; 1689 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
1689 typeA = classA.element.type; 1690 typeA = elementForClassDeclaration(classA).type;
1690 } 1691 }
1691 // verify "f" 1692 // verify "f"
1692 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration; 1693 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
1693 BlockFunctionBody body = 1694 BlockFunctionBody body =
1694 function.functionExpression.body as BlockFunctionBody; 1695 function.functionExpression.body as BlockFunctionBody;
1695 IfStatement ifStatement = body.block.statements[0] as IfStatement; 1696 IfStatement ifStatement = body.block.statements[0] as IfStatement;
1696 // "p is A" 1697 // "p is A"
1697 { 1698 {
1698 IsExpression isExpression = ifStatement.condition; 1699 IsExpression isExpression = ifStatement.condition;
1699 SimpleIdentifier variableName = isExpression.expression; 1700 SimpleIdentifier variableName = isExpression.expression;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1742 return p; 1743 return p;
1743 } else { 1744 } else {
1744 return null; 1745 return null;
1745 } 1746 }
1746 }'''); 1747 }''');
1747 LibraryElement library = resolve2(source); 1748 LibraryElement library = resolve2(source);
1748 assertNoErrors(source); 1749 assertNoErrors(source);
1749 verify([source]); 1750 verify([source]);
1750 CompilationUnit unit = resolveCompilationUnit(source, library); 1751 CompilationUnit unit = resolveCompilationUnit(source, library);
1751 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration; 1752 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
1752 InterfaceType typeA = classA.element.type; 1753 InterfaceType typeA = elementForClassDeclaration(classA).type;
1753 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration; 1754 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
1754 BlockFunctionBody body = 1755 BlockFunctionBody body =
1755 function.functionExpression.body as BlockFunctionBody; 1756 function.functionExpression.body as BlockFunctionBody;
1756 IfStatement ifStatement = body.block.statements[0] as IfStatement; 1757 IfStatement ifStatement = body.block.statements[0] as IfStatement;
1757 ReturnStatement statement = 1758 ReturnStatement statement =
1758 (ifStatement.thenStatement as Block).statements[0] as ReturnStatement; 1759 (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
1759 SimpleIdentifier variableName = statement.expression as SimpleIdentifier; 1760 SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
1760 expect(variableName.propagatedType, same(typeA)); 1761 expect(variableName.propagatedType, same(typeA));
1761 } 1762 }
1762 1763
1763 void test_is_postConditional() { 1764 void test_is_postConditional() {
1764 Source source = addSource(r''' 1765 Source source = addSource(r'''
1765 class A {} 1766 class A {}
1766 A f(var p) { 1767 A f(var p) {
1767 A a = (p is A) ? p : throw null; 1768 A a = (p is A) ? p : throw null;
1768 return p; 1769 return p;
1769 }'''); 1770 }''');
1770 LibraryElement library = resolve2(source); 1771 LibraryElement library = resolve2(source);
1771 assertNoErrors(source); 1772 assertNoErrors(source);
1772 verify([source]); 1773 verify([source]);
1773 CompilationUnit unit = resolveCompilationUnit(source, library); 1774 CompilationUnit unit = resolveCompilationUnit(source, library);
1774 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration; 1775 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
1775 InterfaceType typeA = classA.element.type; 1776 InterfaceType typeA = elementForClassDeclaration(classA).type;
1776 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration; 1777 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
1777 BlockFunctionBody body = 1778 BlockFunctionBody body =
1778 function.functionExpression.body as BlockFunctionBody; 1779 function.functionExpression.body as BlockFunctionBody;
1779 ReturnStatement statement = body.block.statements[1] as ReturnStatement; 1780 ReturnStatement statement = body.block.statements[1] as ReturnStatement;
1780 SimpleIdentifier variableName = statement.expression as SimpleIdentifier; 1781 SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
1781 expect(variableName.propagatedType, same(typeA)); 1782 expect(variableName.propagatedType, same(typeA));
1782 } 1783 }
1783 1784
1784 void test_is_postIf() { 1785 void test_is_postIf() {
1785 Source source = addSource(r''' 1786 Source source = addSource(r'''
1786 class A {} 1787 class A {}
1787 A f(var p) { 1788 A f(var p) {
1788 if (p is A) { 1789 if (p is A) {
1789 A a = p; 1790 A a = p;
1790 } else { 1791 } else {
1791 return null; 1792 return null;
1792 } 1793 }
1793 return p; 1794 return p;
1794 }'''); 1795 }''');
1795 LibraryElement library = resolve2(source); 1796 LibraryElement library = resolve2(source);
1796 assertNoErrors(source); 1797 assertNoErrors(source);
1797 verify([source]); 1798 verify([source]);
1798 CompilationUnit unit = resolveCompilationUnit(source, library); 1799 CompilationUnit unit = resolveCompilationUnit(source, library);
1799 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration; 1800 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
1800 InterfaceType typeA = classA.element.type; 1801 InterfaceType typeA = elementForClassDeclaration(classA).type;
1801 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration; 1802 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
1802 BlockFunctionBody body = 1803 BlockFunctionBody body =
1803 function.functionExpression.body as BlockFunctionBody; 1804 function.functionExpression.body as BlockFunctionBody;
1804 ReturnStatement statement = body.block.statements[1] as ReturnStatement; 1805 ReturnStatement statement = body.block.statements[1] as ReturnStatement;
1805 SimpleIdentifier variableName = statement.expression as SimpleIdentifier; 1806 SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
1806 expect(variableName.propagatedType, same(typeA)); 1807 expect(variableName.propagatedType, same(typeA));
1807 } 1808 }
1808 1809
1809 void test_is_subclass() { 1810 void test_is_subclass() {
1810 Source source = addSource(r''' 1811 Source source = addSource(r'''
(...skipping 28 matching lines...) Expand all
1839 while (p is A) { 1840 while (p is A) {
1840 return p; 1841 return p;
1841 } 1842 }
1842 return p; 1843 return p;
1843 }'''); 1844 }''');
1844 LibraryElement library = resolve2(source); 1845 LibraryElement library = resolve2(source);
1845 assertNoErrors(source); 1846 assertNoErrors(source);
1846 verify([source]); 1847 verify([source]);
1847 CompilationUnit unit = resolveCompilationUnit(source, library); 1848 CompilationUnit unit = resolveCompilationUnit(source, library);
1848 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration; 1849 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
1849 InterfaceType typeA = classA.element.type; 1850 InterfaceType typeA = elementForClassDeclaration(classA).type;
1850 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration; 1851 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
1851 BlockFunctionBody body = 1852 BlockFunctionBody body =
1852 function.functionExpression.body as BlockFunctionBody; 1853 function.functionExpression.body as BlockFunctionBody;
1853 WhileStatement whileStatement = body.block.statements[0] as WhileStatement; 1854 WhileStatement whileStatement = body.block.statements[0] as WhileStatement;
1854 ReturnStatement statement = 1855 ReturnStatement statement =
1855 (whileStatement.body as Block).statements[0] as ReturnStatement; 1856 (whileStatement.body as Block).statements[0] as ReturnStatement;
1856 SimpleIdentifier variableName = statement.expression as SimpleIdentifier; 1857 SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
1857 expect(variableName.propagatedType, same(typeA)); 1858 expect(variableName.propagatedType, same(typeA));
1858 } 1859 }
1859 1860
1860 void test_isNot_conditional() { 1861 void test_isNot_conditional() {
1861 Source source = addSource(r''' 1862 Source source = addSource(r'''
1862 class A {} 1863 class A {}
1863 A f(var p) { 1864 A f(var p) {
1864 return (p is! A) ? null : p; 1865 return (p is! A) ? null : p;
1865 }'''); 1866 }''');
1866 LibraryElement library = resolve2(source); 1867 LibraryElement library = resolve2(source);
1867 assertNoErrors(source); 1868 assertNoErrors(source);
1868 verify([source]); 1869 verify([source]);
1869 CompilationUnit unit = resolveCompilationUnit(source, library); 1870 CompilationUnit unit = resolveCompilationUnit(source, library);
1870 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration; 1871 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
1871 InterfaceType typeA = classA.element.type; 1872 InterfaceType typeA = elementForClassDeclaration(classA).type;
1872 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration; 1873 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
1873 BlockFunctionBody body = 1874 BlockFunctionBody body =
1874 function.functionExpression.body as BlockFunctionBody; 1875 function.functionExpression.body as BlockFunctionBody;
1875 ReturnStatement statement = body.block.statements[0] as ReturnStatement; 1876 ReturnStatement statement = body.block.statements[0] as ReturnStatement;
1876 ConditionalExpression conditional = 1877 ConditionalExpression conditional =
1877 statement.expression as ConditionalExpression; 1878 statement.expression as ConditionalExpression;
1878 SimpleIdentifier variableName = 1879 SimpleIdentifier variableName =
1879 conditional.elseExpression as SimpleIdentifier; 1880 conditional.elseExpression as SimpleIdentifier;
1880 expect(variableName.propagatedType, same(typeA)); 1881 expect(variableName.propagatedType, same(typeA));
1881 } 1882 }
1882 1883
1883 void test_isNot_if() { 1884 void test_isNot_if() {
1884 Source source = addSource(r''' 1885 Source source = addSource(r'''
1885 class A {} 1886 class A {}
1886 A f(var p) { 1887 A f(var p) {
1887 if (p is! A) { 1888 if (p is! A) {
1888 return null; 1889 return null;
1889 } else { 1890 } else {
1890 return p; 1891 return p;
1891 } 1892 }
1892 }'''); 1893 }''');
1893 LibraryElement library = resolve2(source); 1894 LibraryElement library = resolve2(source);
1894 assertNoErrors(source); 1895 assertNoErrors(source);
1895 verify([source]); 1896 verify([source]);
1896 CompilationUnit unit = resolveCompilationUnit(source, library); 1897 CompilationUnit unit = resolveCompilationUnit(source, library);
1897 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration; 1898 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
1898 InterfaceType typeA = classA.element.type; 1899 InterfaceType typeA = elementForClassDeclaration(classA).type;
1899 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration; 1900 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
1900 BlockFunctionBody body = 1901 BlockFunctionBody body =
1901 function.functionExpression.body as BlockFunctionBody; 1902 function.functionExpression.body as BlockFunctionBody;
1902 IfStatement ifStatement = body.block.statements[0] as IfStatement; 1903 IfStatement ifStatement = body.block.statements[0] as IfStatement;
1903 ReturnStatement statement = 1904 ReturnStatement statement =
1904 (ifStatement.elseStatement as Block).statements[0] as ReturnStatement; 1905 (ifStatement.elseStatement as Block).statements[0] as ReturnStatement;
1905 SimpleIdentifier variableName = statement.expression as SimpleIdentifier; 1906 SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
1906 expect(variableName.propagatedType, same(typeA)); 1907 expect(variableName.propagatedType, same(typeA));
1907 } 1908 }
1908 1909
1909 void test_isNot_if_logicalOr() { 1910 void test_isNot_if_logicalOr() {
1910 Source source = addSource(r''' 1911 Source source = addSource(r'''
1911 class A {} 1912 class A {}
1912 A f(var p) { 1913 A f(var p) {
1913 if (p is! A || null == p) { 1914 if (p is! A || null == p) {
1914 return null; 1915 return null;
1915 } else { 1916 } else {
1916 return p; 1917 return p;
1917 } 1918 }
1918 }'''); 1919 }''');
1919 LibraryElement library = resolve2(source); 1920 LibraryElement library = resolve2(source);
1920 assertNoErrors(source); 1921 assertNoErrors(source);
1921 CompilationUnit unit = resolveCompilationUnit(source, library); 1922 CompilationUnit unit = resolveCompilationUnit(source, library);
1922 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration; 1923 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
1923 InterfaceType typeA = classA.element.type; 1924 InterfaceType typeA = elementForClassDeclaration(classA).type;
1924 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration; 1925 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
1925 BlockFunctionBody body = 1926 BlockFunctionBody body =
1926 function.functionExpression.body as BlockFunctionBody; 1927 function.functionExpression.body as BlockFunctionBody;
1927 IfStatement ifStatement = body.block.statements[0] as IfStatement; 1928 IfStatement ifStatement = body.block.statements[0] as IfStatement;
1928 ReturnStatement statement = 1929 ReturnStatement statement =
1929 (ifStatement.elseStatement as Block).statements[0] as ReturnStatement; 1930 (ifStatement.elseStatement as Block).statements[0] as ReturnStatement;
1930 SimpleIdentifier variableName = statement.expression as SimpleIdentifier; 1931 SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
1931 expect(variableName.propagatedType, same(typeA)); 1932 expect(variableName.propagatedType, same(typeA));
1932 } 1933 }
1933 1934
1934 void test_isNot_postConditional() { 1935 void test_isNot_postConditional() {
1935 Source source = addSource(r''' 1936 Source source = addSource(r'''
1936 class A {} 1937 class A {}
1937 A f(var p) { 1938 A f(var p) {
1938 A a = (p is! A) ? throw null : p; 1939 A a = (p is! A) ? throw null : p;
1939 return p; 1940 return p;
1940 }'''); 1941 }''');
1941 LibraryElement library = resolve2(source); 1942 LibraryElement library = resolve2(source);
1942 assertNoErrors(source); 1943 assertNoErrors(source);
1943 verify([source]); 1944 verify([source]);
1944 CompilationUnit unit = resolveCompilationUnit(source, library); 1945 CompilationUnit unit = resolveCompilationUnit(source, library);
1945 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration; 1946 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
1946 InterfaceType typeA = classA.element.type; 1947 InterfaceType typeA = elementForClassDeclaration(classA).type;
1947 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration; 1948 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
1948 BlockFunctionBody body = 1949 BlockFunctionBody body =
1949 function.functionExpression.body as BlockFunctionBody; 1950 function.functionExpression.body as BlockFunctionBody;
1950 ReturnStatement statement = body.block.statements[1] as ReturnStatement; 1951 ReturnStatement statement = body.block.statements[1] as ReturnStatement;
1951 SimpleIdentifier variableName = statement.expression as SimpleIdentifier; 1952 SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
1952 expect(variableName.propagatedType, same(typeA)); 1953 expect(variableName.propagatedType, same(typeA));
1953 } 1954 }
1954 1955
1955 void test_isNot_postIf() { 1956 void test_isNot_postIf() {
1956 Source source = addSource(r''' 1957 Source source = addSource(r'''
1957 class A {} 1958 class A {}
1958 A f(var p) { 1959 A f(var p) {
1959 if (p is! A) { 1960 if (p is! A) {
1960 return null; 1961 return null;
1961 } 1962 }
1962 return p; 1963 return p;
1963 }'''); 1964 }''');
1964 LibraryElement library = resolve2(source); 1965 LibraryElement library = resolve2(source);
1965 assertNoErrors(source); 1966 assertNoErrors(source);
1966 verify([source]); 1967 verify([source]);
1967 CompilationUnit unit = resolveCompilationUnit(source, library); 1968 CompilationUnit unit = resolveCompilationUnit(source, library);
1968 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration; 1969 ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
1969 InterfaceType typeA = classA.element.type; 1970 InterfaceType typeA = elementForClassDeclaration(classA).type;
1970 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration; 1971 FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
1971 BlockFunctionBody body = 1972 BlockFunctionBody body =
1972 function.functionExpression.body as BlockFunctionBody; 1973 function.functionExpression.body as BlockFunctionBody;
1973 ReturnStatement statement = body.block.statements[1] as ReturnStatement; 1974 ReturnStatement statement = body.block.statements[1] as ReturnStatement;
1974 SimpleIdentifier variableName = statement.expression as SimpleIdentifier; 1975 SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
1975 expect(variableName.propagatedType, same(typeA)); 1976 expect(variableName.propagatedType, same(typeA));
1976 } 1977 }
1977 1978
1978 void test_issue20904BuggyTypePromotionAtIfJoin_5() { 1979 void test_issue20904BuggyTypePromotionAtIfJoin_5() {
1979 // https://code.google.com/p/dart/issues/detail?id=20904 1980 // https://code.google.com/p/dart/issues/detail?id=20904
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after
2409 }'''); 2410 }''');
2410 LibraryElement library = resolve2(source); 2411 LibraryElement library = resolve2(source);
2411 assertNoErrors(source); 2412 assertNoErrors(source);
2412 verify([source]); 2413 verify([source]);
2413 CompilationUnit unit = resolveCompilationUnit(source, library); 2414 CompilationUnit unit = resolveCompilationUnit(source, library);
2414 FunctionDeclaration main = unit.declarations[0] as FunctionDeclaration; 2415 FunctionDeclaration main = unit.declarations[0] as FunctionDeclaration;
2415 BlockFunctionBody body = main.functionExpression.body as BlockFunctionBody; 2416 BlockFunctionBody body = main.functionExpression.body as BlockFunctionBody;
2416 ReturnStatement statement = body.block.statements[11] as ReturnStatement; 2417 ReturnStatement statement = body.block.statements[11] as ReturnStatement;
2417 NodeList<Expression> elements = 2418 NodeList<Expression> elements =
2418 (statement.expression as ListLiteral).elements; 2419 (statement.expression as ListLiteral).elements;
2419 expect(elements[0].propagatedType.name, "AnchorElement"); 2420 expect(propagatedTypeForExpression(elements[0]).name, "AnchorElement");
2420 expect(elements[1].propagatedType.name, "AnchorElement"); 2421 expect(propagatedTypeForExpression(elements[1]).name, "AnchorElement");
2421 expect(elements[2].propagatedType.name, "BodyElement"); 2422 expect(propagatedTypeForExpression(elements[2]).name, "BodyElement");
2422 expect(elements[3].propagatedType.name, "ButtonElement"); 2423 expect(propagatedTypeForExpression(elements[3]).name, "ButtonElement");
2423 expect(elements[4].propagatedType.name, "DivElement"); 2424 expect(propagatedTypeForExpression(elements[4]).name, "DivElement");
2424 expect(elements[5].propagatedType.name, "InputElement"); 2425 expect(propagatedTypeForExpression(elements[5]).name, "InputElement");
2425 expect(elements[6].propagatedType.name, "SelectElement"); 2426 expect(propagatedTypeForExpression(elements[6]).name, "SelectElement");
2426 expect(elements[7].propagatedType.name, "DivElement"); 2427 expect(propagatedTypeForExpression(elements[7]).name, "DivElement");
2427 expect(elements[8].propagatedType.name, "Element"); 2428 expect(propagatedTypeForExpression(elements[8]).name, "Element");
2428 expect(elements[9].propagatedType.name, "Element"); 2429 expect(propagatedTypeForExpression(elements[9]).name, "Element");
2429 expect(elements[10].propagatedType.name, "Element"); 2430 expect(propagatedTypeForExpression(elements[10]).name, "Element");
2430 } 2431 }
2431 } 2432 }
2432 2433
2433 @reflectiveTest 2434 @reflectiveTest
2434 class TypeProviderImplTest extends EngineTestCase { 2435 class TypeProviderImplTest extends EngineTestCase {
2435 void test_creation() { 2436 void test_creation() {
2436 // 2437 //
2437 // Create a mock library element with the types expected to be in dart:core. 2438 // Create a mock library element with the types expected to be in dart:core.
2438 // We cannot use either ElementFactory or TestTypeProvider (which uses 2439 // We cannot use either ElementFactory or TestTypeProvider (which uses
2439 // ElementFactory) because we side-effect the elements in ways that would 2440 // ElementFactory) because we side-effect the elements in ways that would
(...skipping 1194 matching lines...) Expand 10 before | Expand all | Expand 10 after
3634 */ 3635 */
3635 class _StaleElement extends ElementImpl { 3636 class _StaleElement extends ElementImpl {
3636 _StaleElement() : super("_StaleElement", -1); 3637 _StaleElement() : super("_StaleElement", -1);
3637 3638
3638 @override 3639 @override
3639 get kind => throw "_StaleElement's kind shouldn't be accessed"; 3640 get kind => throw "_StaleElement's kind shouldn't be accessed";
3640 3641
3641 @override 3642 @override
3642 accept(_) => throw "_StaleElement shouldn't be visited"; 3643 accept(_) => throw "_StaleElement shouldn't be visited";
3643 } 3644 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698