Skip to content

Commit ea4eaaa

Browse files
stereotype441commit-bot@chromium.org
authored andcommitted
Migration: Allow edges to be queried to see if they're satisfied.
Change-Id: I9da0233dfbac0c7aee168622c554d003c2c5e16c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/106382 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
1 parent 5167499 commit ea4eaaa

File tree

2 files changed

+71
-7
lines changed

2 files changed

+71
-7
lines changed

pkg/nnbd_migration/lib/src/nullability_node.dart

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,27 @@ class NullabilityEdge {
3333

3434
bool get hard => _kind != _NullabilityEdgeKind.soft;
3535

36+
/// Indicates whether nullability was successfully propagated through this
37+
/// edge.
38+
bool get isSatisfied {
39+
if (!_isTriggered) return true;
40+
return destinationNode.isNullable;
41+
}
42+
3643
bool get isUnion => _kind == _NullabilityEdgeKind.union;
3744

3845
NullabilityNode get primarySource => sources.first;
3946

47+
/// Indicates whether all the sources of this edge are nullable (and thus
48+
/// downstream nullability propagation should try to make the destination node
49+
/// nullable, if possible).
50+
bool get _isTriggered {
51+
for (var source in sources) {
52+
if (!source.isNullable) return false;
53+
}
54+
return true;
55+
}
56+
4057
@override
4158
String toString() {
4259
var edgeDecorations = <Object>[];
@@ -183,16 +200,10 @@ class NullabilityGraph {
183200
}
184201
var pendingSubstitutions = <NullabilityNodeForSubstitution>[];
185202
while (true) {
186-
nextEdge:
187203
while (pendingEdges.isNotEmpty) {
188204
var edge = pendingEdges.removeLast();
205+
if (!edge._isTriggered) continue;
189206
var node = edge.destinationNode;
190-
for (var source in edge.sources) {
191-
if (!source.isNullable) {
192-
// Not all sources are nullable, so this edge doesn't apply yet.
193-
continue nextEdge;
194-
}
195-
}
196207
if (node._state == _NullabilityState.nonNullable) {
197208
// The node has already been marked as non-nullable, so the edge can't
198209
// be satisfied.

pkg/nnbd_migration/test/nullability_node_test.dart

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,13 +481,66 @@ class NullabilityNodeTest {
481481
assertUnsatisfied([edge_always_1, edge_always_2, edge_always_3]);
482482
}
483483

484+
test_satisfied_edge_destination_nullable() {
485+
var n1 = newNode(1);
486+
var edge = connect(always, n1);
487+
propagate();
488+
assertUnsatisfied([]);
489+
expect(edge.isSatisfied, true);
490+
}
491+
492+
test_satisfied_edge_source_non_nullable() {
493+
var n1 = newNode(1);
494+
var n2 = newNode(1);
495+
var edge = connect(n1, n2);
496+
propagate();
497+
assertUnsatisfied([]);
498+
expect(edge.isSatisfied, true);
499+
}
500+
501+
test_satisfied_edge_two_sources_first_non_nullable() {
502+
var n1 = newNode(1);
503+
var n2 = newNode(1);
504+
connect(always, n2);
505+
var edge = connect(n1, never, guards: [n2]);
506+
propagate();
507+
assertUnsatisfied([]);
508+
expect(edge.isSatisfied, true);
509+
}
510+
511+
test_satisfied_edge_two_sources_second_non_nullable() {
512+
var n1 = newNode(1);
513+
var n2 = newNode(1);
514+
connect(always, n1);
515+
var edge = connect(n1, never, guards: [n2]);
516+
propagate();
517+
assertUnsatisfied([]);
518+
expect(edge.isSatisfied, true);
519+
}
520+
484521
test_unconstrainted_node_non_nullable() {
485522
var n1 = newNode(1);
486523
propagate();
487524
expect(n1.isNullable, false);
488525
assertUnsatisfied([]);
489526
}
490527

528+
test_unsatisfied_edge_multiple_sources() {
529+
var n1 = newNode(1);
530+
connect(always, n1);
531+
var edge = connect(always, never, guards: [n1]);
532+
propagate();
533+
assertUnsatisfied([edge]);
534+
expect(edge.isSatisfied, false);
535+
}
536+
537+
test_unsatisfied_edge_single_source() {
538+
var edge = connect(always, never);
539+
propagate();
540+
assertUnsatisfied([edge]);
541+
expect(edge.isSatisfied, false);
542+
}
543+
491544
void union(NullabilityNode x, NullabilityNode y) {
492545
graph.union(x, y, _TestEdgeOrigin());
493546
}

0 commit comments

Comments
 (0)