Version 1.22.0-dev.10.2

Cherry-pick 139d5d15dba2a9d9e23e78ce68ba19f9a05e9e29 to dev
Cherry-pick f661493fd273182b7a9afdb8b4e41c1e7d0e911d to dev
Cherry-pick a6138dad2aeb247d6c002c43466f7f10afdbcf53 to dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b59769d..45e8aee 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -71,6 +71,11 @@
   * Make `pub run` run executables in spawned isolates. This lets them handle
     signals and use standard IO reliably.
 
+  * Fix source-maps produced by dart2js when running in `pub serve`: URL
+    references to assets from packages match the location where `pub serve`
+    serves them (`packages/package_name/` instead of
+    `../packages/package_name/`).
+
 ### Infrastructure changes
 
   * The SDK now uses GN rather than gyp to generate its build files, which will
diff --git a/DEPS b/DEPS
index a9c1ea3..bdfb97e 100644
--- a/DEPS
+++ b/DEPS
@@ -92,7 +92,7 @@
   "ply_rev": "@604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "@1.2.4",
   "protobuf_tag": "@0.5.3",
-  "pub_rev": "@9000daf329445d06e2404d4bb9020cf742b7308a",
+  "pub_rev": "@53327f4a7ca2ddd20a40f6a94db61ac136371b03",
   "pub_semver_tag": "@1.3.0",
   "quiver_tag": "@0.22.0",
   "resource_rev":"@a49101ba2deb29c728acba6fb86000a8f730f4b1",
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index ffef5db..26c1a02 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -5239,9 +5239,13 @@
     if (node is TypeName) {
       if (node.typeArguments == null) {
         DartType type = node.type;
-        if (type is InterfaceType && type.element.typeParameters.isNotEmpty) {
-          _errorReporter.reportErrorForNode(
-              StrongModeCode.NOT_INSTANTIATED_BOUND, node, [type]);
+        if (type is ParameterizedType) {
+          Element element = type.element;
+          if (element is TypeParameterizedElement &&
+              element.typeParameters.any((p) => p.bound != null)) {
+            _errorReporter.reportErrorForNode(
+                StrongModeCode.NOT_INSTANTIATED_BOUND, node, [type]);
+          }
         }
       } else {
         node.typeArguments.arguments.forEach(_checkForNotInstantiatedBound);
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 67c5149..486ddc3 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -4660,6 +4660,9 @@
         var linker = functionElement.compilationUnit.library._linker;
         var typeProvider = linker.typeProvider;
         var typeSystem = linker.typeSystem;
+        if (bodyType.isDartAsyncFutureOr) {
+          bodyType = (bodyType as InterfaceType).typeArguments[0];
+        }
         bodyType = typeProvider.futureType
             .instantiate([bodyType.flattenFutures(typeSystem)]);
       }
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index a90fe14..364bcf5 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -2717,7 +2717,7 @@
 
 class B<T extends num> {}
 
-class C<S extends int, T extends B<S>, U extends B> {}
+class C<S extends int, T extends B<S>, U extends A> {}
 
 void test() {
 //
@@ -2729,13 +2729,13 @@
   var cc = new C();
 }
 ''';
-    await resolveTestUnit(code, noErrors: false);
+    await resolveTestUnit(code);
     expectIdentifierType('ai', "A<dynamic>");
     expectIdentifierType('bi', "B<num>");
-    expectIdentifierType('ci', "C<int, B<int>, B<dynamic>>");
+    expectIdentifierType('ci', "C<int, B<int>, A<dynamic>>");
     expectIdentifierType('aa', "A<dynamic>");
     expectIdentifierType('bb', "B<num>");
-    expectIdentifierType('cc', "C<int, B<int>, B<dynamic>>");
+    expectIdentifierType('cc', "C<int, B<int>, A<dynamic>>");
   }
 
   test_instantiateToBounds_class_error_recursion() async {
@@ -2769,6 +2769,28 @@
     expectIdentifierType('c;', 'C<dynamic>');
   }
 
+  test_instantiateToBounds_class_error_typedef() async {
+    String code = r'''
+typedef T F<T>(T x);
+class C<T extends F<T>> {}
+C c;
+''';
+    await resolveTestUnit(code, noErrors: false);
+    assertErrors(testSource, [StrongModeCode.NO_DEFAULT_BOUNDS]);
+    expectIdentifierType('c;', 'C<dynamic>');
+  }
+
+  test_instantiateToBounds_class_ok_implicitDynamic_multi() async {
+    String code = r'''
+class C<T0 extends Map<T1, T2>, T1 extends List, T2 extends int> {}
+C c;
+''';
+    await resolveTestUnit(code);
+    assertNoErrors(testSource);
+    expectIdentifierType(
+        'c;', 'C<Map<List<dynamic>, int>, List<dynamic>, int>');
+  }
+
   test_instantiateToBounds_class_ok_referenceOther_after() async {
     String code = r'''
 class C<T0 extends T1, T1 extends int> {}
@@ -2814,11 +2836,12 @@
 class A<T> {}
 class B<T extends num> {}
 class C<T extends List<int>> {}
-
+class D<T extends A> {}
 void main() {
   A a;
   B b;
   C c;
+  D d;
 }
 ''';
     await resolveTestUnit(code);
@@ -2826,6 +2849,7 @@
     expectIdentifierType('a;', 'A<dynamic>');
     expectIdentifierType('b;', 'B<num>');
     expectIdentifierType('c;', 'C<List<int>>');
+    expectIdentifierType('d;', 'D<A<dynamic>>');
   }
 
   test_instantiateToBounds_method_ok_referenceOther_before() async {
@@ -2858,29 +2882,51 @@
     expectStaticInvokeType('m(null)', '(T) → void');
   }
 
-  test_notInstantiatedBound_direct() async {
+  test_notInstantiatedBound_direct_class_class() async {
     String code = r'''
-class A<T> {}
+class A<T extends int> {}
 class C<T extends A> {}
 ''';
     await resolveTestUnit(code, noErrors: false);
     assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
   }
 
-  test_notInstantiatedBound_indirect() async {
+  test_notInstantiatedBound_direct_class_typedef() async {
+    // Check that if the bound of a class is an uninstantiated typedef
+    // we emit an error
+    String code = r'''
+typedef void F<T extends int>();
+class C<T extends F> {}
+''';
+    await resolveTestUnit(code, noErrors: false);
+    assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
+  }
+
+  test_notInstantiatedBound_direct_typedef_class() async {
+    // Check that if the bound of a typeded is an uninstantiated class
+    // we emit an error
+    String code = r'''
+class C<T extends int> {}
+typedef void F<T extends C>();
+''';
+    await resolveTestUnit(code, noErrors: false);
+    assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
+  }
+
+  test_notInstantiatedBound_indirect_class_class() async {
     String code = r'''
 class A<T> {}
-class B<T> {}
+class B<T extends int> {}
 class C<T extends A<B>> {}
 ''';
     await resolveTestUnit(code, noErrors: false);
     assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
   }
 
-  test_notInstantiatedBound_indirect2() async {
+  test_notInstantiatedBound_indirect_class_class2() async {
     String code = r'''
 class A<K, V> {}
-class B<T> {}
+class B<T extends int> {}
 class C<T extends A<B, B>> {}
 ''';
     await resolveTestUnit(code, noErrors: false);
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 69ae478..c38122e 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -2427,7 +2427,7 @@
   void test_implicitDynamic_type() {
     addFile(r'''
 class C<T> {}
-class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*//*error:NOT_INSTANTIATED_BOUND*/List> {}
+class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*/List> {}
 class M2<T> {}
 class I<T> {}
 class D<T, S> extends /*error:IMPLICIT_DYNAMIC_TYPE*/C
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index 5d5874a..541e75f 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -61,6 +61,24 @@
     expect(f.type.toString(), '() → Future<int>');
   }
 
+  void test_asyncClosureReturnType_futureOr() {
+    var mainUnit = checkFile('''
+import 'dart:async';
+FutureOr<int> futureOrInt = null;
+var f = () => futureOrInt;
+var g = () async => futureOrInt;
+''');
+    var futureOrInt = mainUnit.topLevelVariables[0];
+    expect(futureOrInt.name, 'futureOrInt');
+    expect(futureOrInt.type.toString(), 'FutureOr<int>');
+    var f = mainUnit.topLevelVariables[1];
+    expect(f.name, 'f');
+    expect(f.type.toString(), '() → FutureOr<int>');
+    var g = mainUnit.topLevelVariables[2];
+    expect(g.name, 'g');
+    expect(g.type.toString(), '() → Future<int>');
+  }
+
   void test_blockBodiedLambdas_async_allReturnsAreFutures() {
     if (!mayCheckTypesOfLocals) {
       return;
@@ -1665,6 +1683,19 @@
     expect(x.type.toString(), 'int');
   }
 
+  void test_futureOr_subtyping() {
+    checkFile(r'''
+import 'dart:async';
+void add(int x) {}
+add2(int y) {}
+main() {
+  Future<int> f;
+  var a = f.then(add);
+  var b = f.then(add2);
+}
+    ''');
+  }
+
   void test_futureThen() {
     String build({String declared, String downwards, String upwards}) => '''
 import 'dart:async';
@@ -1855,19 +1886,6 @@
     ''');
   }
 
-  void test_futureOr_subtyping() {
-    checkFile(r'''
-import 'dart:async';
-void add(int x) {}
-add2(int y) {}
-main() {
-  Future<int> f;
-  var a = f.then(add);
-  var b = f.then(add2);
-}
-    ''');
-  }
-
   void test_futureUnion_asyncConditional() {
     String build({String declared, String downwards, String upwards}) => '''
 import 'dart:async';
@@ -4272,7 +4290,7 @@
   void test_instantiateToBounds_generic2_noBound() {
     var unit = checkFile(r'''
 class A<T> {}
-class B<T extends /*error:NOT_INSTANTIATED_BOUND*/A> {}
+class B<T extends A> {}
 B v = null;
 ''');
     expect(unit.topLevelVariables[0].type.toString(), 'B<A<dynamic>>');
diff --git a/tools/VERSION b/tools/VERSION
index 4e9ac1f..4eb30ea 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 22
 PATCH 0
 PRERELEASE 10
-PRERELEASE_PATCH 1
+PRERELEASE_PATCH 2