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);
9191/// TODO(scheglov) Clean up the list of implicitly analyzed files.
9292class AnalysisDriver implements AnalysisDriverGeneric {
9393 /// 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 ;
9595
9696 /// The length of the list returned by [_computeDeclaredVariablesSignature] .
9797 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';
66import 'package:analyzer/dart/ast/token.dart' ;
77import 'package:analyzer/dart/ast/visitor.dart' ;
88import 'package:analyzer/dart/element/element.dart' ;
9+ import 'package:analyzer/src/dart/element/type.dart' ;
910
1011/// Instances of the class `ExitDetector` determine whether the visited AST node
1112/// is guaranteed to terminate by executing a `return` statement, `throw`
@@ -423,7 +424,7 @@ class ExitDetector extends GeneralizingAstVisitor<bool> {
423424 }
424425 }
425426 Element element = node.methodName.staticElement;
426- if (element != null && element.hasAlwaysThrows ) {
427+ if (_elementExits ( element) ) {
427428 return true ;
428429 }
429430 return _nodeExits (node.argumentList);
@@ -660,4 +661,14 @@ class ExitDetector extends GeneralizingAstVisitor<bool> {
660661 static bool exits (AstNode node) {
661662 return ExitDetector ()._nodeExits (node);
662663 }
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+ }
663674}
Original file line number Diff line number Diff line change @@ -7,10 +7,12 @@ import 'package:analyzer/src/test_utilities/package_mixin.dart';
77import 'package:test_reflective_loader/test_reflective_loader.dart' ;
88
99import '../dart/resolution/driver_resolution.dart' ;
10+ import '../dart/resolution/with_null_safety_mixin.dart' ;
1011
1112main () {
1213 defineReflectiveSuite (() {
1314 defineReflectiveTests (MissingReturnTest );
15+ defineReflectiveTests (MissingReturnWithNullSafetyTest );
1416 });
1517}
1618
@@ -213,3 +215,23 @@ class B extends A {
213215 ]);
214216 }
215217}
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