@@ -600,18 +600,24 @@ class InferenceVisitor
600
600
..fileOffset = node.readOffset;
601
601
}
602
602
603
- ExpressionInferenceResult binaryResult = _computeBinaryExpression (
604
- node.binaryOffset, read, readType, node.binaryName, node.rhs);
605
- Expression binary = binaryResult.expression;
606
- DartType binaryType = binaryResult.inferredType;
607
-
608
603
ObjectAccessTarget writeTarget = node.setter == null
609
604
? const ObjectAccessTarget .missing ()
610
605
: new ExtensionAccessTarget (
611
606
node.setter, null , ProcedureKind .Setter , extensionTypeArguments);
612
607
613
608
DartType valueType = inferrer.getSetterType (writeTarget, receiverType);
614
609
610
+ ExpressionInferenceResult binaryResult = _computeBinaryExpression (
611
+ node.binaryOffset,
612
+ valueType,
613
+ read,
614
+ readType,
615
+ node.binaryName,
616
+ node.rhs);
617
+
618
+ Expression binary = binaryResult.expression;
619
+ DartType binaryType = binaryResult.inferredType;
620
+
615
621
Expression value = inferrer.ensureAssignable (valueType, binaryType, binary,
616
622
isVoidAllowed: true );
617
623
@@ -2612,14 +2618,20 @@ class InferenceVisitor
2612
2618
Expression read = readResult.expression;
2613
2619
DartType readType = readResult.inferredType;
2614
2620
2615
- ExpressionInferenceResult binaryResult = _computeBinaryExpression (
2616
- node.binaryOffset, read, readType, node.binaryName, node.rhs);
2617
- DartType binaryType = binaryResult.inferredType;
2618
-
2619
2621
ObjectAccessTarget writeTarget = inferrer.findInterfaceMember (
2620
2622
receiverType, node.propertyName, node.writeOffset,
2621
2623
setter: true , instrumented: true , includeExtensionMethods: true );
2622
2624
DartType writeType = inferrer.getSetterType (writeTarget, receiverType);
2625
+
2626
+ ExpressionInferenceResult binaryResult = _computeBinaryExpression (
2627
+ node.binaryOffset,
2628
+ writeType,
2629
+ read,
2630
+ readType,
2631
+ node.binaryName,
2632
+ node.rhs);
2633
+ DartType binaryType = binaryResult.inferredType;
2634
+
2623
2635
Expression binary =
2624
2636
inferrer.ensureAssignableResult (writeType, binaryResult);
2625
2637
@@ -3550,8 +3562,13 @@ class InferenceVisitor
3550
3562
/// [fileOffset] is used as the file offset for created nodes. [leftType] is
3551
3563
/// the already inferred type of the [left] expression. The inferred type of
3552
3564
/// [right] is computed by this method.
3553
- ExpressionInferenceResult _computeBinaryExpression (int fileOffset,
3554
- Expression left, DartType leftType, Name binaryName, Expression right) {
3565
+ ExpressionInferenceResult _computeBinaryExpression (
3566
+ int fileOffset,
3567
+ DartType contextType,
3568
+ Expression left,
3569
+ DartType leftType,
3570
+ Name binaryName,
3571
+ Expression right) {
3555
3572
assert (binaryName != equalsName);
3556
3573
3557
3574
ObjectAccessTarget binaryTarget = inferrer.findInterfaceMember (
@@ -3566,13 +3583,21 @@ class InferenceVisitor
3566
3583
DartType rightType =
3567
3584
inferrer.getPositionalParameterTypeForTarget (binaryTarget, leftType, 0 );
3568
3585
3569
- bool isOverloadedArithmeticOperatorAndType =
3570
- inferrer.isOverloadedArithmeticOperatorAndType (binaryTarget, leftType);
3586
+ bool isSpecialCasedBinaryOperator = inferrer
3587
+ .isSpecialCasedBinaryOperatorForReceiverType (binaryTarget, leftType);
3588
+
3589
+ bool typeNeeded = ! inferrer.isTopLevel || isSpecialCasedBinaryOperator;
3571
3590
3572
- bool typeNeeded =
3573
- ! inferrer.isTopLevel || isOverloadedArithmeticOperatorAndType;
3574
- ExpressionInferenceResult rightResult = inferrer
3575
- .inferExpression (right, rightType, typeNeeded, isVoidAllowed: true );
3591
+ DartType rightContextType = rightType;
3592
+ if (isSpecialCasedBinaryOperator) {
3593
+ rightContextType = inferrer.typeSchemaEnvironment
3594
+ .getContextTypeOfSpecialCasedBinaryOperator (
3595
+ contextType, leftType, rightType,
3596
+ isNonNullableByDefault: inferrer.isNonNullableByDefault);
3597
+ }
3598
+ ExpressionInferenceResult rightResult = inferrer.inferExpression (
3599
+ right, rightContextType, typeNeeded,
3600
+ isVoidAllowed: true );
3576
3601
if (rightResult.inferredType == null ) {
3577
3602
assert (! typeNeeded,
3578
3603
"Missing right type for overloaded arithmetic operator." );
@@ -3584,9 +3609,11 @@ class InferenceVisitor
3584
3609
3585
3610
right = inferrer.ensureAssignableResult (rightType, rightResult);
3586
3611
3587
- if (isOverloadedArithmeticOperatorAndType ) {
3612
+ if (isSpecialCasedBinaryOperator ) {
3588
3613
binaryType = inferrer.typeSchemaEnvironment
3589
- .getTypeOfOverloadedArithmetic (leftType, rightResult.inferredType);
3614
+ .getTypeOfSpecialCasedBinaryOperator (
3615
+ leftType, rightResult.inferredType,
3616
+ isNonNullableByDefault: inferrer.isNonNullableByDefault);
3590
3617
}
3591
3618
3592
3619
Expression binary;
@@ -4202,23 +4229,30 @@ class InferenceVisitor
4202
4229
left = read;
4203
4230
}
4204
4231
4205
- ExpressionInferenceResult binaryResult = _computeBinaryExpression (
4206
- node.binaryOffset, left, readType, node.binaryName, node.rhs);
4207
- Expression binary = binaryResult.expression;
4208
- DartType binaryType = binaryResult.inferredType;
4209
-
4210
4232
ObjectAccessTarget writeTarget = inferrer.findInterfaceMember (
4211
4233
receiverType, indexSetName, node.writeOffset,
4212
4234
includeExtensionMethods: true );
4213
4235
4214
4236
DartType writeIndexType =
4215
4237
inferrer.getIndexKeyType (writeTarget, receiverType);
4238
+
4239
+ DartType valueType =
4240
+ inferrer.getIndexSetValueType (writeTarget, receiverType);
4241
+
4242
+ ExpressionInferenceResult binaryResult = _computeBinaryExpression (
4243
+ node.binaryOffset,
4244
+ valueType,
4245
+ left,
4246
+ readType,
4247
+ node.binaryName,
4248
+ node.rhs);
4249
+ Expression binary = binaryResult.expression;
4250
+ DartType binaryType = binaryResult.inferredType;
4251
+
4216
4252
Expression writeIndex = createVariableGet (indexVariable);
4217
4253
writeIndex = inferrer.ensureAssignable (
4218
4254
writeIndexType, indexResult.inferredType, writeIndex);
4219
4255
4220
- DartType valueType =
4221
- inferrer.getIndexSetValueType (writeTarget, receiverType);
4222
4256
binary = inferrer.ensureAssignable (valueType, binaryType, binary,
4223
4257
fileOffset: node.fileOffset);
4224
4258
@@ -4342,17 +4376,23 @@ class InferenceVisitor
4342
4376
left = read;
4343
4377
}
4344
4378
4345
- ExpressionInferenceResult binaryResult = _computeBinaryExpression (
4346
- node.binaryOffset, left, readType, node.binaryName, node.rhs);
4347
- Expression binary = binaryResult.expression;
4348
- DartType binaryType = binaryResult.inferredType;
4349
-
4350
4379
ObjectAccessTarget writeTarget = inferrer.findInterfaceMember (
4351
4380
nonNullReceiverType, node.propertyName, node.writeOffset,
4352
4381
setter: true , includeExtensionMethods: true );
4353
4382
4354
4383
DartType valueType =
4355
4384
inferrer.getSetterType (writeTarget, nonNullReceiverType);
4385
+
4386
+ ExpressionInferenceResult binaryResult = _computeBinaryExpression (
4387
+ node.binaryOffset,
4388
+ valueType,
4389
+ left,
4390
+ readType,
4391
+ node.binaryName,
4392
+ node.rhs);
4393
+ Expression binary = binaryResult.expression;
4394
+ DartType binaryType = binaryResult.inferredType;
4395
+
4356
4396
binary = inferrer.ensureAssignable (valueType, binaryType, binary,
4357
4397
fileOffset: node.fileOffset);
4358
4398
@@ -4477,25 +4517,31 @@ class InferenceVisitor
4477
4517
} else {
4478
4518
left = read;
4479
4519
}
4480
-
4481
- ExpressionInferenceResult binaryResult = _computeBinaryExpression (
4482
- node.binaryOffset, left, readType, node.binaryName, node.rhs);
4483
- Expression binary = binaryResult.expression;
4484
- DartType binaryType = binaryResult.inferredType;
4485
-
4486
4520
ObjectAccessTarget writeTarget = node.setter != null
4487
4521
? new ObjectAccessTarget .interfaceMember (node.setter,
4488
4522
isPotentiallyNullable: false )
4489
4523
: const ObjectAccessTarget .missing ();
4490
4524
4491
4525
DartType writeIndexType =
4492
4526
inferrer.getIndexKeyType (writeTarget, inferrer.thisType);
4527
+
4528
+ DartType valueType =
4529
+ inferrer.getIndexSetValueType (writeTarget, inferrer.thisType);
4530
+
4531
+ ExpressionInferenceResult binaryResult = _computeBinaryExpression (
4532
+ node.binaryOffset,
4533
+ valueType,
4534
+ left,
4535
+ readType,
4536
+ node.binaryName,
4537
+ node.rhs);
4538
+ Expression binary = binaryResult.expression;
4539
+ DartType binaryType = binaryResult.inferredType;
4540
+
4493
4541
Expression writeIndex = createVariableGet (indexVariable);
4494
4542
writeIndex = inferrer.ensureAssignable (
4495
4543
writeIndexType, indexResult.inferredType, writeIndex);
4496
4544
4497
- DartType valueType =
4498
- inferrer.getIndexSetValueType (writeTarget, inferrer.thisType);
4499
4545
Expression binaryReplacement = inferrer.ensureAssignable (
4500
4546
valueType, binaryType, binary,
4501
4547
fileOffset: node.fileOffset);
@@ -4643,24 +4689,31 @@ class InferenceVisitor
4643
4689
left = read;
4644
4690
}
4645
4691
4646
- ExpressionInferenceResult binaryResult = _computeBinaryExpression (
4647
- node.binaryOffset, left, readType, node.binaryName, node.rhs);
4648
- Expression binary = binaryResult.expression;
4649
- DartType binaryType = binaryResult.inferredType;
4650
-
4651
4692
ObjectAccessTarget writeTarget = node.setter != null
4652
4693
? new ExtensionAccessTarget (
4653
4694
node.setter, null , ProcedureKind .Operator , extensionTypeArguments)
4654
4695
: const ObjectAccessTarget .missing ();
4655
4696
4656
4697
DartType writeIndexType =
4657
4698
inferrer.getIndexKeyType (writeTarget, receiverType);
4658
- Expression writeIndex = createVariableGet (indexVariable);
4659
- writeIndex = inferrer.ensureAssignable (
4660
- writeIndexType, indexResult.inferredType, writeIndex);
4661
4699
4662
4700
DartType valueType =
4663
4701
inferrer.getIndexSetValueType (writeTarget, inferrer.thisType);
4702
+
4703
+ ExpressionInferenceResult binaryResult = _computeBinaryExpression (
4704
+ node.binaryOffset,
4705
+ valueType,
4706
+ left,
4707
+ readType,
4708
+ node.binaryName,
4709
+ node.rhs);
4710
+
4711
+ Expression binary = binaryResult.expression;
4712
+ DartType binaryType = binaryResult.inferredType;
4713
+
4714
+ Expression writeIndex = createVariableGet (indexVariable);
4715
+ writeIndex = inferrer.ensureAssignable (
4716
+ writeIndexType, indexResult.inferredType, writeIndex);
4664
4717
binary = inferrer.ensureAssignable (valueType, binaryType, binary,
4665
4718
fileOffset: node.fileOffset);
4666
4719
@@ -5832,8 +5885,13 @@ class InferenceVisitor
5832
5885
BinaryExpression node, DartType typeContext) {
5833
5886
ExpressionInferenceResult leftResult =
5834
5887
inferrer.inferExpression (node.left, const UnknownType (), true );
5835
- return _computeBinaryExpression (node.fileOffset, leftResult.expression,
5836
- leftResult.inferredType, node.binaryName, node.right);
5888
+ return _computeBinaryExpression (
5889
+ node.fileOffset,
5890
+ typeContext,
5891
+ leftResult.expression,
5892
+ leftResult.inferredType,
5893
+ node.binaryName,
5894
+ node.right);
5837
5895
}
5838
5896
5839
5897
ExpressionInferenceResult visitUnary (
0 commit comments