Replace flow analysis's setReachable with setUnreachable.
The setReachable method took a bool indicating whether the new state
should be considered reachable or not, however outside of tests the
value that was passed in was always `false`. Change to a
`setUnreachable` method taking no arguments.
This should make it easier to transition to a stack representation for
reachability.
Bug: https://github.com/dart-lang/sdk/issues/40009
Change-Id: I16a35ec3d5f44763a60e42f200a3caa619fac118
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165142
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index b56ed21..7959ff9 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -1525,12 +1525,11 @@
return _identicalOrNew(this, other, newReachable, newVariableInfo);
}
- /// Updates the state to indicate whether the control flow path is
- /// [reachable].
- FlowModel<Variable, Type> setReachable(bool reachable) {
- if (this.reachable == reachable) return this;
+ /// Updates the state to indicate that the control flow path is unreachable.
+ FlowModel<Variable, Type> setUnreachable() {
+ if (!reachable) return this;
- return new FlowModel<Variable, Type>.withInfo(reachable, variableInfo);
+ return new FlowModel<Variable, Type>.withInfo(false, variableInfo);
}
@override
@@ -2547,7 +2546,7 @@
@override
void booleanLiteral(Expression expression, bool value) {
- FlowModel<Variable, Type> unreachable = _current.setReachable(false);
+ FlowModel<Variable, Type> unreachable = _current.setUnreachable();
_storeExpressionInfo(
expression,
value
@@ -2676,7 +2675,7 @@
@override
void for_bodyBegin(Statement node, Expression condition) {
ExpressionInfo<Variable, Type> conditionInfo = condition == null
- ? new ExpressionInfo(_current, _current, _current.setReachable(false))
+ ? new ExpressionInfo(_current, _current, _current.setUnreachable())
: _expressionEnd(condition);
_WhileContext<Variable, Type> context =
new _WhileContext<Variable, Type>(conditionInfo);
@@ -2766,7 +2765,7 @@
if (context != null) {
context._breakModel = _join(context._breakModel, _current);
}
- _current = _current.setReachable(false);
+ _current = _current.setUnreachable();
}
@override
@@ -2775,12 +2774,12 @@
if (context != null) {
context._continueModel = _join(context._continueModel, _current);
}
- _current = _current.setReachable(false);
+ _current = _current.setUnreachable();
}
@override
void handleExit() {
- _current = _current.setReachable(false);
+ _current = _current.setUnreachable();
}
@override
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
index 062bbb5..b7b9be9 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
@@ -2215,24 +2215,22 @@
var intQVar = _Var('x', _Type('int?'));
var objectQVar = _Var('x', _Type('Object?'));
var nullVar = _Var('x', _Type('Null'));
- group('setReachable', () {
+ group('setUnreachable', () {
var unreachable = FlowModel<_Var, _Type>(false);
var reachable = FlowModel<_Var, _Type>(true);
test('unchanged', () {
- expect(unreachable.setReachable(false), same(unreachable));
- expect(reachable.setReachable(true), same(reachable));
+ expect(unreachable.setUnreachable(), same(unreachable));
});
test('changed', () {
- void _check(FlowModel<_Var, _Type> initial, bool newReachability) {
- var s = initial.setReachable(newReachability);
+ void _check(FlowModel<_Var, _Type> initial) {
+ var s = initial.setUnreachable();
expect(s, isNot(same(initial)));
- expect(s.reachable, newReachability);
+ expect(s.reachable, false);
expect(s.variableInfo, same(initial.variableInfo));
}
- _check(unreachable, true);
- _check(reachable, false);
+ _check(reachable);
});
});
@@ -2953,7 +2951,7 @@
test('reachability', () {
var h = _Harness();
var reachable = FlowModel<_Var, _Type>(true);
- var unreachable = reachable.setReachable(false);
+ var unreachable = reachable.setUnreachable();
expect(reachable.restrict(h, reachable, Set()), same(reachable));
expect(reachable.restrict(h, unreachable, Set()), same(unreachable));
expect(unreachable.restrict(h, unreachable, Set()), same(unreachable));