Omit languageVersion when there is no SDK constraint (#2300)

Instead of writing a language version based on the current SDK.
This causes the fallback to using the latest version to happen
at runtime instead of at `pub get` time.
diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart
index 749c818..5e71fba 100644
--- a/lib/src/entrypoint.dart
+++ b/lib/src/entrypoint.dart
@@ -676,18 +676,18 @@
         continue;
       }
 
-      String languageVersion;
       try {
-        languageVersion = extractLanguageVersion(
+        final languageVersion = extractLanguageVersion(
           cache.load(id).pubspec.sdkConstraints[sdk.identifier],
         );
+        if (pkg.languageVersion != languageVersion) {
+          dataError('${p.join(source.getDirectory(id), 'pubspec.yaml')} has '
+              'changed since the pubspec.lock file was generated, please run '
+              '"pub get" again.');
+        }
       } on FileException {
-        languageVersion = null;
-      }
-      if (languageVersion == null || pkg.languageVersion != languageVersion) {
-        dataError('${p.join(source.getDirectory(id), 'pubspec.yaml')} has '
-            'changed since the pubspec.lock file was generated, please run "pub '
-            'get" again.');
+        dataError('Failed to read pubspec.yaml for "${pkg.name}", perhaps the '
+            'entry is missing, please run "pub get".');
       }
     }
   }
diff --git a/lib/src/package_config.dart b/lib/src/package_config.dart
index b9f5caf..0c876b3 100644
--- a/lib/src/package_config.dart
+++ b/lib/src/package_config.dart
@@ -5,7 +5,6 @@
 import 'package:meta/meta.dart';
 
 import 'package:pub_semver/pub_semver.dart';
-import 'sdk.dart' show sdk;
 
 /// Contents of a `.dart_tool/package_config.json` file.
 class PackageConfig {
@@ -248,27 +247,30 @@
   Map<String, Object> toJson() => {
         'name': name,
         'rootUri': rootUri.toString(),
-        'packageUri': packageUri?.toString(),
-        'languageVersion': languageVersion,
+        if (packageUri != null) 'packageUri': packageUri?.toString(),
+        if (languageVersion != null) 'languageVersion': languageVersion,
       }..addAll(additionalProperties ?? {});
 }
 
 /// Extract the _language version_ from an SDK constraint from `pubspec.yaml`.
+///
+/// This returns `null` if there is no language version.
 String extractLanguageVersion(VersionConstraint c) {
   Version minVersion;
   if (c == null || c.isEmpty) {
-    // If we have no language version, we use the version of the current
-    // SDK processing the 'pubspec.yaml' file.
-    minVersion = sdk.version;
+    return null;
   } else if (c is Version) {
     minVersion = c;
   } else if (c is VersionRange) {
-    minVersion = c.min ?? sdk.version;
+    minVersion = c.min;
   } else if (c is VersionUnion) {
     // `ranges` is non-empty and sorted.
-    minVersion = c.ranges.first.min ?? sdk.version;
+    minVersion = c.ranges.first.min;
   } else {
     throw ArgumentError('Unknown VersionConstraint type $c.');
   }
+  if (minVersion == null) {
+    return null;
+  }
   return '${minVersion.major}.${minVersion.minor}';
 }
diff --git a/test/descriptor.dart b/test/descriptor.dart
index 47438da..6a5c1a0 100644
--- a/test/descriptor.dart
+++ b/test/descriptor.dart
@@ -188,8 +188,6 @@
 
 /// Create a [PackageConfigEntry] which assumes package with [name] is either
 /// a cached package with given [version] or a path dependency at given [path].
-///
-/// If not given [languageVersion] will be inferred from current SDK version.
 PackageConfigEntry packageConfigEntry({
   @required String name,
   String version,
@@ -214,7 +212,7 @@
     name: name,
     rootUri: rootUri,
     packageUri: Uri(path: 'lib/'),
-    languageVersion: languageVersion ?? '0.1', // from '0.1.2+3'
+    languageVersion: languageVersion,
   );
 }
 
diff --git a/test/package_config_file_test.dart b/test/package_config_file_test.dart
index b579c21..ccc88c9 100644
--- a/test/package_config_file_test.dart
+++ b/test/package_config_file_test.dart
@@ -206,5 +206,47 @@
         ]),
       ]).validate();
     });
+
+    test('package_config.json has no default language version', () async {
+      await servePackages((builder) {
+        builder.serve(
+          'foo',
+          '1.2.3',
+          pubspec: {
+            'environment': {
+              'sdk': '>=0.0.1 <=0.2.2+2', // tests runs with '0.1.2+3'
+            },
+          },
+          contents: [d.dir('lib', [])],
+        );
+      });
+
+      await d.dir(appPath, [
+        d.pubspec({
+          'name': 'myapp',
+          'dependencies': {
+            'foo': '^1.2.3',
+          },
+        }),
+        d.dir('lib')
+      ]).create();
+
+      await pubCommand(command);
+
+      await d.dir(appPath, [
+        d.packageConfigFile([
+          d.packageConfigEntry(
+            name: 'foo',
+            version: '1.2.3',
+            languageVersion: '0.0',
+          ),
+          d.packageConfigEntry(
+            name: 'myapp',
+            path: '.',
+            languageVersion: null,
+          ),
+        ]),
+      ]).validate();
+    });
   });
 }