Migrate Hosted and Sdk dependency to use generated fromJson

Handle HostedDependency with explicit version field
diff --git a/pkgs/pubspec_parse/lib/src/dependency.dart b/pkgs/pubspec_parse/lib/src/dependency.dart
index 5260239..8488fe1 100644
--- a/pkgs/pubspec_parse/lib/src/dependency.dart
+++ b/pkgs/pubspec_parse/lib/src/dependency.dart
@@ -22,11 +22,14 @@
 
 /// Returns `null` if the data could not be parsed.
 Dependency _fromJson(dynamic data) {
-  if (data == null) {
-    return new HostedDependency(VersionConstraint.any);
-  } else if (data is String) {
-    return new HostedDependency(new VersionConstraint.parse(data));
-  } else if (data is Map) {
+  var value =
+      SdkDependency.tryFromData(data) ?? HostedDependency.tryFromData(data);
+
+  if (value != null) {
+    return value;
+  }
+
+  if (data is Map) {
     try {
       return _fromMap(data);
     } on ArgumentError catch (e) {
@@ -45,10 +48,6 @@
         data, null, 'Dependency', 'Must provide at least one key.');
   }
 
-  if (data.containsKey('sdk')) {
-    return new SdkDependency.fromData(data);
-  }
-
   if (data.entries.length > 1) {
     throw new CheckedFromJsonException(data, data.keys.skip(1).first as String,
         'Dependency', 'Expected only one key.');
@@ -81,22 +80,23 @@
   String toString() => '$runtimeType: $_info';
 }
 
+@JsonSerializable(createToJson: false)
 class SdkDependency extends Dependency {
-  final String name;
+  final String sdk;
+  @JsonKey(fromJson: _constraintFromString)
   final VersionConstraint version;
 
-  SdkDependency(this.name, {this.version}) : super._();
+  SdkDependency(this.sdk, {this.version}) : super._();
 
-  factory SdkDependency.fromData(Map data) {
-    VersionConstraint version;
-    if (data.containsKey('version')) {
-      version = new VersionConstraint.parse(data['version'] as String);
+  static SdkDependency tryFromData(Object data) {
+    if (data is Map && data.containsKey('sdk')) {
+      return _$SdkDependencyFromJson(data);
     }
-    return new SdkDependency(data['sdk'] as String, version: version);
+    return null;
   }
 
   @override
-  String get _info => name;
+  String get _info => sdk;
 }
 
 @JsonSerializable(createToJson: false)
@@ -152,12 +152,32 @@
   String get _info => 'path@$path';
 }
 
-// TODO: support explicit host?
+@JsonSerializable(createToJson: false)
 class HostedDependency extends Dependency {
-  final VersionConstraint constraint;
+  // TODO: support explicit host
 
-  HostedDependency(this.constraint) : super._();
+  @JsonKey(fromJson: _constraintFromString)
+  final VersionConstraint version;
+
+  HostedDependency({VersionConstraint version})
+      : this.version = version ?? VersionConstraint.any,
+        super._();
+
+  static HostedDependency tryFromData(Object data) {
+    if (data == null || data is String) {
+      data = {'version': data};
+    }
+
+    if (data is Map && data.containsKey('version')) {
+      return _$HostedDependencyFromJson(data);
+    }
+
+    return null;
+  }
 
   @override
-  String get _info => constraint.toString();
+  String get _info => version.toString();
 }
+
+VersionConstraint _constraintFromString(String input) =>
+    new VersionConstraint.parse(input);
diff --git a/pkgs/pubspec_parse/lib/src/dependency.g.dart b/pkgs/pubspec_parse/lib/src/dependency.g.dart
index cdb06bb..7a7d427 100644
--- a/pkgs/pubspec_parse/lib/src/dependency.g.dart
+++ b/pkgs/pubspec_parse/lib/src/dependency.g.dart
@@ -10,6 +10,13 @@
 // Generator: JsonSerializableGenerator
 // **************************************************************************
 
+SdkDependency _$SdkDependencyFromJson(Map json) => $checkedNew(
+    'SdkDependency',
+    json,
+    () => new SdkDependency($checkedConvert(json, 'sdk', (v) => v as String),
+        version: $checkedConvert(json, 'version',
+            (v) => v == null ? null : _constraintFromString(v as String))));
+
 GitDependency _$GitDependencyFromJson(Map json) => $checkedNew(
     'GitDependency',
     json,
@@ -18,3 +25,10 @@
             json, 'url', (v) => v == null ? null : _parseUri(v as String)),
         $checkedConvert(json, 'ref', (v) => v as String),
         $checkedConvert(json, 'path', (v) => v as String)));
+
+HostedDependency _$HostedDependencyFromJson(Map json) => $checkedNew(
+    'HostedDependency',
+    json,
+    () => new HostedDependency(
+        version: $checkedConvert(json, 'version',
+            (v) => v == null ? null : _constraintFromString(v as String))));
diff --git a/pkgs/pubspec_parse/lib/src/pubspec.dart b/pkgs/pubspec_parse/lib/src/pubspec.dart
index 3c9c045..163f3f9 100644
--- a/pkgs/pubspec_parse/lib/src/pubspec.dart
+++ b/pkgs/pubspec_parse/lib/src/pubspec.dart
@@ -12,6 +12,9 @@
 
 @JsonSerializable(createToJson: false)
 class Pubspec {
+  // TODO: executables
+  // TODO: publish_to
+
   final String name;
 
   @JsonKey(fromJson: _versionFromString)
diff --git a/pkgs/pubspec_parse/test/dependency_test.dart b/pkgs/pubspec_parse/test/dependency_test.dart
index 8ede482..5c86721 100644
--- a/pkgs/pubspec_parse/test/dependency_test.dart
+++ b/pkgs/pubspec_parse/test/dependency_test.dart
@@ -8,15 +8,27 @@
 import 'test_utils.dart';
 
 void main() {
-  test('HostedDepedency', () {
+  test('HostedDepedency - null', () {
+    var dep = _dependency<HostedDependency>(null);
+    expect(dep.version.toString(), 'any');
+    expect(dep.toString(), 'HostedDependency: any');
+  });
+
+  test('HostedDepedency - string', () {
     var dep = _dependency<HostedDependency>('^1.0.0');
-    expect(dep.constraint.toString(), '^1.0.0');
+    expect(dep.version.toString(), '^1.0.0');
+    expect(dep.toString(), 'HostedDependency: ^1.0.0');
+  });
+
+  test('HostedDepedency - map', () {
+    var dep = _dependency<HostedDependency>({'version': '^1.0.0'});
+    expect(dep.version.toString(), '^1.0.0');
     expect(dep.toString(), 'HostedDependency: ^1.0.0');
   });
 
   test('SdkDependency without version', () {
     var dep = _dependency<SdkDependency>({'sdk': 'flutter'});
-    expect(dep.name, 'flutter');
+    expect(dep.sdk, 'flutter');
     expect(dep.version, isNull);
     expect(dep.toString(), 'SdkDependency: flutter');
   });
@@ -24,7 +36,7 @@
   test('SdkDependency with version', () {
     var dep = _dependency<SdkDependency>(
         {'sdk': 'flutter', 'version': '>=1.2.3 <2.0.0'});
-    expect(dep.name, 'flutter');
+    expect(dep.sdk, 'flutter');
     expect(dep.version.toString(), '>=1.2.3 <2.0.0');
     expect(dep.toString(), 'SdkDependency: flutter');
   });
@@ -47,12 +59,6 @@
     expect(dep.toString(), 'GitDependency: url@url');
   });
 
-  test('HostedDepedency', () {
-    var dep = _dependency<HostedDependency>('^1.0.0');
-    expect(dep.constraint.toString(), '^1.0.0');
-    expect(dep.toString(), 'HostedDependency: ^1.0.0');
-  });
-
   test('PathDependency', () {
     var dep = _dependency<PathDependency>({'path': '../path'});
     expect(dep.path, '../path');