| Index: utils/pub/version.dart | 
| diff --git a/utils/pub/version.dart b/utils/pub/version.dart | 
| index e7ca3d1299f56551ec10768476f0ed0ddc40783b..18e15a5f84a8f7deabdb0cf35a4e26aff37e3708 100644 | 
| --- a/utils/pub/version.dart | 
| +++ b/utils/pub/version.dart | 
| @@ -110,7 +110,9 @@ class Version implements Comparable, VersionConstraint { | 
| if (other is VersionRange) return other.intersect(this); | 
|  | 
| // Intersecting two versions only works if they are the same. | 
| -    if (other is Version) return this == other ? this : const _EmptyVersion(); | 
| +    if (other is Version) { | 
| +      return this == other ? this : VersionConstraint.empty; | 
| +    } | 
|  | 
| throw new ArgumentError( | 
| 'Unknown VersionConstraint type $other.'); | 
| @@ -206,8 +208,11 @@ class Version implements Comparable, VersionConstraint { | 
| /// version that is "2.0.0" or greater. Version objects themselves implement | 
| /// this to match a specific version. | 
| abstract class VersionConstraint { | 
| +  /// A [VersionConstraint] that allows all versions. | 
| +  static VersionConstraint any = new VersionRange(); | 
| + | 
| /// A [VersionConstraint] that allows no versions: i.e. the empty set. | 
| -  factory VersionConstraint.empty() => const _EmptyVersion(); | 
| +  static VersionConstraint empty = const _EmptyVersion(); | 
|  | 
| /// Parses a version constraint. This string is a space-separated series of | 
| /// version parts. Each part can be one of: | 
| @@ -333,7 +338,9 @@ class VersionRange implements VersionConstraint { | 
| if (other.isEmpty) return other; | 
|  | 
| // A range and a Version just yields the version if it's in the range. | 
| -    if (other is Version) return allows(other) ? other : const _EmptyVersion(); | 
| +    if (other is Version) { | 
| +      return allows(other) ? other : VersionConstraint.empty; | 
| +    } | 
|  | 
| if (other is VersionRange) { | 
| // Intersect the two ranges. | 
| @@ -373,13 +380,13 @@ class VersionRange implements VersionConstraint { | 
| if (intersectIncludeMin && intersectIncludeMax) return intersectMin; | 
|  | 
| // Otherwise, no versions. | 
| -        return const _EmptyVersion(); | 
| +        return VersionConstraint.empty; | 
| } | 
|  | 
| if (intersectMin != null && intersectMax != null && | 
| intersectMin > intersectMax) { | 
| // Non-overlapping ranges, so empty. | 
| -        return const _EmptyVersion(); | 
| +        return VersionConstraint.empty; | 
| } | 
|  | 
| // If we got here, there is an actual range. | 
|  |