File tree 6 files changed +44
-2
lines changed
flow_analysis/reachability
6 files changed +44
-2
lines changed Original file line number Diff line number Diff line change @@ -1045,10 +1045,13 @@ class InferenceVisitor
1045
1045
Expression condition =
1046
1046
inferrer.ensureAssignableResult (expectedType, conditionResult);
1047
1047
node.condition = condition..parent = node;
1048
+ inferrer.flowAnalysis.ifStatement_thenBegin (condition);
1048
1049
inferrer.inferStatement (node.then);
1049
1050
if (node.otherwise != null ) {
1051
+ inferrer.flowAnalysis.ifStatement_elseBegin ();
1050
1052
inferrer.inferStatement (node.otherwise);
1051
1053
}
1054
+ inferrer.flowAnalysis.ifStatement_end (node.otherwise != null );
1052
1055
}
1053
1056
1054
1057
ExpressionInferenceResult visitIntJudgment (
Original file line number Diff line number Diff line change @@ -1452,6 +1452,9 @@ class TypeInferrerImpl implements TypeInferrer {
1452
1452
messageVoidExpression, expression.fileOffset, noLength);
1453
1453
}
1454
1454
}
1455
+ if (result.inferredType is NeverType ) {
1456
+ flowAnalysis.handleExit ();
1457
+ }
1455
1458
return result;
1456
1459
}
1457
1460
Original file line number Diff line number Diff line change @@ -140,6 +140,14 @@ abstract class DataExtractor<T> extends Visitor with DataRegistry<T> {
140
140
return new NodeId (node.fileOffset, IdKind .moveNext);
141
141
}
142
142
143
+ NodeId createExpressionStatementId (ExpressionStatement node) {
144
+ if (node.expression.fileOffset == TreeNode .noOffset) {
145
+ // TODO(johnniwinther): Find out why we something have no offset.
146
+ return null ;
147
+ }
148
+ return new NodeId (node.expression.fileOffset, IdKind .stmt);
149
+ }
150
+
143
151
NodeId createLabeledStatementId (LabeledStatement node) =>
144
152
computeDefaultNodeId (node.body);
145
153
NodeId createLoopId (TreeNode node) => computeDefaultNodeId (node);
@@ -272,6 +280,12 @@ abstract class DataExtractor<T> extends Visitor with DataRegistry<T> {
272
280
super .visitVariableSet (node);
273
281
}
274
282
283
+ @override
284
+ visitExpressionStatement (ExpressionStatement node) {
285
+ computeForNode (node, createExpressionStatementId (node));
286
+ return super .visitExpressionStatement (node);
287
+ }
288
+
275
289
@override
276
290
visitIfStatement (IfStatement node) {
277
291
computeForNode (node, computeDefaultNodeId (node));
Original file line number Diff line number Diff line change @@ -162,14 +162,29 @@ Never topLevelFunction() => throw 'foo';
162
162
class C {
163
163
final dynamic field1;
164
164
final dynamic field2;
165
+
166
+ /*cfe.member: C.method:doesNotComplete*/
165
167
Never method () => throw 'foo' ;
168
+
169
+ /*cfe.member: C.staticMethod:doesNotComplete*/
166
170
static Never staticMethod () => throw 'foo' ;
171
+
167
172
void methodTakingArgument (arg) {}
168
173
void methodTakingNamedArgument ({arg}) {}
174
+
175
+ /*cfe.member: C.getter:doesNotComplete*/
169
176
Never get getter => throw 'foo' ;
177
+
178
+ /*cfe.member: C.staticGetter:doesNotComplete*/
170
179
static Never get staticGetter => throw 'foo' ;
180
+
181
+ /*cfe.member: C.+:doesNotComplete*/
171
182
Never operator + (other) => throw 'foo' ;
183
+
184
+ /*cfe.member: C.[]:doesNotComplete*/
172
185
Never operator [](other) => throw 'foo' ;
186
+
187
+ /*cfe.member: C.unary-:doesNotComplete*/
173
188
Never operator - () => throw 'foo' ;
174
189
175
190
/*member: C.constructor_initializer:doesNotComplete*/
Original file line number Diff line number Diff line change @@ -32,7 +32,6 @@ main(List<String> args) async {
32
32
'assert.dart' ,
33
33
'do.dart' ,
34
34
'for.dart' ,
35
- 'never_return_type.dart' ,
36
35
'switch.dart' ,
37
36
'try_catch.dart' ,
38
37
]);
@@ -84,7 +83,14 @@ class ReachabilityDataExtractor
84
83
@override
85
84
Set <_ReachabilityAssertion > computeNodeValue (Id id, TreeNode node) {
86
85
Set <_ReachabilityAssertion > result = {};
87
- if (_flowResult.unreachableNodes.contains (node)) {
86
+ if (node is Expression && node.parent is ExpressionStatement ) {
87
+ // The reachability of an expression statement and the statement it
88
+ // contains should always be the same. We check this with an assert
89
+ // statement, and only annotate the expression statement, to reduce the
90
+ // amount of redundancy in the test files.
91
+ assert (_flowResult.unreachableNodes.contains (node) ==
92
+ _flowResult.unreachableNodes.contains (node.parent));
93
+ } else if (_flowResult.unreachableNodes.contains (node)) {
88
94
result.add (_ReachabilityAssertion .unreachable);
89
95
}
90
96
if (node is FunctionDeclaration ) {
Original file line number Diff line number Diff line change @@ -2250,6 +2250,7 @@ redirects
2250
2250
reduce
2251
2251
reduced
2252
2252
reduces
2253
+ redundancy
2253
2254
redundant
2254
2255
refactor
2255
2256
refer
You can’t perform that action at this time.
0 commit comments