@@ -799,8 +799,6 @@ class SimpleTypeInferrerVisitor<T>
799
799
elements.getGetterSelectorInComplexSendSet (node);
800
800
TypeMask getterMask =
801
801
elements.getGetterTypeMaskInComplexSendSet (node);
802
- Selector operatorSelector =
803
- elements.getOperatorSelectorInComplexSendSet (node);
804
802
TypeMask operatorMask =
805
803
elements.getOperatorTypeMaskInComplexSendSet (node);
806
804
Selector setterSelector = elements.getSelector (node);
@@ -859,53 +857,53 @@ class SimpleTypeInferrerVisitor<T>
859
857
node, element, setterSelector, setterMask, receiverType, rhsType,
860
858
node.arguments.head);
861
859
} else {
862
- // [: foo++ :] or [: foo += 1 :].
863
- ArgumentsTypes operatorArguments = new ArgumentsTypes <T >([rhsType], null );
860
+ // [foo ??= bar], [: foo++ :] or [: foo += 1 :].
864
861
T getterType;
865
862
T newType;
866
- if ( Elements . isErroneous (element)) {
867
- getterType = types.dynamicType;
868
- newType = types.dynamicType;
869
- } else if (Elements .isStaticOrTopLevelField (element)) {
863
+
864
+ if ( Elements . isErroneous (element)) return types.dynamicType;
865
+
866
+ if (Elements .isStaticOrTopLevelField (element)) {
870
867
Element getterElement = elements[node.selector];
871
868
getterType = handleStaticSend (
872
869
node, getterSelector, getterMask, getterElement, null );
873
- newType = handleDynamicSend (
874
- node, operatorSelector, operatorMask,
875
- getterType, operatorArguments);
876
- handleStaticSend (
877
- node, setterSelector, setterMask, element,
878
- new ArgumentsTypes <T >([newType], null ));
879
870
} else if (Elements .isUnresolved (element)
880
871
|| element.isSetter
881
872
|| element.isField) {
882
873
getterType = handleDynamicSend (
883
874
node, getterSelector, getterMask, receiverType, null );
884
- newType = handleDynamicSend (
885
- node, operatorSelector, operatorMask,
886
- getterType, operatorArguments);
887
- handleDynamicSend (node, setterSelector, setterMask, receiverType,
888
- new ArgumentsTypes <T >([newType], null ));
889
875
} else if (element.isLocal) {
890
876
LocalElement local = element;
891
877
getterType = locals.use (local);
892
- newType = handleDynamicSend (
893
- node, operatorSelector, operatorMask,
894
- getterType, operatorArguments);
895
- locals.update (element, newType, node);
896
878
} else {
897
879
// Bogus SendSet, for example [: myMethod += 42 :].
898
880
getterType = types.dynamicType;
881
+ }
882
+
883
+ if (op == '??=' ) {
884
+ newType = types.allocateDiamondPhi (getterType, rhsType);
885
+ } else {
886
+ Selector operatorSelector =
887
+ elements.getOperatorSelectorInComplexSendSet (node);
899
888
newType = handleDynamicSend (
900
889
node, operatorSelector, operatorMask,
901
- getterType, operatorArguments );
890
+ getterType, new ArgumentsTypes < T >([rhsType], null ) );
902
891
}
903
892
904
- if (node.isPostfix) {
905
- return getterType;
906
- } else {
907
- return newType;
893
+ if (Elements .isStaticOrTopLevelField (element)) {
894
+ handleStaticSend (
895
+ node, setterSelector, setterMask, element,
896
+ new ArgumentsTypes <T >([newType], null ));
897
+ } else if (Elements .isUnresolved (element)
898
+ || element.isSetter
899
+ || element.isField) {
900
+ handleDynamicSend (node, setterSelector, setterMask, receiverType,
901
+ new ArgumentsTypes <T >([newType], null ));
902
+ } else if (element.isLocal) {
903
+ locals.update (element, newType, node);
908
904
}
905
+
906
+ return node.isPostfix ? getterType : newType;
909
907
}
910
908
}
911
909
@@ -932,12 +930,18 @@ class SimpleTypeInferrerVisitor<T>
932
930
getterMask,
933
931
receiverType,
934
932
new ArgumentsTypes <T >([indexType], null ));
935
- T returnType = handleDynamicSend (
936
- node,
937
- operatorSelector,
938
- operatorMask,
939
- getterType,
940
- new ArgumentsTypes <T >([rhsType], null ));
933
+
934
+ T returnType;
935
+ if (node.isIfNullAssignment) {
936
+ returnType = types.allocateDiamondPhi (getterType, rhsType);
937
+ } else {
938
+ returnType = handleDynamicSend (
939
+ node,
940
+ operatorSelector,
941
+ operatorMask,
942
+ getterType,
943
+ new ArgumentsTypes <T >([rhsType], null ));
944
+ }
941
945
handleDynamicSend (
942
946
node,
943
947
setterSelector,
0 commit comments