Skip to content

Commit 4fcef04

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Deprecate TypeProvider.iterableType/streamType
[email protected] Change-Id: Iab8038cf0ed413de7c05da4f69015c1d1309aa35 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/117684 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 74af5f3 commit 4fcef04

File tree

11 files changed

+90
-76
lines changed

11 files changed

+90
-76
lines changed

pkg/analyzer/lib/src/generated/error_verifier.dart

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2725,9 +2725,6 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
27252725
} else if (parent is ForElement) {
27262726
awaitKeyword = parent.awaitKeyword;
27272727
}
2728-
DartType loopType = awaitKeyword != null
2729-
? _typeProvider.streamType
2730-
: _typeProvider.iterableType;
27312728

27322729
// Use an explicit string instead of [loopType] to remove the "<E>".
27332730
String loopTypeName = awaitKeyword != null ? "Stream" : "Iterable";
@@ -2736,13 +2733,23 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
27362733
// is assignable to the variable's type.
27372734
// TODO(rnystrom): Move this into mostSpecificTypeArgument()?
27382735
iterableType = iterableType.resolveToBound(_typeProvider.objectType);
2739-
DartType bestIterableType =
2740-
_typeSystem.mostSpecificTypeArgument(iterableType, loopType);
2736+
2737+
ClassElement sequenceElement = awaitKeyword != null
2738+
? _typeProvider.streamElement
2739+
: _typeProvider.iterableElement;
2740+
2741+
DartType bestIterableType;
2742+
if (iterableType is InterfaceTypeImpl) {
2743+
var sequenceType = iterableType.asInstanceOf(sequenceElement);
2744+
if (sequenceType != null) {
2745+
bestIterableType = sequenceType.typeArguments[0];
2746+
}
2747+
}
27412748

