Skip to content

Commit

Permalink
Fix engine in preparation for implementing dart-lang/language#1274 (f…
Browse files Browse the repository at this point in the history
…lutter#23131)

When dart-lang/language#1274 (Infer
non-nullability from local boolean variables) is implemented, flow
analysis will detect that code like this no longer needs to perform a
null check:

    final bool hasIdentityTransform =
        transform == null || isIdentityFloat32ListTransform(transform);
    ...
    if (!hasIdentityTransform) {
      ... transform! ... // Null check unnecessary
    }

To avoid a build failure due to the unnecessary null check, we need to
temporarily write it in a way that we can ignore it.  Once the feature
is complete and rolled into flutter, I'll remove the null check
entirely.
  • Loading branch information
stereotype441 authored and gspencergoog committed Jan 5, 2021
1 parent 8559cf9 commit 3dffaca
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 2 deletions.
12 changes: 11 additions & 1 deletion lib/web_ui/lib/src/engine/html/surface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1092,7 +1092,17 @@ abstract class PersistedContainerSurface extends PersistedSurface {
for (int indexInOld = 0; indexInOld < oldChildCount; indexInOld += 1) {
final PersistedSurface? oldChild = oldChildren[indexInOld];
final bool childAlreadyClaimed = oldChild == null;
if (childAlreadyClaimed || !newChild.canUpdateAsMatch(oldChild!)) {
// After https://github.com/dart-lang/language/issues/1274 is
// implemented, `oldChild` will be promoted to non-nullable on the RHS
// of the `||`, so we won't need to null check it (and it will cause a
// build failure to try to do so). Until then, we need to null check it
// in such a way that won't cause a build failure once the feature is
// implemented. We can do that by casting to `dynamic`, and then
// relying on the call to `canUpdateAsMatch` implicitly downcasting to
// PersistentSurface.
// TODO(paulberry): remove this workaround once the feature is
// implemented.
if (childAlreadyClaimed || !newChild.canUpdateAsMatch(oldChild as dynamic)) {
continue;
}
allMatches.add(_PersistedSurfaceMatch(
Expand Down
12 changes: 11 additions & 1 deletion lib/web_ui/lib/src/engine/semantics/semantics.dart
Original file line number Diff line number Diff line change
Expand Up @@ -889,7 +889,17 @@ class SemanticsObject {
effectiveTransformIsIdentity = effectiveTransform.isIdentity();
}
} else if (!hasIdentityTransform) {
effectiveTransform = Matrix4.fromFloat32List(transform!);
// After https://github.com/dart-lang/language/issues/1274 is implemented,
// `transform` will be promoted to non-nullable so we won't need to null
// check it (and it will cause a build failure to try to do so). Until
// then, we need to null check it in such a way that won't cause a build
// failure once the feature is implemented. We can do that using an
// explicit "if" test.
// TODO(paulberry): remove this check once the feature is implemented.
if (transform == null) { // ignore: unnecessary_null_comparison
throw 'impossible';
}
effectiveTransform = Matrix4.fromFloat32List(transform);
effectiveTransformIsIdentity = false;
}

Expand Down

0 comments on commit 3dffaca

Please sign in to comment.