File tree Expand file tree Collapse file tree 3 files changed +35
-2
lines changed Expand file tree Collapse file tree 3 files changed +35
-2
lines changed Original file line number Diff line number Diff line change @@ -91,7 +91,7 @@ typedef WorkToWaitAfterComputingResult = Future<void> Function(String path);
91
91
/// TODO(scheglov) Clean up the list of implicitly analyzed files.
92
92
class AnalysisDriver implements AnalysisDriverGeneric {
93
93
/// The version of data format, should be incremented on every format change.
94
- static const int DATA_VERSION = 106 ;
94
+ static const int DATA_VERSION = 107 ;
95
95
96
96
/// The length of the list returned by [_computeDeclaredVariablesSignature] .
97
97
static const int _declaredVariablesSignatureLength = 4 ;
Original file line number Diff line number Diff line change @@ -6,6 +6,7 @@ import 'package:analyzer/dart/ast/ast.dart';
6
6
import 'package:analyzer/dart/ast/token.dart' ;
7
7
import 'package:analyzer/dart/ast/visitor.dart' ;
8
8
import 'package:analyzer/dart/element/element.dart' ;
9
+ import 'package:analyzer/src/dart/element/type.dart' ;
9
10
10
11
/// Instances of the class `ExitDetector` determine whether the visited AST node
11
12
/// is guaranteed to terminate by executing a `return` statement, `throw`
@@ -423,7 +424,7 @@ class ExitDetector extends GeneralizingAstVisitor<bool> {
423
424
}
424
425
}
425
426
Element element = node.methodName.staticElement;
426
- if (element != null && element.hasAlwaysThrows ) {
427
+ if (_elementExits ( element) ) {
427
428
return true ;
428
429
}
429
430
return _nodeExits (node.argumentList);
@@ -660,4 +661,14 @@ class ExitDetector extends GeneralizingAstVisitor<bool> {
660
661
static bool exits (AstNode node) {
661
662
return ExitDetector ()._nodeExits (node);
662
663
}
664
+
665
+ static bool _elementExits (Element element) {
666
+ if (element is ExecutableElement ) {
667
+ var declaration = element.declaration;
668
+ return declaration.hasAlwaysThrows ||
669
+ identical (declaration.returnType, NeverTypeImpl .instance);
670
+ }
671
+
672
+ return false ;
673
+ }
663
674
}
Original file line number Diff line number Diff line change @@ -7,10 +7,12 @@ import 'package:analyzer/src/test_utilities/package_mixin.dart';
7
7
import 'package:test_reflective_loader/test_reflective_loader.dart' ;
8
8
9
9
import '../dart/resolution/driver_resolution.dart' ;
10
+ import '../dart/resolution/with_null_safety_mixin.dart' ;
10
11
11
12
main () {
12
13
defineReflectiveSuite (() {
13
14
defineReflectiveTests (MissingReturnTest );
15
+ defineReflectiveTests (MissingReturnWithNullSafetyTest );
14
16
});
15
17
}
16
18
@@ -213,3 +215,23 @@ class B extends A {
213
215
]);
214
216
}
215
217
}
218
+
219
+ @reflectiveTest
220
+ class MissingReturnWithNullSafetyTest extends DriverResolutionTest
221
+ with WithNullSafetyMixin {
222
+ test_returnNever () async {
223
+ newFile ('/test/lib/a.dart' , content: r'''
224
+ Never foo() {
225
+ throw 0;
226
+ }
227
+ ''' );
228
+ await assertNoErrorsInCode (r'''
229
+ // @dart = 2.8
230
+ import 'a.dart';
231
+
232
+ int f() {
233
+ foo();
234
+ }
235
+ ''' );
236
+ }
237
+ }
You can’t perform that action at this time.
0 commit comments