Skip to content

Commit 3ffde1e

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Handle Never in list/map pattern
Closes #56138 Change-Id: I0bb24b0de3178e3a565b300cb7b9e1dee6c21e80 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/396803 Reviewed-by: Jens Johansen <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent f9d6d89 commit 3ffde1e

28 files changed

+617
-347
lines changed

pkg/front_end/lib/src/type_inference/inference_visitor.dart

Lines changed: 84 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -11096,40 +11096,46 @@ class InferenceVisitorImpl extends InferenceVisitorBase
1109611096
ObjectAccessTarget lengthTarget = findInterfaceMember(
1109711097
lookupType, lengthName, node.fileOffset,
1109811098
includeExtensionMethods: true, isSetter: false);
11099-
assert(lengthTarget.isInstanceMember);
11099+
DartType lengthType;
11100+
if (lengthTarget.isNever) {
11101+
lengthType = const NeverType.nonNullable();
11102+
node.isNeverPattern = true;
11103+
} else {
11104+
assert(lengthTarget.isInstanceMember);
1110011105

11101-
DartType lengthType = node.lengthType = lengthTarget.getGetterType(this);
11102-
node.lengthTarget = lengthTarget.classMember!;
11106+
lengthType = node.lengthType = lengthTarget.getGetterType(this);
11107+
node.lengthTarget = lengthTarget.classMember!;
1110311108

11104-
ObjectAccessTarget sublistInvokeTarget = findInterfaceMember(
11105-
lookupType, sublistName, node.fileOffset,
11106-
includeExtensionMethods: true, isSetter: false);
11107-
assert(sublistInvokeTarget.isInstanceMember);
11109+
ObjectAccessTarget sublistInvokeTarget = findInterfaceMember(
11110+
lookupType, sublistName, node.fileOffset,
11111+
includeExtensionMethods: true, isSetter: false);
11112+
assert(sublistInvokeTarget.isInstanceMember);
1110811113

11109-
node.sublistTarget = sublistInvokeTarget.classMember as Procedure;
11110-
node.sublistType =
11111-
sublistInvokeTarget.getFunctionType(this).sublistFunctionType;
11114+
node.sublistTarget = sublistInvokeTarget.classMember as Procedure;
11115+
node.sublistType =
11116+
sublistInvokeTarget.getFunctionType(this).sublistFunctionType;
1111211117

11113-
ObjectAccessTarget minusTarget = findInterfaceMember(
11114-
lengthType, minusName, node.fileOffset,
11115-
includeExtensionMethods: true, isSetter: false);
11116-
assert(minusTarget.isInstanceMember);
11117-
assert(minusTarget.isSpecialCasedBinaryOperator(this));
11118+
ObjectAccessTarget minusTarget = findInterfaceMember(
11119+
lengthType, minusName, node.fileOffset,
11120+
includeExtensionMethods: true, isSetter: false);
11121+
assert(minusTarget.isInstanceMember);
11122+
assert(minusTarget.isSpecialCasedBinaryOperator(this));
1111811123

11119-
node.minusTarget = minusTarget.classMember as Procedure;
11120-
node.minusType = replaceReturnType(
11121-
minusTarget.getFunctionType(this).minusFunctionType,
11122-
typeSchemaEnvironment.getTypeOfSpecialCasedBinaryOperator(
11123-
lengthType, coreTypes.intNonNullableRawType));
11124+
node.minusTarget = minusTarget.classMember as Procedure;
11125+
node.minusType = replaceReturnType(
11126+
minusTarget.getFunctionType(this).minusFunctionType,
11127+
typeSchemaEnvironment.getTypeOfSpecialCasedBinaryOperator(
11128+
lengthType, coreTypes.intNonNullableRawType));
1112411129

11125-
ObjectAccessTarget indexGetTarget = findInterfaceMember(
11126-
lookupType, indexGetName, node.fileOffset,
11127-
includeExtensionMethods: true, isSetter: false);
11128-
assert(indexGetTarget.isInstanceMember);
11130+
ObjectAccessTarget indexGetTarget = findInterfaceMember(
11131+
lookupType, indexGetName, node.fileOffset,
11132+
includeExtensionMethods: true, isSetter: false);
11133+
assert(indexGetTarget.isInstanceMember);
1112911134

11130-
node.indexGetTarget = indexGetTarget.classMember as Procedure;
11131-
node.indexGetType =
11132-
indexGetTarget.getFunctionType(this).indexGetFunctionType;
11135+
node.indexGetTarget = indexGetTarget.classMember as Procedure;
11136+
node.indexGetType =
11137+
indexGetTarget.getFunctionType(this).indexGetFunctionType;
11138+
}
1113311139

1113411140
for (Pattern pattern in node.patterns) {
1113511141
if (pattern is RestPattern) {
@@ -11138,41 +11144,39 @@ class InferenceVisitorImpl extends InferenceVisitorBase
1113811144
}
1113911145
}
1114011146

