@@ -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