MigrationResolutionHooks._fixBuilder is not nullable
Change-Id: I23e6c51002624028f6c1f075b20ca831895279f6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/253741
Reviewed-by: Paul Berry <paulberry@google.com>
Auto-Submit: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index 2241e87..e26d9fb 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -321,7 +321,7 @@
class MigrationResolutionHooksImpl
with ResolutionUtils
implements MigrationResolutionHooks {
- FixBuilder? _fixBuilder;
+ late final FixBuilder _fixBuilder;
final Expando<List<CollectionElement>> _collectionElements = Expando();
@@ -340,7 +340,7 @@
final Map<Expression, DartType?> _contextTypes = {};
- TypeProvider get typeProvider => _fixBuilder!.typeProvider;
+ TypeProvider get typeProvider => _fixBuilder.typeProvider;
@override
void freshTypeParameterCreated(TypeParameterElement newTypeParameter,
@@ -352,7 +352,7 @@
@override
List<InterfaceType> getClassInterfaces(AbstractClassElementImpl element) {
return _wrapExceptions(
- _fixBuilder!.unit,
+ _fixBuilder.unit,
() => element.interfacesInternal,
() => [
for (var interface in element.interfacesInternal)
@@ -364,8 +364,8 @@
bool? getConditionalKnownValue(AstNode node) =>
_wrapExceptions(node, () => null, () {
// TODO(paulberry): handle conditional expressions.
- var conditionalDiscard = _fixBuilder!._variables!
- .getConditionalDiscard(_fixBuilder!.source, node);
+ var conditionalDiscard = _fixBuilder._variables!
+ .getConditionalDiscard(_fixBuilder.source, node);
if (conditionalDiscard == null) {
return null;
} else {
@@ -373,12 +373,12 @@
return null;
}
var conditionValue = conditionalDiscard.keepTrue;
- (_fixBuilder!._getChange(node) as NodeChangeForConditional)
+ (_fixBuilder._getChange(node) as NodeChangeForConditional)
..conditionValue = conditionValue
..conditionReason = conditionalDiscard.reason;
// If we're just issuing warnings, instruct the resolver to go ahead
// and visit both branches of the conditional.
- return _fixBuilder!.warnOnWeakCode! ? null : conditionValue;
+ return _fixBuilder.warnOnWeakCode! ? null : conditionValue;
}
});
@@ -401,8 +401,8 @@
@override
FunctionType getExecutableType(ElementImplWithFunctionType element) =>
- _wrapExceptions(_fixBuilder!.unit, () => element.typeInternal, () {
- var type = _fixBuilder!._computeMigratedType(element);
+ _wrapExceptions(_fixBuilder.unit, () => element.typeInternal, () {
+ var type = _fixBuilder._computeMigratedType(element);
Element baseElement = element;
if (baseElement is Member) {
type = baseElement.substitution.substituteType(type);
@@ -413,17 +413,17 @@
@override
DartType getExtendedType(ExtensionElementImpl element) {
return _wrapExceptions(
- _fixBuilder!.unit,
+ _fixBuilder.unit,
() => element.extendedTypeInternal,
- () => _fixBuilder!._variables!.toFinalType(
- _fixBuilder!._variables!.decoratedElementType(element)));
+ () => _fixBuilder._variables!.toFinalType(
+ _fixBuilder._variables!.decoratedElementType(element)));
}
@override
DartType getFieldType(PropertyInducingElementImpl element) =>
- _wrapExceptions(_fixBuilder!.unit, () => element.typeInternal, () {
+ _wrapExceptions(_fixBuilder.unit, () => element.typeInternal, () {
assert(!element.isSynthetic);
- return _fixBuilder!._computeMigratedType(element);
+ return _fixBuilder._computeMigratedType(element);
});
@override
@@ -443,10 +443,10 @@
@override
DartType? getTypeParameterBound(TypeParameterElementImpl element) {
- var decoratedBound = _fixBuilder!._variables!
+ var decoratedBound = _fixBuilder._variables!
.decoratedTypeParameterBound(element, allowNullUnparentedBounds: true);
if (decoratedBound == null) return element.boundInternal;
- var bound = _fixBuilder!._variables!.toFinalType(decoratedBound);
+ var bound = _fixBuilder._variables!.toFinalType(decoratedBound);
if (bound.isDynamic) {
return null;
} else if (bound.isDartCoreObject &&
@@ -459,7 +459,7 @@
@override
DartType getVariableType(VariableElementImpl variable) =>
- _wrapExceptions(_fixBuilder!.unit, () => variable.typeInternal, () {
+ _wrapExceptions(_fixBuilder.unit, () => variable.typeInternal, () {
if (variable.library == null) {
// This is a synthetic variable created during resolution (e.g. a
// parameter of a function type), so the type it currently has is the
@@ -472,10 +472,10 @@
enclosingElement.isSynthetic) {
// This is the parameter of a synthetic getter, so it has the same
// type as the corresponding variable.
- return _fixBuilder!._computeMigratedType(enclosingElement.variable);
+ return _fixBuilder._computeMigratedType(enclosingElement.variable);
}
}
- return _fixBuilder!._computeMigratedType(variable);
+ return _fixBuilder._computeMigratedType(variable);
});
@override
@@ -487,15 +487,14 @@
@override
bool isLibraryNonNullableByDefault(LibraryElementImpl element) {
- return _fixBuilder!._graph.isBeingMigrated(element.source) ||
+ return _fixBuilder._graph.isBeingMigrated(element.source) ||
element.isNonNullableByDefaultInternal;
}
@override
bool isMethodInvocationNullAware(MethodInvocation node) {
return node.isNullAware &&
- (_shouldStayNullAware[node] ??=
- _fixBuilder!._shouldStayNullAware(node));
+ (_shouldStayNullAware[node] ??= _fixBuilder._shouldStayNullAware(node));
}
/// Indicates whether the given [element] is a member of an extension on a
@@ -505,7 +504,7 @@
if (element != null) {
var enclosingElement = element.enclosingElement3;
if (enclosingElement is ExtensionElement) {
- return _fixBuilder!._typeSystem
+ return _fixBuilder._typeSystem
.isPotentiallyNullable(enclosingElement.extendedType);
}
}
@@ -515,8 +514,7 @@
@override
bool isPropertyAccessNullAware(PropertyAccess node) {
return node.isNullAware &&
- (_shouldStayNullAware[node] ??=
- _fixBuilder!._shouldStayNullAware(node));
+ (_shouldStayNullAware[node] ??= _fixBuilder._shouldStayNullAware(node));
}
@override
@@ -555,7 +553,7 @@
var postMigrationType = parameter.type;
if (postMigrationType != type) {
// TODO(paulberry): test field formal parameters.
- _fixBuilder!._addedParameterTypes[parameter] = postMigrationType;
+ _fixBuilder._addedParameterTypes[parameter] = postMigrationType;
return postMigrationType;
}
return type;
@@ -579,13 +577,13 @@
var handler = _PrefixExpressionHandler(node);
_assignmentLikeExpressionHandlers[node] = handler;
handler.handleLValueType(this, node.readType, node.writeType!);
- handler.handleAssignmentRhs(this, _fixBuilder!.typeProvider.intType);
+ handler.handleAssignmentRhs(this, _fixBuilder.typeProvider.intType);
} else if (node is PostfixExpression) {
assert(_isIncrementOrDecrementOperator(node.operator.type));
var handler = _PostfixExpressionHandler(node);
_assignmentLikeExpressionHandlers[node] = handler;
handler.handleLValueType(this, node.readType, node.writeType!);
- handler.handleAssignmentRhs(this, _fixBuilder!.typeProvider.intType);
+ handler.handleAssignmentRhs(this, _fixBuilder.typeProvider.intType);
} else {
throw StateError('(${node.runtimeType}) $node');
}
@@ -601,10 +599,10 @@
DartType _addCastOrNullCheck(
Expression node, DartType expressionType, DartType contextType) {
var checks =
- _fixBuilder!._variables!.expressionChecks(_fixBuilder!.source, node);
+ _fixBuilder._variables!.expressionChecks(_fixBuilder.source, node);
var change = _createExpressionChange(node, expressionType, contextType);
var info = AtomicEditInfo(change.description, checks?.edges ?? {});
- (_fixBuilder!._getChange(node) as NodeChangeForExpression)
+ (_fixBuilder._getChange(node) as NodeChangeForExpression)
.addExpressionChange(change, info);
return change.resultType;
}
@@ -613,8 +611,8 @@
/// called [extensionName] from `package:collection/collection.dart`, and that
/// the pubspec will be appropriately updated (if necessary).
void _addCollectionPackageExtension(String extensionName) {
- _fixBuilder!.neededCollectionPackageExtensions.add(extensionName);
- _fixBuilder!._neededPackages['collection'] =
+ _fixBuilder.neededCollectionPackageExtensions.add(extensionName);
+ _fixBuilder._neededPackages['collection'] =
Version.parse('1.15.0-nullsafety.4');
}
@@ -622,10 +620,10 @@
{AtomicEditInfo? info, HintComment? hint}) {
var change = _createNullCheckChange(node, type, hint: hint);
var checks =
- _fixBuilder!._variables!.expressionChecks(_fixBuilder!.source, node);
+ _fixBuilder._variables!.expressionChecks(_fixBuilder.source, node);
info ??= AtomicEditInfo(change.description, checks?.edges ?? {});
var nodeChangeForExpression =
- _fixBuilder!._getChange(node) as NodeChangeForExpression;
+ _fixBuilder._getChange(node) as NodeChangeForExpression;
nodeChangeForExpression.addExpressionChange(change, info);
return change.resultType;
}
@@ -643,21 +641,20 @@
}
// Either a cast or a null check is needed. We prefer to do a null
// check if we can.
- var nonNullType = _fixBuilder!._typeSystem.promoteToNonNull(expressionType);
- if (_fixBuilder!._typeSystem.isSubtypeOf(nonNullType, contextType)) {
+ var nonNullType = _fixBuilder._typeSystem.promoteToNonNull(expressionType);
+ if (_fixBuilder._typeSystem.isSubtypeOf(nonNullType, contextType)) {
return _createNullCheckChange(node, expressionType);
} else {
_flowAnalysis!.asExpression_end(node, contextType);
return IntroduceAsChange(contextType,
- isDowncast: _fixBuilder!._typeSystem
- .isSubtypeOf(contextType, expressionType));
+ isDowncast:
+ _fixBuilder._typeSystem.isSubtypeOf(contextType, expressionType));
}
}
ExpressionChange _createNullCheckChange(Expression node, DartType type,
{HintComment? hint}) {
- var resultType =
- _fixBuilder!._typeSystem.promoteToNonNull(type as TypeImpl);
+ var resultType = _fixBuilder._typeSystem.promoteToNonNull(type as TypeImpl);
_flowAnalysis!.nonNullAssert_end(node);
return type.isDartCoreNull && hint == null
? NoValidMigrationChange(resultType)
@@ -679,9 +676,9 @@
InterfaceType _getClassInterface(
ClassElement class_, InterfaceElement superclass) {
- var decoratedSupertype = _fixBuilder!._decoratedClassHierarchy!
+ var decoratedSupertype = _fixBuilder._decoratedClassHierarchy!
.getDecoratedSupertype(class_, superclass);
- var finalType = _fixBuilder!._variables!.toFinalType(decoratedSupertype);
+ var finalType = _fixBuilder._variables!.toFinalType(decoratedSupertype);
return finalType as InterfaceType;
}
@@ -696,16 +693,15 @@
}
bool _isSubtypeOrCoercible(DartType type, DartType context) {
- var fixBuilder = _fixBuilder!;
- var typeSystem = fixBuilder._typeSystem;
+ var typeSystem = _fixBuilder._typeSystem;
if (typeSystem.isSubtypeOf(type, context)) {
return true;
}
if (context is FunctionType && type is InterfaceType) {
- var callMethod =
- type.lookUpMethod2('call', fixBuilder.unit!.declaredElement!.library);
+ var callMethod = type.lookUpMethod2(
+ 'call', _fixBuilder.unit!.declaredElement!.library);
if (callMethod != null) {
- var variables = fixBuilder._variables!;
+ var variables = _fixBuilder._variables!;
var callMethodType = variables.toFinalType(
variables.decoratedElementType(callMethod.declaration));
if (callMethod is MethodMember) {
@@ -729,7 +725,7 @@
}
}
var hint =
- _fixBuilder!._variables!.getNullCheckHint(_fixBuilder!.source, node);
+ _fixBuilder._variables!.getNullCheckHint(_fixBuilder.source, node);
if (hint != null) {
type = _addNullCheck(node, type,
info: AtomicEditInfo(
@@ -753,7 +749,7 @@
// transform `.where`.
type = _tryTransformWhere(node, type) ?? type;
}
- if (!_fixBuilder!._typeSystem.isNullable(type)) return type;
+ if (!_fixBuilder._typeSystem.isNullable(type)) return type;
if (_needsNullCheckDueToStructure(ancestor)) {
return _addNullCheck(node, type);
}
@@ -822,8 +818,8 @@
CollectionElement? _transformCollectionElement(CollectionElement? node) {
while (node is IfElement) {
- var conditionalDiscard = _fixBuilder!._variables!
- .getConditionalDiscard(_fixBuilder!.source, node);
+ var conditionalDiscard = _fixBuilder._variables!
+ .getConditionalDiscard(_fixBuilder.source, node);
if (conditionalDiscard == null ||
conditionalDiscard.keepTrue && conditionalDiscard.keepFalse) {
return node;
@@ -849,7 +845,7 @@
/// considered); otherwise returns `null`.
DartType? _tryTransformOrElse(Expression node, DartType type) {
var transformationInfo =
- _fixBuilder!._whereOrNullTransformer.tryTransformOrElseArgument(node);
+ _fixBuilder._whereOrNullTransformer.tryTransformOrElseArgument(node);
if (transformationInfo != null) {
// We can fix this by dropping the node and changing the method call.
_addCollectionPackageExtension('IterableExtension');
@@ -858,14 +854,14 @@
transformationInfo.originalName,
transformationInfo.replacementName),
{});
- (_fixBuilder!._getChange(transformationInfo.methodInvocation.methodName)
+ (_fixBuilder._getChange(transformationInfo.methodInvocation.methodName)
as NodeChangeForMethodName)
.replaceWith(transformationInfo.replacementName, info);
- (_fixBuilder!._getChange(transformationInfo.methodInvocation.argumentList)
+ (_fixBuilder._getChange(transformationInfo.methodInvocation.argumentList)
as NodeChangeForArgumentList)
.dropArgument(transformationInfo.orElseArgument, info);
_deferredMethodInvocationProcessing[transformationInfo.methodInvocation] =
- (methodInvocationType) => _fixBuilder!._typeSystem
+ (methodInvocationType) => _fixBuilder._typeSystem
.makeNullable(methodInvocationType as TypeImpl);
return type;
}
@@ -877,8 +873,8 @@
/// indicates to the caller that no further transformations to this expression
/// need to be considered); otherwise returns `null`.
DartType? _tryTransformWhere(Expression node, DartType type) {
- var transformationInfo = _fixBuilder!._whereNotNullTransformer
- .tryTransformMethodInvocation(node);
+ var transformationInfo =
+ _fixBuilder._whereNotNullTransformer.tryTransformMethodInvocation(node);
if (transformationInfo != null) {
// We can fix this by dropping the method call's argument and changing the
// call.
@@ -888,13 +884,13 @@
transformationInfo.originalName,
transformationInfo.replacementName),
{});
- (_fixBuilder!._getChange(transformationInfo.methodInvocation.methodName)
+ (_fixBuilder._getChange(transformationInfo.methodInvocation.methodName)
as NodeChangeForMethodName)
.replaceWith(transformationInfo.replacementName, info);
- (_fixBuilder!._getChange(transformationInfo.methodInvocation.argumentList)
+ (_fixBuilder._getChange(transformationInfo.methodInvocation.argumentList)
as NodeChangeForArgumentList)
.dropArgument(transformationInfo.argument, info);
- return _fixBuilder!._whereNotNullTransformer
+ return _fixBuilder._whereNotNullTransformer
.transformPostMigrationInvocationType(type);
}
return null;
@@ -906,12 +902,12 @@
/// exception is propagated normally.
T _wrapExceptions<T>(
AstNode? node, T Function() fallback, T Function() compute) {
- if (_fixBuilder!.listener == null) return compute();
+ if (_fixBuilder.listener == null) return compute();
try {
return compute();
} catch (exception, stackTrace) {
- _fixBuilder!.listener!
- .reportException(_fixBuilder!.source, node, exception, stackTrace);
+ _fixBuilder.listener!
+ .reportException(_fixBuilder.source, node, exception, stackTrace);
return fallback();
}
}
@@ -976,7 +972,7 @@
MigrationResolutionHooksImpl hooks, DartType rhsType) {
MethodElement? combiner = this.combiner;
if (combiner != null) {
- var fixBuilder = hooks._fixBuilder!;
+ var fixBuilder = hooks._fixBuilder;
var combinerReturnType =
fixBuilder._typeSystem.refineBinaryExpressionType(
readType!,
@@ -1011,13 +1007,13 @@
assert(readType!.nullabilitySuffix != NullabilitySuffix.star);
if (combinerType == TokenType.QUESTION_QUESTION_EQ) {
rhsContextType = writeTypeToSet;
- if (fixBuilder!._typeSystem.isNonNullable(readType!)) {
+ if (fixBuilder._typeSystem.isNonNullable(readType!)) {
(fixBuilder._getChange(node) as NodeChangeForAssignment)
.isWeakNullAware = true;
}
} else {
if (!readType!.isDynamic &&
- fixBuilder!._typeSystem.isPotentiallyNullable(readType!)) {
+ fixBuilder._typeSystem.isPotentiallyNullable(readType!)) {
(fixBuilder._getChange(node) as NodeChangeForAssignmentLike)
.hasNullableSource = true;
}