Skip to content

Commit 1e7250f

Browse files
author
Dart CI
committed
Version 2.11.0-204.0.dev
Merge commit 'af5cde47b57475553ceaa21cb053a913c7482fdc' into 'dev'
2 parents fe566e6 + af5cde4 commit 1e7250f

File tree

5 files changed

+130
-7
lines changed

5 files changed

+130
-7
lines changed

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,14 @@
2323

2424
#### Linter
2525

26-
Updated the Linter to `0.1.120`, which includes:
26+
Updated the Linter to `0.1.121`, which includes:
2727

28+
# 0.1.121
29+
30+
* Performance improvements to `always_use_package_imports`,
31+
`avoid_renaming_method_parameters`, `prefer_relative_imports` and
32+
`public_member_api_docs`.
33+
* (internal): updates to analyzer `0.40.4` APIs
2834
* New lint: `cast_nullable_to_non_nullable`.
2935
* New lint: `null_check_on_nullable_type_parameter`.
3036
* New lint: `tighten_type_of_initializing_formals`.

DEPS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ vars = {
113113
"intl_tag": "0.16.1",
114114
"jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
115115
"json_rpc_2_rev": "8f189db8f0c299187a0e8fa959dba7e9b0254be5",
116-
"linter_tag": "0.1.120",
116+
"linter_tag": "0.1.121",
117117
"logging_rev": "1590ba0b648a51e7eb3895c612e4b72f72623b6f",
118118
"markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
119119
"markdown_rev": "dbeafd47759e7dd0a167602153bb9c49fb5e5fe7",

pkg/analyzer/lib/src/dart/element/least_upper_bound.dart

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -667,10 +667,19 @@ class LeastUpperBoundHelper {
667667
return _functionType(T1, T2);
668668
}
669669

670-
// UP(T Function<...>(...), T2) = Object
671-
// UP(T1, T Function<...>(...)) = Object
672-
if (T1 is FunctionType || T2 is FunctionType) {
673-
return _typeSystem.objectNone;
670+
// UP(T Function<...>(...), T2) = UP(Object, T2)
671+
if (T1 is FunctionType) {
672+
return getLeastUpperBound(_typeSystem.objectNone, T2);
673+
}
674+
675+
// UP(T1, T Function<...>(...)) = UP(T1, Object)
676+
if (T2 is FunctionType) {
677+
return getLeastUpperBound(T1, _typeSystem.objectNone);
678+
}
679+
680+
var futureOrResult = _futureOr(T1, T2);
681+
if (futureOrResult != null) {
682+
return futureOrResult;
674683
}
675684

676685
// UP(T1, T2) = T2 if T1 <: T2
@@ -802,6 +811,56 @@ class LeastUpperBoundHelper {
802811
);
803812
}
804813

814+
DartType _futureOr(DartType T1, DartType T2) {
815+
var T1_futureOr = T1 is InterfaceType && T1.isDartAsyncFutureOr
816+
? T1.typeArguments[0]
817+
: null;
818+
819+
var T1_future = T1 is InterfaceType && T1.isDartAsyncFuture
820+
? T1.typeArguments[0]
821+
: null;
822+
823+
var T2_futureOr = T2 is InterfaceType && T2.isDartAsyncFutureOr
824+
? T2.typeArguments[0]
825+
: null;
826+
827+
var T2_future = T2 is InterfaceType && T2.isDartAsyncFuture
828+
? T2.typeArguments[0]
829+
: null;
830+
831+
// UP(FutureOr<T1>, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
832+
if (T1_futureOr != null && T2_futureOr != null) {
833+
var T3 = getLeastUpperBound(T1_futureOr, T2_futureOr);
834+
return _typeSystem.typeProvider.futureOrType2(T3);
835+
}
836+
837+
// UP(Future<T1>, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
838+
if (T1_future != null && T2_futureOr != null) {
839+
var T3 = getLeastUpperBound(T1_future, T2_futureOr);
840+
return _typeSystem.typeProvider.futureOrType2(T3);
841+
}
842+
843+
// UP(FutureOr<T1>, Future<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
844+
if (T1_futureOr != null && T2_future != null) {
845+
var T3 = getLeastUpperBound(T1_futureOr, T2_future);
846+
return _typeSystem.typeProvider.futureOrType2(T3);
847+
}
848+
849+
// UP(T1, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
850+
if (T2_futureOr != null) {
851+
var T3 = getLeastUpperBound(T1, T2_futureOr);
852+
return _typeSystem.typeProvider.futureOrType2(T3);
853+
}
854+
855+
// UP(FutureOr<T1>, T2) = FutureOr<T3> where T3 = UP(T1, T2)
856+
if (T1_futureOr != null) {
857+
var T3 = getLeastUpperBound(T1_futureOr, T2);
858+
return _typeSystem.typeProvider.futureOrType2(T3);
859+
}
860+
861+
return null;
862+
}
863+
805864
DartType _parameterType(ParameterElement a, ParameterElement b) {
806865
return _typeSystem.getGreatestLowerBound(a.type, b.type);
807866
}

pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2000,6 +2000,20 @@ class UpperBound_FunctionTypes_Test extends _BoundsTestBase {
20002000
);
20012001
}
20022002
}
2003+
2004+
test_unrelated() {
2005+
var T1 = functionTypeNone(returnType: intNone);
2006+
2007+
_checkLeastUpperBound(T1, intNone, objectNone);
2008+
_checkLeastUpperBound(T1, intQuestion, objectQuestion);
2009+
_checkLeastUpperBound(T1, intStar, objectStar);
2010+
2011+
_checkLeastUpperBound(
2012+
T1,
2013+
futureOrNone(functionQuestion),
2014+
objectQuestion,
2015+
);
2016+
}
20032017
}
20042018

