Skip to content

Commit a8cce35

Browse files
bwilkersoncommit-bot@chromium.org
authored andcommitted
Add an edge origin for edges resulting from default values of optional parameters
Change-Id: I252e2e003dc46b4ddf702bf0c7d16a7611c2476a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/120280 Reviewed-by: Paul Berry <paulberry@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
1 parent 73d880b commit a8cce35

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

pkg/nnbd_migration/lib/src/edge_builder.dart

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,7 @@ class EdgeBuilder extends GeneralizingAstVisitor<DecoratedType>
563563
} else {
564564
_handleAssignment(defaultValue,
565565
destinationType: getOrComputeElementType(node.declaredElement),
566-
canInsertChecks: false);
566+
fromDefaultValue: true);
567567
}
568568
return null;
569569
}
@@ -1591,7 +1591,7 @@ class EdgeBuilder extends GeneralizingAstVisitor<DecoratedType>
15911591
Expression destinationExpression,
15921592
AssignmentExpression compoundOperatorInfo,
15931593
Expression questionAssignNode,
1594-
bool canInsertChecks = true}) {
1594+
bool fromDefaultValue = false}) {
15951595
assert(
15961596
(destinationExpression == null) != (destinationType == null),
15971597
'Either destinationExpression or destinationType should be supplied, '
@@ -1621,12 +1621,18 @@ class EdgeBuilder extends GeneralizingAstVisitor<DecoratedType>
16211621
throw StateError('No type computed for ${expression.runtimeType} '
16221622
'(${expression.toSource()}) offset=${expression.offset}');
16231623
}
1624-
ExpressionChecksOrigin expressionChecksOrigin;
1625-
if (canInsertChecks && !sourceType.type.isDynamic) {
1626-
expressionChecksOrigin = ExpressionChecksOrigin(
1627-
source, expression, ExpressionChecks(expression.end));
1628-
_variables.recordExpressionChecks(
1629-
source, expression, expressionChecksOrigin);
1624+
EdgeOrigin edgeOrigin;
1625+
if (!sourceType.type.isDynamic) {
1626+
if (fromDefaultValue) {
1627+
edgeOrigin = DefaultValueOrigin(source, expression);
1628+
} else {
1629+
ExpressionChecksOrigin expressionChecksOrigin =
1630+
ExpressionChecksOrigin(
1631+
source, expression, ExpressionChecks(expression.end));
1632+
_variables.recordExpressionChecks(
1633+
source, expression, expressionChecksOrigin);
1634+
edgeOrigin = expressionChecksOrigin;
1635+
}
16301636
}
16311637
if (compoundOperatorInfo != null) {
16321638
var compoundOperatorMethod = compoundOperatorInfo.staticElement;
@@ -1640,7 +1646,7 @@ class EdgeBuilder extends GeneralizingAstVisitor<DecoratedType>
16401646
DecoratedType compoundOperatorType =
16411647
getOrComputeElementType(compoundOperatorMethod);
16421648
assert(compoundOperatorType.positionalParameters.length > 0);
1643-
_checkAssignment(expressionChecksOrigin,
1649+
_checkAssignment(edgeOrigin,
16441650
source: sourceType,
16451651
destination: compoundOperatorType.positionalParameters[0],
16461652
hard: _postDominatedLocals.isReferenceInScope(expression));
@@ -1655,7 +1661,7 @@ class EdgeBuilder extends GeneralizingAstVisitor<DecoratedType>
16551661
sourceType = _dynamicType;
16561662
}
16571663
} else {
1658-
_checkAssignment(expressionChecksOrigin,
1664+
_checkAssignment(edgeOrigin,
16591665
source: sourceType,
16601666
destination: destinationType,
16611667
hard: questionAssignNode == null &&

pkg/nnbd_migration/lib/src/edge_origin.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ class CompoundAssignmentOrigin extends EdgeOrigin {
2828
AssignmentExpression get node => super.node as AssignmentExpression;
2929
}
3030

31+
/// An edge origin used for edges that originated because of a default value on
32+
/// a parameter.
33+
class DefaultValueOrigin extends EdgeOrigin {
34+
DefaultValueOrigin(Source source, Expression node) : super(source, node);
35+
}
36+
3137
/// Common interface for classes providing information about how an edge came
3238
/// to be; that is, what was found in the source code that led the migration
3339
/// tool to create the edge.

0 commit comments

Comments
 (0)