27422749
// Allow it to be a supertype of Iterable<T> (basically just Object) and do
27432750
// an implicit downcast to Iterable<dynamic>.
27442751
if (bestIterableType == null) {
2745-
if (_typeSystem.isSubtypeOf(loopType, iterableType)) {
2752+
if (iterableType == _typeProvider.objectType) {
27462753
bestIterableType = DynamicTypeImpl.instance;
27472754
}
27482755
}
@@ -5323,11 +5330,9 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
53235330
if (isYieldEach) {
53245331
impliedReturnType = staticYieldedType;
53255332
} else if (_enclosingFunction.isAsynchronous) {
5326-
impliedReturnType =
5327-
_typeProvider.streamType.instantiate(<DartType>[staticYieldedType]);
5333+
impliedReturnType = _typeProvider.streamType2(staticYieldedType);
53285334
} else {
5329-
impliedReturnType =
5330-
_typeProvider.iterableType.instantiate(<DartType>[staticYieldedType]);
5335+
impliedReturnType = _typeProvider.iterableType2(staticYieldedType);
53315336
}
53325337
if (!_checkForAssignableExpressionAtType(yieldExpression, impliedReturnType,
53335338
declaredReturnType, StaticTypeWarningCode.YIELD_OF_INVALID_TYPE)) {

pkg/analyzer/lib/src/generated/resolver.dart

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3868,9 +3868,9 @@ class ResolverVisitor extends ScopedVisitor {
38683868

38693869
if (valueType != null) {
38703870
InterfaceType targetType = (node.awaitKeyword == null)
3871-
? typeProvider.iterableType
3872-
: typeProvider.streamType;
3873-
InferenceContext.setType(iterable, targetType.instantiate([valueType]));
3871+
? typeProvider.iterableType2(valueType)
3872+
: typeProvider.streamType2(valueType);
3873+
InferenceContext.setType(iterable, targetType);
38743874
}
38753875
//
38763876
// We visit the iterator before the loop variable because the loop
@@ -3944,9 +3944,9 @@ class ResolverVisitor extends ScopedVisitor {
39443944
}
39453945
if (valueType != null) {
39463946
InterfaceType targetType = (node.awaitKeyword == null)
3947-
? typeProvider.iterableType
3948-
: typeProvider.streamType;
3949-
InferenceContext.setType(iterable, targetType.instantiate([valueType]));
3947+
? typeProvider.iterableType2(valueType)
3948+
: typeProvider.streamType2(valueType);
3949+
InferenceContext.setType(iterable, targetType);
39503950
}
39513951
//
39523952
// We visit the iterator before the loop variable because the loop variable
@@ -4172,8 +4172,7 @@ class ResolverVisitor extends ScopedVisitor {
41724172
}
41734173
if (listType != null) {
41744174
DartType elementType = listType.typeArguments[0];
4175-
DartType iterableType =
4176-
typeProvider.iterableType.instantiate([elementType]);
4175+
DartType iterableType = typeProvider.iterableType2(elementType);
41774176
_pushCollectionTypesDownToAll(node.elements,
41784177
elementType: elementType, iterableType: iterableType);
41794178
InferenceContext.setType(node, listType);
@@ -4362,8 +4361,7 @@ class ResolverVisitor extends ScopedVisitor {
43624361
List<DartType> typeArguments = literalType.typeArguments;
43634362
if (typeArguments.length == 1) {
43644363
DartType elementType = literalType.typeArguments[0];
4365-
DartType iterableType =
4366-
typeProvider.iterableType.instantiate([elementType]);
4364+
DartType iterableType = typeProvider.iterableType2(elementType);
43674365
_pushCollectionTypesDownToAll(node.elements,
43684366
elementType: elementType, iterableType: iterableType);
43694367
if (!_uiAsCodeEnabled &&
@@ -4601,10 +4599,9 @@ class ResolverVisitor extends ScopedVisitor {
46014599
if (node.star != null) {
46024600
// If this is a yield*, then we wrap the element return type
46034601
// If it's synchronous, we expect Iterable<T>, otherwise Stream<T>
4604-
InterfaceType wrapperType = _enclosingFunction.isSynchronous
4605-
? typeProvider.iterableType
4606-
: typeProvider.streamType;
4607-
type = wrapperType.instantiate(<DartType>[type]);
4602+
type = _enclosingFunction.isSynchronous
4603+
? typeProvider.iterableType2(type)
4604+
: typeProvider.streamType2(type);
46084605
}
46094606
InferenceContext.setType(e, type);
46104607
}
@@ -4615,12 +4612,12 @@ class ResolverVisitor extends ScopedVisitor {
46154612
if (node.star != null) {
46164613
// If this is a yield*, then we unwrap the element return type
46174614
// If it's synchronous, we expect Iterable<T>, otherwise Stream<T>
4618-
InterfaceType wrapperType = _enclosingFunction.isSynchronous
4619-
? typeProvider.iterableType
4620-
: typeProvider.streamType;
46214615
if (type is InterfaceType) {
4616+
ClassElement wrapperElement = _enclosingFunction.isSynchronous
4617+
? typeProvider.iterableElement
4618+
: typeProvider.streamElement;
46224619
var asInstanceType =
4623-
(type as InterfaceTypeImpl).asInstanceOf(wrapperType.element);
4620+
(type as InterfaceTypeImpl).asInstanceOf(wrapperElement);
46244621
if (asInstanceType != null) {
46254622
type = asInstanceType.typeArguments[0];
46264623
}
@@ -4647,13 +4644,19 @@ class ResolverVisitor extends ScopedVisitor {
46474644
if (isGenerator) {
46484645
// If it's sync* we expect Iterable<T>
46494646
// If it's async* we expect Stream<T>
4650-
InterfaceType rawType = isAsynchronous
4651-
? typeProvider.streamType
4652-
: typeProvider.iterableType;
46534647
// Match the types to instantiate the type arguments if possible
46544648
List<DartType> targs = declaredType.typeArguments;
4655-
if (targs.length == 1 && rawType.instantiate(targs) == declaredType) {
4656-
return targs[0];
4649+
if (targs.length == 1) {
4650+
var arg = targs[0];
4651+
if (isAsynchronous) {
4652+
if (typeProvider.streamType2(arg) == declaredType) {
4653+
return arg;
4654+
}
4655+
} else {
4656+
if (typeProvider.iterableType2(arg) == declaredType) {
4657+
return arg;
4658+
}
4659+
}
46574660
}
46584661
}
46594662
// async functions expect `Future<T> | T`
@@ -6699,6 +6702,7 @@ abstract class TypeProvider {
66996702
InterfaceType get iterableObjectType;
67006703

67016704
/// Return the type representing the built-in type 'Iterable'.
6705+
@Deprecated('Use iterableType2() instead.')
67026706
InterfaceType get iterableType;
67036707

67046708
/// Return the element representing the built-in class 'List'.
@@ -6752,6 +6756,7 @@ abstract class TypeProvider {
67526756
ClassElement get streamElement;
67536757

67546758
/// Return the type representing the built-in type 'Stream'.
6759+
@Deprecated('Use streamType2() instead.')
67556760
InterfaceType get streamType;
67566761

67576762
/// Return the type representing the built-in type 'String'.

pkg/analyzer/lib/src/generated/static_type_analyzer.dart

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,7 +1308,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<void> {
13081308
if (_typeSystem.isSubtypeOf(
13091309
expressionType, _typeProvider.iterableObjectType)) {
13101310
InterfaceType iterableType = (expressionType as InterfaceTypeImpl)
1311-
.asInstanceOf(_typeProvider.iterableType.element);
1311+
.asInstanceOf(_typeProvider.iterableElement);
13121312
return iterableType.typeArguments[0];
13131313
}
13141314
} else if (expressionType.isDynamic) {
@@ -1355,10 +1355,10 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<void> {
13551355
*/
13561356
DartType _computeReturnTypeOfFunction(FunctionBody body, DartType type) {
13571357
if (body.isGenerator) {
1358-
InterfaceType genericType = body.isAsynchronous
1359-
? _typeProvider.streamType
1360-
: _typeProvider.iterableType;
1361-
return _nonNullable(genericType.instantiate(<DartType>[type]));
1358+
InterfaceType generatedType = body.isAsynchronous
1359+
? _typeProvider.streamType2(type)
1360+
: _typeProvider.iterableType2(type);
1361+
return _nonNullable(generatedType);
13621362
} else if (body.isAsynchronous) {
13631363
if (type.isDartAsyncFutureOr) {
13641364
type = (type as InterfaceType).typeArguments[0];
@@ -1561,7 +1561,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<void> {
15611561
if (_typeSystem.isSubtypeOf(
15621562
expressionType, _typeProvider.iterableObjectType)) {
15631563
InterfaceType iterableType = (expressionType as InterfaceTypeImpl)
1564-
.asInstanceOf(_typeProvider.iterableType.element);
1564+
.asInstanceOf(_typeProvider.iterableElement);
15651565
return _InferredCollectionElementTypeInformation(
15661566
elementType: iterableType.typeArguments[0],
15671567
keyType: null,
@@ -1625,8 +1625,8 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<void> {
16251625
iterableType = iterableType.resolveToBound(_typeProvider.objectType);
16261626

16271627
ClassElement iteratedElement = (awaitKeyword == null)
1628-
? _typeProvider.iterableType.element
1629-
: _typeProvider.streamType.element;
1628+
? _typeProvider.iterableElement
1629+
: _typeProvider.streamElement;
16301630

16311631
InterfaceType iteratedType = iterableType is InterfaceTypeImpl
16321632
? iterableType.asInstanceOf(iteratedElement)

pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ class SdkConstraintVerifier extends RecursiveAstVisitor<void> {
247247
Element element = node.staticElement;
248248
if (checkFutureAndStream &&
249249
(element == _typeProvider.futureElement ||
250-
element == _typeProvider.streamType.element)) {
250+
element == _typeProvider.streamElement)) {
251251
for (LibraryElement importedLibrary
252252
in _containingLibrary.importedLibraries) {
253253
if (!importedLibrary.isDartCore) {

pkg/analyzer/lib/src/task/strong/checker.dart

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import 'package:analyzer/dart/ast/token.dart' show TokenType;
1212
import 'package:analyzer/dart/ast/token.dart';
1313
import 'package:analyzer/dart/ast/visitor.dart';
1414
import 'package:analyzer/dart/element/element.dart';
15+
import 'package:analyzer/dart/element/nullability_suffix.dart';
1516
import 'package:analyzer/dart/element/type.dart';
1617
import 'package:analyzer/error/error.dart';
1718
import 'package:analyzer/error/listener.dart';
@@ -139,6 +140,14 @@ class CodeChecker extends RecursiveAstVisitor {
139140

140141
bool get failure => _failure;
141142

143+
NullabilitySuffix get _noneOrStarSuffix {
144+
return _nonNullableEnabled
145+
? NullabilitySuffix.none
146+
: NullabilitySuffix.star;
147+
}
148+
149+
bool get _nonNullableEnabled => _featureSet.isEnabled(Feature.non_nullable);
150+
142151
void checkArgument(Expression arg, DartType expectedType) {
143152
// Preserve named argument structure, so their immediate parent is the
144153
// method invocation.
@@ -184,13 +193,12 @@ class CodeChecker extends RecursiveAstVisitor {
184193
} else if (element is SpreadElement) {
185194
// Spread expression may be dynamic in which case it's implicitly downcast
186195
// to Iterable<dynamic>
187-
DartType expressionCastType =
188-
typeProvider.iterableType.instantiate([DynamicTypeImpl.instance]);
196+
DartType expressionCastType = typeProvider.iterableDynamicType;
189197
checkAssignment(element.expression, expressionCastType);
190198

191199
var exprType = element.expression.staticType;
192200
var asIterableType = exprType is InterfaceTypeImpl
193-
? exprType.asInstanceOf(typeProvider.iterableType.element)
201+
? exprType.asInstanceOf(typeProvider.iterableElement)
194202
: null;
195203
var elementType =
196204
asIterableType == null ? null : asIterableType.typeArguments[0];
@@ -350,6 +358,7 @@ class CodeChecker extends RecursiveAstVisitor {
350358
node.visitChildren(this);
351359
}
352360

361+
// Check invocations
353362
/// Check constructor declaration to ensure correct super call placement.
354363
@override
355364
void visitConstructorDeclaration(ConstructorDeclaration node) {
@@ -373,7 +382,6 @@ class CodeChecker extends RecursiveAstVisitor {
373382
node.visitChildren(this);
374383
}
375384

376-
// Check invocations
377385
@override
378386
void visitDefaultFormalParameter(DefaultFormalParameter node) {
379387
// Check that defaults have the proper subtype.
@@ -997,11 +1005,11 @@ class CodeChecker extends RecursiveAstVisitor {
9971005

9981006
var type = functionType.returnType;
9991007

1000-
InterfaceType expectedType = null;
1008+
ClassElement expectedElement = null;
10011009
if (body.isAsynchronous) {
10021010
if (body.isGenerator) {
10031011
// Stream<T> -> T
1004-
expectedType = typeProvider.streamType;
1012+
expectedElement = typeProvider.streamElement;
10051013
} else {
10061014
// Future<T> -> FutureOr<T>
10071015
var typeArg = (type.element == typeProvider.futureElement)
@@ -1012,7 +1020,7 @@ class CodeChecker extends RecursiveAstVisitor {
10121020
} else {
10131021
if (body.isGenerator) {
10141022
// Iterable<T> -> T
1015-
expectedType = typeProvider.iterableType;
1023+
expectedElement = typeProvider.iterableElement;
10161024
} else {
10171025
// T -> T
10181026
return type;
@@ -1021,7 +1029,10 @@ class CodeChecker extends RecursiveAstVisitor {
10211029
if (yieldStar) {
10221030
if (type.isDynamic) {
10231031
// Ensure it's at least a Stream / Iterable.
1024-
return expectedType.instantiate([typeProvider.dynamicType]);
1032+
return expectedElement.instantiate(
1033+
typeArguments: [typeProvider.dynamicType],
1034+
nullabilitySuffix: _noneOrStarSuffix,
1035+
);
10251036
} else {
10261037
// Analyzer will provide a separate error if expected type
10271038
// is not compatible with type.
@@ -1030,7 +1041,7 @@ class CodeChecker extends RecursiveAstVisitor {
10301041
}
10311042
if (type.isDynamic) {
10321043
return type;
1033-
} else if (type is InterfaceType && type.element == expectedType.element) {
1044+
} else if (type is InterfaceType && type.element == expectedElement) {
10341045
return type.typeArguments[0];
10351046
} else {
10361047
// Malformed type - fallback on analyzer error.
@@ -1353,19 +1364,20 @@ class CodeChecker extends RecursiveAstVisitor {
13531364
'Unexpected parent of ForEachParts: ${parent.runtimeType}');
13541365
}
13551366
// Find the element type of the sequence.
1356-
var sequenceInterface = awaitKeyword != null
1357-
? typeProvider.streamType
1358-
: typeProvider.iterableType;
1367+
var sequenceElement = awaitKeyword != null
1368+
? typeProvider.streamElement
1369+
: typeProvider.iterableElement;
13591370
var iterableType = _getExpressionType(node.iterable);
1360-
var elementType =
1361-
_getInstanceTypeArgument(iterableType, sequenceInterface.element);
1371+
var elementType = _getInstanceTypeArgument(iterableType, sequenceElement);
13621372

13631373
// If the sequence is not an Iterable (or Stream for await for) but is a
13641374
// supertype of it, do an implicit downcast to Iterable<dynamic>. Then
13651375
// we'll do a separate cast of the dynamic element to the variable's type.
13661376
if (elementType == null) {
1367-
var sequenceType =
1368-
sequenceInterface.instantiate([DynamicTypeImpl.instance]);
1377+
var sequenceType = sequenceElement.instantiate(
1378+
typeArguments: [typeProvider.dynamicType],
1379+
nullabilitySuffix: _noneOrStarSuffix,
1380+
);
13691381

13701382
if (rules.isSubtypeOf(sequenceType, iterableType)) {
13711383
_recordImplicitCast(node.iterable, sequenceType, from: iterableType);

pkg/analyzer/test/generated/strong_mode_test.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,7 +1134,6 @@ class StrongModeLocalInferenceTest extends ResolverTestCase {
11341134
AsserterBuilder<DartType, DartType> _isType;
11351135

11361136
AsserterBuilder<Element, DartType> _hasElement;
1137-
AsserterBuilder<DartType, DartType> _hasElementOf;
11381137

11391138
@override
11401139
Future<TestAnalysisResult> computeAnalysisResult(Source source) async {
@@ -1153,15 +1152,14 @@ class StrongModeLocalInferenceTest extends ResolverTestCase {
11531152
_isListOf = _assertions.isListOf;
11541153
_isMapOf = _assertions.isMapOf;
11551154
_isFunction2Of = _assertions.isFunction2Of;
1156-
_hasElementOf = _assertions.hasElementOf;
11571155
_isFutureOf = _isInstantiationOf(_hasElement(typeProvider.futureElement));
11581156
_isFutureOrOf =
11591157
_isInstantiationOf(_hasElement(typeProvider.futureOrElement));
11601158
_isFutureOfDynamic = _isFutureOf([_isDynamic]);
11611159
_isFutureOfInt = _isFutureOf([_isInt]);
11621160
_isFutureOfNull = _isFutureOf([_isNull]);
11631161
_isFutureOrOfInt = _isFutureOrOf([_isInt]);
1164-
_isStreamOf = _isInstantiationOf(_hasElementOf(typeProvider.streamType));
1162+
_isStreamOf = _isInstantiationOf(_hasElement(typeProvider.streamElement));
11651163
}
11661164
return result;
11671165
}

pkg/analyzer/test/generated/type_system_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ abstract class AbstractTypeSystemTest {
8383
}
8484

8585
DartType iterableType(DartType T) {
86-
var iterableElement = typeProvider.iterableType.element;
86+
var iterableElement = typeProvider.iterableElement;
8787
return _interfaceType(iterableElement, typeArguments: [T]);
8888
}
8989

0 commit comments

Comments
 (0)