11141-
if (node.hasRestPattern) {
11142-
ObjectAccessTarget greaterThanOrEqualTarget = findInterfaceMember(
11143-
lengthType, greaterThanOrEqualsName, node.fileOffset,
11144-
includeExtensionMethods: true, isSetter: false);
11145-
assert(greaterThanOrEqualTarget.isInstanceMember);
11146-
11147-
node.lengthCheckTarget =
11148-
greaterThanOrEqualTarget.classMember as Procedure;
11149-
node.lengthCheckType = greaterThanOrEqualTarget
11150-
.getFunctionType(this)
11151-
.greaterThanOrEqualsFunctionType;
11152-
} else if (node.patterns.isEmpty) {
11153-
ObjectAccessTarget lessThanOrEqualsInvokeTarget = findInterfaceMember(
11154-
lengthType, lessThanOrEqualsName, node.fileOffset,
11155-
includeExtensionMethods: true, isSetter: false);
11156-
assert(lessThanOrEqualsInvokeTarget.isInstanceMember ||
11157-
// Coverage-ignore(suite): Not run.
11158-
lessThanOrEqualsInvokeTarget.isObjectMember);
11159-
11160-
node.lengthCheckTarget =
11161-
lessThanOrEqualsInvokeTarget.classMember as Procedure;
11162-
node.lengthCheckType = lessThanOrEqualsInvokeTarget
11163-
.getFunctionType(this)
11164-
.lessThanOrEqualsFunctionType;
11165-
} else {
11166-
ObjectAccessTarget equalsInvokeTarget = findInterfaceMember(
11167-
lengthType, equalsName, node.fileOffset,
11168-
includeExtensionMethods: true, isSetter: false);
11169-
assert(equalsInvokeTarget.isInstanceMember ||
11170-
// Coverage-ignore(suite): Not run.
11171-
equalsInvokeTarget.isObjectMember);
11147+
if (!node.isNeverPattern) {
11148+
if (node.hasRestPattern) {
11149+
ObjectAccessTarget greaterThanOrEqualTarget = findInterfaceMember(
11150+
lengthType, greaterThanOrEqualsName, node.fileOffset,
11151+
includeExtensionMethods: true, isSetter: false);
11152+
assert(greaterThanOrEqualTarget.isInstanceMember);
11153+
11154+
node.lengthCheckTarget =
11155+
greaterThanOrEqualTarget.classMember as Procedure;
11156+
node.lengthCheckType = greaterThanOrEqualTarget
11157+
.getFunctionType(this)
11158+
.greaterThanOrEqualsFunctionType;
11159+
} else if (node.patterns.isEmpty) {
11160+
ObjectAccessTarget lessThanOrEqualsInvokeTarget = findInterfaceMember(
11161+
lengthType, lessThanOrEqualsName, node.fileOffset,
11162+
includeExtensionMethods: true, isSetter: false);
11163+
assert(lessThanOrEqualsInvokeTarget.isInstanceMember);
11164+
11165+
node.lengthCheckTarget =
11166+
lessThanOrEqualsInvokeTarget.classMember as Procedure;
11167+
node.lengthCheckType = lessThanOrEqualsInvokeTarget
11168+
.getFunctionType(this)
11169+
.lessThanOrEqualsFunctionType;
11170+
} else {
11171+
ObjectAccessTarget equalsInvokeTarget = findInterfaceMember(
11172+
lengthType, equalsName, node.fileOffset,
11173+
includeExtensionMethods: true, isSetter: false);
11174+
assert(equalsInvokeTarget.isInstanceMember);
1117211175

11173-
node.lengthCheckTarget = equalsInvokeTarget.classMember as Procedure;
11174-
node.lengthCheckType =
11175-
equalsInvokeTarget.getFunctionType(this).equalsFunctionType;
11176+
node.lengthCheckTarget = equalsInvokeTarget.classMember as Procedure;
11177+
node.lengthCheckType =
11178+
equalsInvokeTarget.getFunctionType(this).equalsFunctionType;
11179+
}
1117611180
}
1117711181

1117811182
pushRewrite(replacement ?? node);
@@ -11580,20 +11584,28 @@ class InferenceVisitorImpl extends InferenceVisitorBase
1158011584
ObjectAccessTarget containsKeyTarget = findInterfaceMember(
1158111585
lookupType, containsKeyName, node.fileOffset,
1158211586
includeExtensionMethods: true, isSetter: false);
11583-
assert(containsKeyTarget.isInstanceMember);
11587+
if (containsKeyTarget.isNever) {
11588+
node.isNeverPattern = true;
11589+
} else {
11590+
assert(containsKeyTarget.isInstanceMember);
1158411591

11585-
node.containsKeyTarget = containsKeyTarget.classMember as Procedure;
11586-
node.containsKeyType =
11587-
containsKeyTarget.getFunctionType(this).containsKeyFunctionType;
11592+
node.containsKeyTarget = containsKeyTarget.classMember as Procedure;
11593+
node.containsKeyType =
11594+
containsKeyTarget
11595+
.getFunctionType(this)
11596+
.containsKeyFunctionType;
1158811597

11589-
ObjectAccessTarget indexGetTarget = findInterfaceMember(
11590-
lookupType, indexGetName, node.fileOffset,
11591-
includeExtensionMethods: true, isSetter: false);
11592-
assert(indexGetTarget.isInstanceMember);
11598+
ObjectAccessTarget indexGetTarget = findInterfaceMember(
11599+
lookupType, indexGetName, node.fileOffset,
11600+
includeExtensionMethods: true, isSetter: false);
11601+
assert(indexGetTarget.isInstanceMember);
1159311602

11594-
node.indexGetTarget = indexGetTarget.classMember as Procedure;
11595-
node.indexGetType =
11596-
indexGetTarget.getFunctionType(this).indexGetFunctionType;
11603+
node.indexGetTarget = indexGetTarget.classMember as Procedure;
11604+
node.indexGetType =
11605+
indexGetTarget
11606+
.getFunctionType(this)
11607+
.indexGetFunctionType;
11608+
}
1159711609

1159811610
assert(checkStack(node, stackBase, [
1159911611
/* entries = */ ...repeatedKind(

0 commit comments

Comments
 (0)