Allow publishing packages with SDK dependencies on Flutter. (#1562)

Fix #1560.
diff --git a/lib/src/validator/dependency.dart b/lib/src/validator/dependency.dart
index e2f6c67..269a40f 100644
--- a/lib/src/validator/dependency.dart
+++ b/lib/src/validator/dependency.dart
@@ -12,6 +12,7 @@
 import '../package.dart';
 import '../source/hosted.dart';
 import '../source/path.dart';
+import '../source/sdk.dart';
 import '../validator.dart';
 
 /// The range of all pub versions that don't support `^` version constraints.
@@ -41,7 +42,9 @@
 
     for (var dependency in entrypoint.root.pubspec.dependencies) {
       var constraint = dependency.constraint;
-      if (dependency.source is! HostedSource) {
+      if (dependency.name == "flutter") {
+        _warnAboutFlutterSdk(dependency);
+      } else if (dependency.source is! HostedSource) {
         await _warnAboutSource(dependency);
       } else if (constraint.isAny) {
         _warnAboutNoConstraint(dependency);
@@ -65,6 +68,20 @@
     }
   }
 
+  /// Warn about improper dependencies on Flutter.
+  void _warnAboutFlutterSdk(PackageDep dep) {
+    if (dep.source is SdkSource) return;
+
+    errors.add('Don\'t depend on "${dep.name}" from the ${dep.source} '
+        'source. Use the SDK source instead. For example:\n'
+        '\n'
+        'dependencies:\n'
+        '  ${dep.name}:\n'
+        '    sdk: ${dep.constraint}\n'
+        '\n'
+        'The Flutter SDK is downloaded and managed outside of pub.');
+  }
+
   /// Warn that dependencies should use the hosted source.
   Future _warnAboutSource(PackageDep dep) async {
     List<Version> versions;
diff --git a/test/validator/dependency_test.dart b/test/validator/dependency_test.dart
index f66a1e2..c5292a9 100644
--- a/test/validator/dependency_test.dart
+++ b/test/validator/dependency_test.dart
@@ -72,6 +72,16 @@
       ]).create();
       expectNoValidationError(dependency);
     });
+
+    integration('depends on Flutter from an SDK source', () {
+      d.dir(appPath, [
+        d.libPubspec("test_pkg", "1.0.0", deps: {
+          "flutter": {"sdk": ">=1.2.3 <2.0.0"}
+        })
+      ]).create();
+
+      expectNoValidationError(dependency);
+    });
   });
 
   group('should consider a package invalid if it', () {
@@ -418,5 +428,13 @@
         expectDependencyValidationError('  foo: ">=1.2.3 <2.0.0"');
       });
     });
+
+    integration('depends on Flutter from a non-SDK source', () {
+      d.dir(appPath, [
+        d.libPubspec("test_pkg", "1.0.0", deps: {"flutter": ">=1.2.3 <2.0.0"})
+      ]).create();
+
+      expectDependencyValidationError('sdk: >=1.2.3 <2.0.0');
+    });
   });
 }