Version 2.14.0-231.0.dev

Merge commit '430709cd1d7f14473b55ccb90c6a56181188d719' into 'dev'
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index ff28b32..cfe297c4 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -4019,7 +4019,7 @@
             var element = parameter.declaredElement!;
             errorReporter.reportErrorForNode(
               CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
-              parameter,
+              parameter.name,
               [element.displayName, element.bound],
             );
             break;
diff --git a/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart b/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart
index fea9303..001d947 100644
--- a/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart
@@ -22,7 +22,7 @@
 class A<T extends T> {
 }
 ''', [
-      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 11),
+      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 1),
     ]);
   }
 
@@ -34,7 +34,7 @@
   }
 }
 ''', [
-      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 11),
+      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 1),
     ]);
   }
 
@@ -43,8 +43,8 @@
 class A<T1 extends T3, T2, T3 extends T1> {
 }
 ''', [
-      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 13),
-      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 27, 13),
+      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 2),
+      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 27, 2),
     ]);
   }
 }
diff --git a/pkg/nnbd_migration/tool/postmortem.dart b/pkg/nnbd_migration/tool/postmortem.dart
deleted file mode 100644
index a523b3a..0000000
--- a/pkg/nnbd_migration/tool/postmortem.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:args/args.dart';
-import 'package:meta/meta.dart';
-
-void main(List<String> args) {}
-
-class Subcommand {
-  final String name;
-  final String suffix;
-  final String help;
-  final ArgParser argParser;
-
-  Subcommand(
-      {@required this.name,
-      this.suffix,
-      @required this.help,
-      @required this.argParser});
-}
diff --git a/sdk/lib/math/rectangle.dart b/sdk/lib/math/rectangle.dart
index e80d790..1fe8ea9 100644
--- a/sdk/lib/math/rectangle.dart
+++ b/sdk/lib/math/rectangle.dart
@@ -137,9 +137,12 @@
   /// single point `(left, top)`.
   const Rectangle(this.left, this.top, T width, T height)
       : width = (width < 0)
-            ? (-width * 0) as dynamic
-            : width, // Inline _clampToZero<num>.
-        height = (height < 0) ? (-height * 0) as dynamic : height;
+            ? (width == double.negativeInfinity ? 0.0 : (-width * 0)) as dynamic
+            : (width + 0 as dynamic), // Inline _clampToZero<num>.
+        height = (height < 0)
+            ? (height == double.negativeInfinity ? 0.0 : (-height * 0))
+                as dynamic
+            : (height + 0 as dynamic);
 
   /// Create a rectangle spanned by the points [a] and [b];
   ///
@@ -189,8 +192,10 @@
   /// If `width` and `height` are zero, the "rectangle" comprises only the
   /// single point `(left, top)`.
   MutableRectangle(this.left, this.top, T width, T height)
-      : this._width = (width < 0) ? _clampToZero<T>(width) : width,
-        this._height = (height < 0) ? _clampToZero<T>(height) : height;
+      : this._width =
+            (width < 0) ? _clampToZero<T>(width) : (width + 0 as dynamic),
+        this._height =
+            (height < 0) ? _clampToZero<T>(height) : (height + 0 as dynamic);
 
   /// Create a mutable rectangle spanned by the points [a] and [b];
   ///
@@ -244,5 +249,6 @@
 /// Returns `0` if value is int, `0.0` if value is double.
 T _clampToZero<T extends num>(T value) {
   assert(value < 0);
-  return (-value * 0) as T;
+  if (value == double.negativeInfinity) return 0.0 as dynamic;
+  return (-value * 0) as dynamic;
 }
diff --git a/tests/lib/math/rectangle_test.dart b/tests/lib/math/rectangle_test.dart
index f6cf2b2..15422e7 100644
--- a/tests/lib/math/rectangle_test.dart
+++ b/tests/lib/math/rectangle_test.dart
@@ -22,25 +22,24 @@
   testNaNHeight();
 }
 
-Rectangle? createRectangle(List<num>? a) {
-  return a != null ? new Rectangle(a[0], a[1], a[2] - a[0], a[3] - a[1]) : null;
-}
+Rectangle? createRectangle(List<num>? a) =>
+    a != null ? Rectangle(a[0], a[1], a[2] - a[0], a[3] - a[1]) : null;
 
 testConstruction() {
-  var r0 = new Rectangle(10, 20, 30, 40);
+  var r0 = Rectangle(10, 20, 30, 40);
   Expect.equals('Rectangle (10, 20) 30 x 40', r0.toString());
   Expect.equals(40, r0.right);
   Expect.equals(60, r0.bottom);
 
-  var r1 = new Rectangle.fromPoints(r0.topLeft, r0.bottomRight);
+  var r1 = Rectangle.fromPoints(r0.topLeft, r0.bottomRight);
   Expect.equals(r0, r1);
 
-  var r2 = new Rectangle.fromPoints(r0.bottomRight, r0.topLeft);
+  var r2 = Rectangle.fromPoints(r0.bottomRight, r0.topLeft);
   Expect.equals(r0, r2);
 }
 
 testIntersection() {
-  var tests = <List<List<num>?>>[
+  var tests = [
     [
       [10, 10, 20, 20],
       [15, 15, 25, 25],
@@ -64,19 +63,19 @@
   ];
 
   for (var test in tests) {
-    var r0 = createRectangle(test[0]);
-    var r1 = createRectangle(test[1]);
+    var r0 = createRectangle(test[0])!;
+    var r1 = createRectangle(test[1])!;
     var expected = createRectangle(test[2]);
 
-    Expect.equals(expected, r0?.intersection(r1!));
-    Expect.equals(expected, r1?.intersection(r0!));
+    Expect.equals(expected, r0.intersection(r1));
+    Expect.equals(expected, r1.intersection(r0));
   }
 }
 
 testIntersects() {
-  var r0 = new Rectangle(10, 10, 20, 20);
-  var r1 = new Rectangle(15, 15, 25, 25);
-  var r2 = new Rectangle(0, 0, 1, 1);
+  var r0 = Rectangle(10, 10, 20, 20);
+  var r1 = Rectangle(15, 15, 25, 25);
+  var r2 = Rectangle(0, 0, 1, 1);
 
   Expect.isTrue(r0.intersects(r1));
   Expect.isTrue(r1.intersects(r0));
@@ -110,75 +109,75 @@
   ];
 
   for (var test in tests) {
-    var r0 = createRectangle(test[0]);
-    var r1 = createRectangle(test[1]);
-    var expected = createRectangle(test[2]);
+    var r0 = createRectangle(test[0])!;
+    var r1 = createRectangle(test[1])!;
+    var expected = createRectangle(test[2])!;
 
-    Expect.equals(expected, r0?.boundingBox(r1!));
-    Expect.equals(expected, r1?.boundingBox(r0!));
+    Expect.equals(expected, r0.boundingBox(r1));
+    Expect.equals(expected, r1.boundingBox(r0));
   }
 }
 
 testContainsRectangle() {
-  var r = new Rectangle(-10, 0, 20, 10);
+  var r = Rectangle(-10, 0, 20, 10);
   Expect.isTrue(r.containsRectangle(r));
 
   Expect.isFalse(r.containsRectangle(
-      new Rectangle(double.nan, double.nan, double.nan, double.nan)));
+      Rectangle(double.nan, double.nan, double.nan, double.nan)));
 
-  var r2 = new Rectangle(0, 2, 5, 5);
+  var r2 = Rectangle(0, 2, 5, 5);
   Expect.isTrue(r.containsRectangle(r2));
   Expect.isFalse(r2.containsRectangle(r));
 
-  r2 = new Rectangle(-11, 2, 5, 5);
+  r2 = Rectangle(-11, 2, 5, 5);
   Expect.isFalse(r.containsRectangle(r2));
-  r2 = new Rectangle(0, 2, 15, 5);
+  r2 = Rectangle(0, 2, 15, 5);
   Expect.isFalse(r.containsRectangle(r2));
-  r2 = new Rectangle(0, 2, 5, 10);
+  r2 = Rectangle(0, 2, 5, 10);
   Expect.isFalse(r.containsRectangle(r2));
-  r2 = new Rectangle(0, 0, 5, 10);
+  r2 = Rectangle(0, 0, 5, 10);
   Expect.isTrue(r.containsRectangle(r2));
 }
 
 testContainsPoint() {
-  var r = new Rectangle(20, 40, 60, 80);
+  var r = Rectangle(20, 40, 60, 80);
 
   // Test middle.
-  Expect.isTrue(r.containsPoint(new Point(50, 80)));
+  Expect.isTrue(r.containsPoint(Point(50, 80)));
 
   // Test edges.
-  Expect.isTrue(r.containsPoint(new Point(20, 40)));
-  Expect.isTrue(r.containsPoint(new Point(50, 40)));
-  Expect.isTrue(r.containsPoint(new Point(80, 40)));
-  Expect.isTrue(r.containsPoint(new Point(80, 80)));
-  Expect.isTrue(r.containsPoint(new Point(80, 120)));
-  Expect.isTrue(r.containsPoint(new Point(50, 120)));
-  Expect.isTrue(r.containsPoint(new Point(20, 120)));
-  Expect.isTrue(r.containsPoint(new Point(20, 80)));
+  Expect.isTrue(r.containsPoint(Point(20, 40)));
+  Expect.isTrue(r.containsPoint(Point(50, 40)));
+  Expect.isTrue(r.containsPoint(Point(80, 40)));
+  Expect.isTrue(r.containsPoint(Point(80, 80)));
+  Expect.isTrue(r.containsPoint(Point(80, 120)));
+  Expect.isTrue(r.containsPoint(Point(50, 120)));
+  Expect.isTrue(r.containsPoint(Point(20, 120)));
+  Expect.isTrue(r.containsPoint(Point(20, 80)));
 
   // Test outside.
-  Expect.isFalse(r.containsPoint(new Point(0, 0)));
-  Expect.isFalse(r.containsPoint(new Point(50, 0)));
-  Expect.isFalse(r.containsPoint(new Point(100, 0)));
-  Expect.isFalse(r.containsPoint(new Point(100, 80)));
-  Expect.isFalse(r.containsPoint(new Point(100, 160)));
-  Expect.isFalse(r.containsPoint(new Point(50, 160)));
-  Expect.isFalse(r.containsPoint(new Point(0, 160)));
-  Expect.isFalse(r.containsPoint(new Point(0, 80)));
+  Expect.isFalse(r.containsPoint(Point(0, 0)));
+  Expect.isFalse(r.containsPoint(Point(50, 0)));
+  Expect.isFalse(r.containsPoint(Point(100, 0)));
+  Expect.isFalse(r.containsPoint(Point(100, 80)));
+  Expect.isFalse(r.containsPoint(Point(100, 160)));
+  Expect.isFalse(r.containsPoint(Point(50, 160)));
+  Expect.isFalse(r.containsPoint(Point(0, 160)));
+  Expect.isFalse(r.containsPoint(Point(0, 80)));
 }
 
 testHashCode() {
-  var a = new Rectangle(0, 1, 2, 3);
-  var b = new Rectangle(0, 1, 2, 3);
+  var a = Rectangle(0, 1, 2, 3);
+  var b = Rectangle(0, 1, 2, 3);
   Expect.equals(b.hashCode, a.hashCode);
 
-  var c = new Rectangle(1, 0, 2, 3);
+  var c = Rectangle(1, 0, 2, 3);
   Expect.isFalse(a.hashCode == c.hashCode);
 }
 
 testEdgeCases() {
   edgeTest(double a, double l) {
-    var r = new Rectangle(a, a, l, l);
+    var r = Rectangle(a, a, l, l);
     Expect.equals(r, r.boundingBox(r));
     Expect.equals(r, r.intersection(r));
   }
@@ -196,8 +195,8 @@
 
 testEquality() {
   var bignum = 0x80000000000008 + 0.0;
-  var r1 = new Rectangle(bignum, bignum, 1.0, 1.0);
-  var r2 = new Rectangle(bignum, bignum, 2.0, 2.0);
+  var r1 = Rectangle(bignum, bignum, 1.0, 1.0);
+  var r2 = Rectangle(bignum, bignum, 2.0, 2.0);
   Expect.equals(r2, r1);
   Expect.equals(r2.hashCode, r1.hashCode);
   Expect.equals(r2.right, r1.right);
@@ -208,17 +207,22 @@
 
 testNegativeLengths() {
   // Constructor allows negative lengths, but clamps them to zero.
-  Expect.equals(new Rectangle(4, 4, 0, 0), new Rectangle(4, 4, -2, -2));
-  Expect.equals(new Rectangle(4, 4, 0, 0), new MutableRectangle(4, 4, -2, -2));
+  Expect.equals(Rectangle(4, 4, 0, 0), Rectangle(4, 4, -2, -2));
+  Expect.equals(Rectangle(4, 4, 0, 0), MutableRectangle(4, 4, -2, -2));
 
   // Setters clamp negative lengths to zero.
-  var mutable = new MutableRectangle(0, 0, 1, 1);
+  var mutable = MutableRectangle(0, 0, 1, 1);
   mutable.width = -1;
   mutable.height = -1;
-  Expect.equals(new Rectangle(0, 0, 0, 0), mutable);
+  Expect.equals(Rectangle(0, 0, 0, 0), mutable);
 
   // Test that doubles are clamped to double zero.
-  var rectangle = new Rectangle(1.5, 1.5, -2.5, -2.5);
+  var rectangle = Rectangle(1.5, 1.5, -2.5, -2.5);
+  Expect.isTrue(identical(rectangle.width, 0.0));
+  Expect.isTrue(identical(rectangle.height, 0.0));
+
+  var inf = double.infinity;
+  rectangle = Rectangle(1.5, 1.5, -inf, -inf);
   Expect.isTrue(identical(rectangle.width, 0.0));
   Expect.isTrue(identical(rectangle.height, 0.0));
 }
@@ -226,14 +230,14 @@
 testNaNLeft() {
   var rectangles = [
     const Rectangle(double.nan, 1, 2, 3),
-    new MutableRectangle(double.nan, 1, 2, 3),
-    new Rectangle.fromPoints(new Point(double.nan, 1), new Point(2, 4)),
-    new MutableRectangle.fromPoints(new Point(double.nan, 1), new Point(2, 4)),
+    MutableRectangle(double.nan, 1, 2, 3),
+    Rectangle.fromPoints(Point(double.nan, 1), Point(2, 4)),
+    MutableRectangle.fromPoints(Point(double.nan, 1), Point(2, 4)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.left.isNaN);
     Expect.isTrue(r.right.isNaN);
   }
@@ -242,14 +246,14 @@
 testNaNTop() {
   var rectangles = [
     const Rectangle(0, double.nan, 2, 3),
-    new MutableRectangle(0, double.nan, 2, 3),
-    new Rectangle.fromPoints(new Point(0, double.nan), new Point(2, 4)),
-    new MutableRectangle.fromPoints(new Point(0, double.nan), new Point(2, 4)),
+    MutableRectangle(0, double.nan, 2, 3),
+    Rectangle.fromPoints(Point(0, double.nan), Point(2, 4)),
+    MutableRectangle.fromPoints(Point(0, double.nan), Point(2, 4)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.top.isNaN);
     Expect.isTrue(r.bottom.isNaN);
   }
@@ -258,14 +262,14 @@
 testNaNWidth() {
   var rectangles = [
     const Rectangle(0, 1, double.nan, 3),
-    new MutableRectangle(0, 1, double.nan, 3),
-    new Rectangle.fromPoints(new Point(0, 1), new Point(double.nan, 4)),
-    new MutableRectangle.fromPoints(new Point(0, 1), new Point(double.nan, 4)),
+    MutableRectangle(0, 1, double.nan, 3),
+    Rectangle.fromPoints(Point(0, 1), Point(double.nan, 4)),
+    MutableRectangle.fromPoints(Point(0, 1), Point(double.nan, 4)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.right.isNaN);
     Expect.isTrue(r.width.isNaN);
   }
@@ -274,14 +278,14 @@
 testNaNHeight() {
   var rectangles = [
     const Rectangle(0, 1, 2, double.nan),
-    new MutableRectangle(0, 1, 2, double.nan),
-    new Rectangle.fromPoints(new Point(0, 1), new Point(2, double.nan)),
-    new MutableRectangle.fromPoints(new Point(0, 1), new Point(2, double.nan)),
+    MutableRectangle(0, 1, 2, double.nan),
+    Rectangle.fromPoints(Point(0, 1), Point(2, double.nan)),
+    MutableRectangle.fromPoints(Point(0, 1), Point(2, double.nan)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.bottom.isNaN);
     Expect.isTrue(r.height.isNaN);
   }
diff --git a/tests/lib_2/math/rectangle_test.dart b/tests/lib_2/math/rectangle_test.dart
index 2681023..296cb41 100644
--- a/tests/lib_2/math/rectangle_test.dart
+++ b/tests/lib_2/math/rectangle_test.dart
@@ -24,20 +24,19 @@
   testNaNHeight();
 }
 
-Rectangle createRectangle(List<num> a) {
-  return a != null ? new Rectangle(a[0], a[1], a[2] - a[0], a[3] - a[1]) : null;
-}
+Rectangle createRectangle(List<num> a) =>
+    a != null ? Rectangle(a[0], a[1], a[2] - a[0], a[3] - a[1]) : null;
 
 testConstruction() {
-  var r0 = new Rectangle(10, 20, 30, 40);
+  var r0 = Rectangle(10, 20, 30, 40);
   Expect.equals('Rectangle (10, 20) 30 x 40', r0.toString());
   Expect.equals(40, r0.right);
   Expect.equals(60, r0.bottom);
 
-  var r1 = new Rectangle.fromPoints(r0.topLeft, r0.bottomRight);
+  var r1 = Rectangle.fromPoints(r0.topLeft, r0.bottomRight);
   Expect.equals(r0, r1);
 
-  var r2 = new Rectangle.fromPoints(r0.bottomRight, r0.topLeft);
+  var r2 = Rectangle.fromPoints(r0.bottomRight, r0.topLeft);
   Expect.equals(r0, r2);
 }
 
@@ -76,9 +75,9 @@
 }
 
 testIntersects() {
-  var r0 = new Rectangle(10, 10, 20, 20);
-  var r1 = new Rectangle(15, 15, 25, 25);
-  var r2 = new Rectangle(0, 0, 1, 1);
+  var r0 = Rectangle(10, 10, 20, 20);
+  var r1 = Rectangle(15, 15, 25, 25);
+  var r2 = Rectangle(0, 0, 1, 1);
 
   Expect.isTrue(r0.intersects(r1));
   Expect.isTrue(r1.intersects(r0));
@@ -122,65 +121,65 @@
 }
 
 testContainsRectangle() {
-  var r = new Rectangle(-10, 0, 20, 10);
+  var r = Rectangle(-10, 0, 20, 10);
   Expect.isTrue(r.containsRectangle(r));
 
   Expect.isFalse(r.containsRectangle(
-      new Rectangle(double.nan, double.nan, double.nan, double.nan)));
+      Rectangle(double.nan, double.nan, double.nan, double.nan)));
 
-  var r2 = new Rectangle(0, 2, 5, 5);
+  var r2 = Rectangle(0, 2, 5, 5);
   Expect.isTrue(r.containsRectangle(r2));
   Expect.isFalse(r2.containsRectangle(r));
 
-  r2 = new Rectangle(-11, 2, 5, 5);
+  r2 = Rectangle(-11, 2, 5, 5);
   Expect.isFalse(r.containsRectangle(r2));
-  r2 = new Rectangle(0, 2, 15, 5);
+  r2 = Rectangle(0, 2, 15, 5);
   Expect.isFalse(r.containsRectangle(r2));
-  r2 = new Rectangle(0, 2, 5, 10);
+  r2 = Rectangle(0, 2, 5, 10);
   Expect.isFalse(r.containsRectangle(r2));
-  r2 = new Rectangle(0, 0, 5, 10);
+  r2 = Rectangle(0, 0, 5, 10);
   Expect.isTrue(r.containsRectangle(r2));
 }
 
 testContainsPoint() {
-  var r = new Rectangle(20, 40, 60, 80);
+  var r = Rectangle(20, 40, 60, 80);
 
   // Test middle.
-  Expect.isTrue(r.containsPoint(new Point(50, 80)));
+  Expect.isTrue(r.containsPoint(Point(50, 80)));
 
   // Test edges.
-  Expect.isTrue(r.containsPoint(new Point(20, 40)));
-  Expect.isTrue(r.containsPoint(new Point(50, 40)));
-  Expect.isTrue(r.containsPoint(new Point(80, 40)));
-  Expect.isTrue(r.containsPoint(new Point(80, 80)));
-  Expect.isTrue(r.containsPoint(new Point(80, 120)));
-  Expect.isTrue(r.containsPoint(new Point(50, 120)));
-  Expect.isTrue(r.containsPoint(new Point(20, 120)));
-  Expect.isTrue(r.containsPoint(new Point(20, 80)));
+  Expect.isTrue(r.containsPoint(Point(20, 40)));
+  Expect.isTrue(r.containsPoint(Point(50, 40)));
+  Expect.isTrue(r.containsPoint(Point(80, 40)));
+  Expect.isTrue(r.containsPoint(Point(80, 80)));
+  Expect.isTrue(r.containsPoint(Point(80, 120)));
+  Expect.isTrue(r.containsPoint(Point(50, 120)));
+  Expect.isTrue(r.containsPoint(Point(20, 120)));
+  Expect.isTrue(r.containsPoint(Point(20, 80)));
 
   // Test outside.
-  Expect.isFalse(r.containsPoint(new Point(0, 0)));
-  Expect.isFalse(r.containsPoint(new Point(50, 0)));
-  Expect.isFalse(r.containsPoint(new Point(100, 0)));
-  Expect.isFalse(r.containsPoint(new Point(100, 80)));
-  Expect.isFalse(r.containsPoint(new Point(100, 160)));
-  Expect.isFalse(r.containsPoint(new Point(50, 160)));
-  Expect.isFalse(r.containsPoint(new Point(0, 160)));
-  Expect.isFalse(r.containsPoint(new Point(0, 80)));
+  Expect.isFalse(r.containsPoint(Point(0, 0)));
+  Expect.isFalse(r.containsPoint(Point(50, 0)));
+  Expect.isFalse(r.containsPoint(Point(100, 0)));
+  Expect.isFalse(r.containsPoint(Point(100, 80)));
+  Expect.isFalse(r.containsPoint(Point(100, 160)));
+  Expect.isFalse(r.containsPoint(Point(50, 160)));
+  Expect.isFalse(r.containsPoint(Point(0, 160)));
+  Expect.isFalse(r.containsPoint(Point(0, 80)));
 }
 
 testHashCode() {
-  var a = new Rectangle(0, 1, 2, 3);
-  var b = new Rectangle(0, 1, 2, 3);
+  var a = Rectangle(0, 1, 2, 3);
+  var b = Rectangle(0, 1, 2, 3);
   Expect.equals(b.hashCode, a.hashCode);
 
-  var c = new Rectangle(1, 0, 2, 3);
+  var c = Rectangle(1, 0, 2, 3);
   Expect.isFalse(a.hashCode == c.hashCode);
 }
 
 testEdgeCases() {
   edgeTest(double a, double l) {
-    var r = new Rectangle(a, a, l, l);
+    var r = Rectangle(a, a, l, l);
     Expect.equals(r, r.boundingBox(r));
     Expect.equals(r, r.intersection(r));
   }
@@ -198,8 +197,8 @@
 
 testEquality() {
   var bignum = 0x80000000000008 + 0.0;
-  var r1 = new Rectangle(bignum, bignum, 1.0, 1.0);
-  var r2 = new Rectangle(bignum, bignum, 2.0, 2.0);
+  var r1 = Rectangle(bignum, bignum, 1.0, 1.0);
+  var r2 = Rectangle(bignum, bignum, 2.0, 2.0);
   Expect.equals(r2, r1);
   Expect.equals(r2.hashCode, r1.hashCode);
   Expect.equals(r2.right, r1.right);
@@ -210,17 +209,22 @@
 
 testNegativeLengths() {
   // Constructor allows negative lengths, but clamps them to zero.
-  Expect.equals(new Rectangle(4, 4, 0, 0), new Rectangle(4, 4, -2, -2));
-  Expect.equals(new Rectangle(4, 4, 0, 0), new MutableRectangle(4, 4, -2, -2));
+  Expect.equals(Rectangle(4, 4, 0, 0), Rectangle(4, 4, -2, -2));
+  Expect.equals(Rectangle(4, 4, 0, 0), MutableRectangle(4, 4, -2, -2));
 
   // Setters clamp negative lengths to zero.
-  var mutable = new MutableRectangle(0, 0, 1, 1);
+  var mutable = MutableRectangle(0, 0, 1, 1);
   mutable.width = -1;
   mutable.height = -1;
-  Expect.equals(new Rectangle(0, 0, 0, 0), mutable);
+  Expect.equals(Rectangle(0, 0, 0, 0), mutable);
 
   // Test that doubles are clamped to double zero.
-  var rectangle = new Rectangle(1.5, 1.5, -2.5, -2.5);
+  var rectangle = Rectangle(1.5, 1.5, -2.5, -2.5);
+  Expect.isTrue(identical(rectangle.width, 0.0));
+  Expect.isTrue(identical(rectangle.height, 0.0));
+
+  var inf = double.infinity;
+  rectangle = Rectangle(1.5, 1.5, -inf, -inf);
   Expect.isTrue(identical(rectangle.width, 0.0));
   Expect.isTrue(identical(rectangle.height, 0.0));
 }
@@ -228,14 +232,14 @@
 testNaNLeft() {
   var rectangles = [
     const Rectangle(double.nan, 1, 2, 3),
-    new MutableRectangle(double.nan, 1, 2, 3),
-    new Rectangle.fromPoints(new Point(double.nan, 1), new Point(2, 4)),
-    new MutableRectangle.fromPoints(new Point(double.nan, 1), new Point(2, 4)),
+    MutableRectangle(double.nan, 1, 2, 3),
+    Rectangle.fromPoints(Point(double.nan, 1), Point(2, 4)),
+    MutableRectangle.fromPoints(Point(double.nan, 1), Point(2, 4)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.left.isNaN);
     Expect.isTrue(r.right.isNaN);
   }
@@ -244,14 +248,14 @@
 testNaNTop() {
   var rectangles = [
     const Rectangle(0, double.nan, 2, 3),
-    new MutableRectangle(0, double.nan, 2, 3),
-    new Rectangle.fromPoints(new Point(0, double.nan), new Point(2, 4)),
-    new MutableRectangle.fromPoints(new Point(0, double.nan), new Point(2, 4)),
+    MutableRectangle(0, double.nan, 2, 3),
+    Rectangle.fromPoints(Point(0, double.nan), Point(2, 4)),
+    MutableRectangle.fromPoints(Point(0, double.nan), Point(2, 4)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.top.isNaN);
     Expect.isTrue(r.bottom.isNaN);
   }
@@ -260,14 +264,14 @@
 testNaNWidth() {
   var rectangles = [
     const Rectangle(0, 1, double.nan, 3),
-    new MutableRectangle(0, 1, double.nan, 3),
-    new Rectangle.fromPoints(new Point(0, 1), new Point(double.nan, 4)),
-    new MutableRectangle.fromPoints(new Point(0, 1), new Point(double.nan, 4)),
+    MutableRectangle(0, 1, double.nan, 3),
+    Rectangle.fromPoints(Point(0, 1), Point(double.nan, 4)),
+    MutableRectangle.fromPoints(Point(0, 1), Point(double.nan, 4)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.right.isNaN);
     Expect.isTrue(r.width.isNaN);
   }
@@ -276,14 +280,14 @@
 testNaNHeight() {
   var rectangles = [
     const Rectangle(0, 1, 2, double.nan),
-    new MutableRectangle(0, 1, 2, double.nan),
-    new Rectangle.fromPoints(new Point(0, 1), new Point(2, double.nan)),
-    new MutableRectangle.fromPoints(new Point(0, 1), new Point(2, double.nan)),
+    MutableRectangle(0, 1, 2, double.nan),
+    Rectangle.fromPoints(Point(0, 1), Point(2, double.nan)),
+    MutableRectangle.fromPoints(Point(0, 1), Point(2, double.nan)),
   ];
   for (var r in rectangles) {
-    Expect.isFalse(r.containsPoint(new Point(0, 1)));
-    Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3)));
-    Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.containsPoint(Point(0, 1)));
+    Expect.isFalse(r.containsRectangle(Rectangle(0, 1, 2, 3)));
+    Expect.isFalse(r.intersects(Rectangle(0, 1, 2, 3)));
     Expect.isTrue(r.bottom.isNaN);
     Expect.isTrue(r.height.isNaN);
   }
diff --git a/tools/VERSION b/tools/VERSION
index a9fccb7..45803c1d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 230
+PRERELEASE 231
 PRERELEASE_PATCH 0
\ No newline at end of file