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

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

Issue 2008363002: Add label support to ExitDetector (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Re-short circuit, plus test Created 4 years, 6 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
« no previous file with comments | « pkg/analyzer/lib/src/generated/resolver.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.all_the_rest_test; 5 library analyzer.test.generated.all_the_rest_test;
6 6
7 import 'package:analyzer/dart/ast/ast.dart'; 7 import 'package:analyzer/dart/ast/ast.dart';
8 import 'package:analyzer/dart/ast/token.dart'; 8 import 'package:analyzer/dart/ast/token.dart';
9 import 'package:analyzer/dart/element/element.dart'; 9 import 'package:analyzer/dart/element/element.dart';
10 import 'package:analyzer/dart/element/type.dart'; 10 import 'package:analyzer/dart/element/type.dart';
(...skipping 3838 matching lines...) Expand 10 before | Expand all | Expand 10 after
3849 } 3849 }
3850 } 3850 }
3851 3851
3852 /** 3852 /**
3853 * Tests for the [ExitDetector] that require that the AST be resolved. 3853 * Tests for the [ExitDetector] that require that the AST be resolved.
3854 * 3854 *
3855 * See [ExitDetectorTest] for tests that do not require the AST to be resolved. 3855 * See [ExitDetectorTest] for tests that do not require the AST to be resolved.
3856 */ 3856 */
3857 @reflectiveTest 3857 @reflectiveTest
3858 class ExitDetectorTest2 extends ResolverTestCase { 3858 class ExitDetectorTest2 extends ResolverTestCase {
3859 void test_forStatement_implicitTrue_breakWithLabel() {
3860 Source source = addSource(r'''
3861 void f() {
3862 x: for (;;) {
3863 if (1 < 2) {
3864 break x;
3865 }
3866 return;
3867 }
3868 }
3869 ''');
3870 _assertNthStatementDoesNotExit(source, 0);
3871 }
3872
3859 void test_switch_withEnum_false_noDefault() { 3873 void test_switch_withEnum_false_noDefault() {
3860 Source source = addSource(r''' 3874 Source source = addSource(r'''
3861 enum E { A, B } 3875 enum E { A, B }
3862 String f(E e) { 3876 String f(E e) {
3863 var x; 3877 var x;
3864 switch (e) { 3878 switch (e) {
3865 case A: 3879 case A:
3866 x = 'A'; 3880 x = 'A';
3867 case B: 3881 case B:
3868 x = 'B'; 3882 x = 'B';
3869 } 3883 }
3870 return x; 3884 return x;
3871 } 3885 }
3872 '''); 3886 ''');
3873 LibraryElement element = resolve2(source); 3887 _assertNthStatementDoesNotExit(source, 1);
3874 CompilationUnit unit = resolveCompilationUnit(source, element);
3875 FunctionDeclaration function = unit.declarations.last;
3876 BlockFunctionBody body = function.functionExpression.body;
3877 Statement statement = body.block.statements[1];
3878 expect(ExitDetector.exits(statement), false);
3879 } 3888 }
3880 3889
3881 void test_switch_withEnum_false_withDefault() { 3890 void test_switch_withEnum_false_withDefault() {
3882 Source source = addSource(r''' 3891 Source source = addSource(r'''
3883 enum E { A, B } 3892 enum E { A, B }
3884 String f(E e) { 3893 String f(E e) {
3885 var x; 3894 var x;
3886 switch (e) { 3895 switch (e) {
3887 case A: 3896 case A:
3888 x = 'A'; 3897 x = 'A';
3889 default: 3898 default:
3890 x = '?'; 3899 x = '?';
3891 } 3900 }
3892 return x; 3901 return x;
3893 } 3902 }
3894 '''); 3903 ''');
3895 LibraryElement element = resolve2(source); 3904 _assertNthStatementDoesNotExit(source, 1);
3896 CompilationUnit unit = resolveCompilationUnit(source, element);
3897 FunctionDeclaration function = unit.declarations.last;
3898 BlockFunctionBody body = function.functionExpression.body;
3899 Statement statement = body.block.statements[1];
3900 expect(ExitDetector.exits(statement), false);
3901 } 3905 }
3902 3906
3903 void test_switch_withEnum_true_noDefault() { 3907 void test_switch_withEnum_true_noDefault() {
3904 Source source = addSource(r''' 3908 Source source = addSource(r'''
3905 enum E { A, B } 3909 enum E { A, B }
3906 String f(E e) { 3910 String f(E e) {
3907 switch (e) { 3911 switch (e) {
3908 case A: 3912 case A:
3909 return 'A'; 3913 return 'A';
3910 case B: 3914 case B:
3911 return 'B'; 3915 return 'B';
3912 } 3916 }
3913 } 3917 }
3914 '''); 3918 ''');
3915 LibraryElement element = resolve2(source); 3919 _assertNthStatementExits(source, 0);
3916 CompilationUnit unit = resolveCompilationUnit(source, element);
3917 FunctionDeclaration function = unit.declarations.last;
3918 BlockFunctionBody body = function.functionExpression.body;
3919 Statement statement = body.block.statements[0];
3920 expect(ExitDetector.exits(statement), true);
3921 } 3920 }
3922 3921
3923 void test_switch_withEnum_true_withDefault() { 3922 void test_switch_withEnum_true_withDefault() {
3924 Source source = addSource(r''' 3923 Source source = addSource(r'''
3925 enum E { A, B } 3924 enum E { A, B }
3926 String f(E e) { 3925 String f(E e) {
3927 switch (e) { 3926 switch (e) {
3928 case A: 3927 case A:
3929 return 'A'; 3928 return 'A';
3930 default: 3929 default:
3931 return '?'; 3930 return '?';
3932 } 3931 }
3933 } 3932 }
3934 '''); 3933 ''');
3934 _assertNthStatementExits(source, 0);
3935 }
3936
3937 void test_whileStatement_breakWithLabel() {
3938 Source source = addSource(r'''
3939 void f() {
3940 x: while (true) {
3941 if (1 < 2) {
3942 break x;
3943 }
3944 return;
3945 }
3946 }
3947 ''');
3948 _assertNthStatementDoesNotExit(source, 0);
3949 }
3950
3951 void test_whileStatement_breakWithLabel_afterExting() {
3952 Source source = addSource(r'''
3953 void f() {
3954 x: while (true) {
3955 return;
3956 if (1 < 2) {
3957 break x;
3958 }
3959 }
3960 }
3961 ''');
3962 _assertNthStatementExits(source, 0);
3963 }
3964
3965 void _assertHasReturn(bool expectedResult, String source, int n) {
3935 LibraryElement element = resolve2(source); 3966 LibraryElement element = resolve2(source);
3936 CompilationUnit unit = resolveCompilationUnit(source, element); 3967 CompilationUnit unit = resolveCompilationUnit(source, element);
3937 FunctionDeclaration function = unit.declarations.last; 3968 FunctionDeclaration function = unit.declarations.last;
3938 BlockFunctionBody body = function.functionExpression.body; 3969 BlockFunctionBody body = function.functionExpression.body;
3939 Statement statement = body.block.statements[0]; 3970 Statement statement = body.block.statements[n];
3940 expect(ExitDetector.exits(statement), true); 3971 expect(ExitDetector.exits(statement), expectedResult);
3972 }
3973
3974 // Assert that the [n]th statement in the last function declaration of
3975 // [source] exits.
3976 void _assertNthStatementExits(String source, int n) {
3977 _assertHasReturn(true, source, n);
3978 }
3979
3980 // Assert that the [n]th statement in the last function declaration of
3981 // [source] does not exit.
3982 void _assertNthStatementDoesNotExit(String source, int n) {
3983 _assertHasReturn(false, source, n);
3941 } 3984 }
3942 } 3985 }
3943 3986
3944 @reflectiveTest 3987 @reflectiveTest
3945 class FileBasedSourceTest { 3988 class FileBasedSourceTest {
3946 void test_equals_false_differentFiles() { 3989 void test_equals_false_differentFiles() {
3947 JavaFile file1 = FileUtilities2.createFile("/does/not/exist1.dart"); 3990 JavaFile file1 = FileUtilities2.createFile("/does/not/exist1.dart");
3948 JavaFile file2 = FileUtilities2.createFile("/does/not/exist2.dart"); 3991 JavaFile file2 = FileUtilities2.createFile("/does/not/exist2.dart");
3949 FileBasedSource source1 = new FileBasedSource(file1); 3992 FileBasedSource source1 = new FileBasedSource(file1);
3950 FileBasedSource source2 = new FileBasedSource(file2); 3993 FileBasedSource source2 = new FileBasedSource(file2);
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
4312 expect(UriKind.fromEncoding(0x70), same(UriKind.PACKAGE_URI)); 4355 expect(UriKind.fromEncoding(0x70), same(UriKind.PACKAGE_URI));
4313 expect(UriKind.fromEncoding(0x58), same(null)); 4356 expect(UriKind.fromEncoding(0x58), same(null));
4314 } 4357 }
4315 4358
4316 void test_getEncoding() { 4359 void test_getEncoding() {
4317 expect(UriKind.DART_URI.encoding, 0x64); 4360 expect(UriKind.DART_URI.encoding, 0x64);
4318 expect(UriKind.FILE_URI.encoding, 0x66); 4361 expect(UriKind.FILE_URI.encoding, 0x66);
4319 expect(UriKind.PACKAGE_URI.encoding, 0x70); 4362 expect(UriKind.PACKAGE_URI.encoding, 0x70);
4320 } 4363 }
4321 } 4364 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/generated/resolver.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698