20052019
@reflectiveTest
@@ -2594,6 +2608,50 @@ class UpperBoundTest extends _BoundsTestBase {
25942608
);
25952609
}
25962610

2611+
/// UP(Future<T1>, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
2612+
/// UP(FutureOr<T1>, Future<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
2613+
test_futureOr_future() {
2614+
void check(DartType T1, DartType T2, DartType expected) {
2615+
_checkLeastUpperBound(
2616+
futureNone(T1),
2617+
futureOrNone(T2),
2618+
futureOrNone(expected),
2619+
);
2620+
}
2621+
2622+
check(intNone, doubleNone, numNone);
2623+
check(intNone, stringNone, objectNone);
2624+
}
2625+
2626+
/// UP(FutureOr<T1>, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
2627+
test_futureOr_futureOr() {
2628+
void check(DartType T1, DartType T2, DartType expected) {
2629+
_checkLeastUpperBound(
2630+
futureOrNone(T1),
2631+
futureOrNone(T2),
2632+
futureOrNone(expected),
2633+
);
2634+
}
2635+
2636+
check(intNone, doubleNone, numNone);
2637+
check(intNone, stringNone, objectNone);
2638+
}
2639+
2640+
/// UP(T1, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
2641+
/// UP(FutureOr<T1>, T2) = FutureOr<T3> where T3 = UP(T1, T2)
2642+
test_futureOr_other() {
2643+
void check(DartType T1, DartType T2, DartType expected) {
2644+
_checkLeastUpperBound(
2645+
futureOrNone(T1),
2646+
T2,
2647+
futureOrNone(expected),
2648+
);
2649+
}
2650+
2651+
check(intNone, doubleNone, numNone);
2652+
check(intNone, stringNone, objectNone);
2653+
}
2654+
25972655
test_identical() {
25982656
void check(DartType type) {
25992657
_checkLeastUpperBound(type, type, type);

tools/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@ CHANNEL dev
2727
MAJOR 2
2828
MINOR 11
2929
PATCH 0
30-
PRERELEASE 203
30+
PRERELEASE 204
3131
PRERELEASE_PATCH 0

0 commit comments

Comments
 (0)