dependency_services: Use ^ constraints for widened intervals when possible (#3349)

diff --git a/lib/src/command/dependency_services.dart b/lib/src/command/dependency_services.dart
index dd3379f..0e731f4 100644
--- a/lib/src/command/dependency_services.dart
+++ b/lib/src/command/dependency_services.dart
@@ -403,18 +403,22 @@
     final min = original.min;
     final max = original.max;
     if (max != null && newVersion >= max) {
-      return VersionRange(
-        min: min,
-        includeMin: original.includeMin,
-        max: newVersion.nextBreaking.firstPreRelease,
+      return compatibleWithIfPossible(
+        VersionRange(
+          min: min,
+          includeMin: original.includeMin,
+          max: newVersion.nextBreaking.firstPreRelease,
+        ),
       );
     }
     if (min != null && newVersion <= min) {
-      return VersionRange(
-          min: newVersion,
-          includeMin: true,
-          max: max,
-          includeMax: original.includeMax);
+      return compatibleWithIfPossible(
+        VersionRange(
+            min: newVersion,
+            includeMin: true,
+            max: max,
+            includeMax: original.includeMax),
+      );
     }
   }
 
@@ -422,3 +426,11 @@
   throw ArgumentError.value(
       original, 'original', 'Must be a Version range or empty');
 }
+
+VersionConstraint compatibleWithIfPossible(VersionRange versionRange) {
+  final min = versionRange.min;
+  if (min != null && min.nextBreaking.firstPreRelease == versionRange.max) {
+    return VersionConstraint.compatibleWith(min);
+  }
+  return versionRange;
+}
diff --git a/test/dependency_services/dependency_services_test.dart b/test/dependency_services/dependency_services_test.dart
index f25cf2d..694e229 100644
--- a/test/dependency_services/dependency_services_test.dart
+++ b/test/dependency_services/dependency_services_test.dart
@@ -203,7 +203,8 @@
   testWithGolden('multibreaking', (context) async {
     final server = (await servePackages())
       ..serve('foo', '1.0.0')
-      ..serve('bar', '1.0.0');
+      ..serve('bar', '1.0.0')
+      ..serve('baz', '1.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -211,6 +212,8 @@
         'dependencies': {
           'foo': '^1.0.0',
           'bar': '^1.0.0',
+          // Pinned version. See that the widened constraint is correct.
+          'baz': '1.0.0',
         },
       })
     ]).create();
@@ -221,7 +224,7 @@
       ..serve('foo', '3.0.0', deps: {'bar': '^2.0.0'}) // multi breaking
       ..serve('foo', '3.0.1', deps: {'bar': '^2.0.0'})
       ..serve('bar', '2.0.0', deps: {'foo': '^3.0.0'})
-      ..serve('transitive', '1.0.0');
+      ..serve('baz', '1.1.0');
     await listReportApply(context, [
       _PackageVersion('foo', Version.parse('3.0.1'),
           constraint: VersionConstraint.parse('^3.0.0')),
diff --git a/test/testdata/goldens/dependency_services/dependency_services_test/multibreaking.txt b/test/testdata/goldens/dependency_services/dependency_services_test/multibreaking.txt
index 10f5426..32bc04e 100644
--- a/test/testdata/goldens/dependency_services/dependency_services_test/multibreaking.txt
+++ b/test/testdata/goldens/dependency_services/dependency_services_test/multibreaking.txt
@@ -1,7 +1,7 @@
 # GENERATED BY: test/dependency_services/dependency_services_test.dart
 
 $ cat pubspec.yaml
-{"name":"app","dependencies":{"foo":"^1.0.0","bar":"^1.0.0"},"environment":{"sdk":">=0.1.2 <1.0.0"}}
+{"name":"app","dependencies":{"foo":"^1.0.0","bar":"^1.0.0","baz":"1.0.0"},"environment":{"sdk":">=0.1.2 <1.0.0"}}
 $ cat pubspec.lock
 # Generated by pub
 # See https://dart.dev/tools/pub/glossary#lockfile
@@ -13,6 +13,13 @@
       url: "http://localhost:$PORT"
     source: hosted
     version: "1.0.0"
+  baz:
+    dependency: "direct main"
+    description:
+      name: baz
+      url: "http://localhost:$PORT"
+    source: hosted
+    version: "1.0.0"
   foo:
     dependency: "direct main"
     description:
@@ -35,6 +42,12 @@
       "constraint": "^1.0.0"
     },
     {
+      "name": "baz",
+      "version": "1.0.0",
+      "kind": "direct",
+      "constraint": "1.0.0"
+    },
+    {
       "name": "foo",
       "version": "1.0.0",
       "kind": "direct",
@@ -81,6 +94,38 @@
       ]
     },
     {
+      "name": "baz",
+      "version": "1.0.0",
+      "kind": "direct",
+      "latest": "1.1.0",
+      "constraint": "1.0.0",
+      "compatible": [],
+      "singleBreaking": [
+        {
+          "name": "baz",
+          "version": "1.1.0",
+          "kind": "direct",
+          "constraintBumped": "^1.1.0",
+          "constraintWidened": "^1.0.0",
+          "constraintBumpedIfNeeded": "^1.1.0",
+          "previousVersion": "1.0.0",
+          "previousConstraint": "1.0.0"
+        }
+      ],
+      "multiBreaking": [
+        {
+          "name": "baz",
+          "version": "1.1.0",
+          "kind": "direct",
+          "constraintBumped": "^1.1.0",
+          "constraintWidened": "^1.0.0",
+          "constraintBumpedIfNeeded": "^1.1.0",
+          "previousVersion": "1.0.0",
+          "previousConstraint": "1.0.0"
+        }
+      ]
+    },
+    {
       "name": "foo",
       "version": "1.0.0",
       "kind": "direct",
@@ -145,7 +190,7 @@
 -------------------------------- END OF OUTPUT ---------------------------------
 
 $ cat pubspec.yaml
-{"name":"app","dependencies":{"foo":^3.0.0,"bar":^2.0.0},"environment":{"sdk":">=0.1.2 <1.0.0"}}
+{"name":"app","dependencies":{"foo":^3.0.0,"bar":^2.0.0,"baz":"1.0.0"},"environment":{"sdk":">=0.1.2 <1.0.0"}}
 $ cat pubspec.lock
 # Generated by pub
 # See https://dart.dev/tools/pub/glossary#lockfile
@@ -157,6 +202,13 @@
       url: "http://localhost:$PORT"
     source: hosted
     version: "2.0.0"
+  baz:
+    dependency: "direct main"
+    description:
+      name: baz
+      url: "http://localhost:$PORT"
+    source: hosted
+    version: "1.0.0"
   foo:
     dependency: "direct main"
     description: