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