Chromium Code Reviews| Index: pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart |
| diff --git a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart |
| index d40a34919a4268ee51a59272ed6bd19c1672ca2e..5e6d0ec57be81659a6dfe08c8ab88d39dfcb1d83 100644 |
| --- a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart |
| +++ b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart |
| @@ -822,8 +822,6 @@ class SimpleTypeInferrerVisitor<T> |
| elements.getGetterSelectorInComplexSendSet(node); |
| TypeMask getterMask = |
| elements.getGetterTypeMaskInComplexSendSet(node); |
| - Selector operatorSelector = |
| - elements.getOperatorSelectorInComplexSendSet(node); |
| TypeMask operatorMask = |
| elements.getOperatorTypeMaskInComplexSendSet(node); |
| Selector setterSelector = elements.getSelector(node); |
| @@ -882,53 +880,53 @@ class SimpleTypeInferrerVisitor<T> |
| node, element, setterSelector, setterMask, receiverType, rhsType, |
| node.arguments.head); |
| } else { |
| - // [: foo++ :] or [: foo += 1 :]. |
| - ArgumentsTypes operatorArguments = new ArgumentsTypes<T>([rhsType], null); |
| + // [foo ??= bar], [: foo++ :] or [: foo += 1 :]. |
| T getterType; |
| T newType; |
| - if (Elements.isErroneous(element)) { |
| - getterType = types.dynamicType; |
| - newType = types.dynamicType; |
| - } else if (Elements.isStaticOrTopLevelField(element)) { |
| + |
| + if (Elements.isErroneous(element)) return types.dynamicType; |
| + |
| + if (Elements.isStaticOrTopLevelField(element)) { |
| Element getterElement = elements[node.selector]; |
| getterType = handleStaticSend( |
| node, getterSelector, getterMask, getterElement, null); |
| - newType = handleDynamicSend( |
| - node, operatorSelector, operatorMask, |
| - getterType, operatorArguments); |
| - handleStaticSend( |
| - node, setterSelector, setterMask, element, |
| - new ArgumentsTypes<T>([newType], null)); |
| } else if (Elements.isUnresolved(element) |
|
Siggi Cherem (dart-lang)
2015/08/20 01:39:47
BTW - this looks like a bigger change than it is -
|
| || element.isSetter |
| || element.isField) { |
| getterType = handleDynamicSend( |
| node, getterSelector, getterMask, receiverType, null); |
| - newType = handleDynamicSend( |
| - node, operatorSelector, operatorMask, |
| - getterType, operatorArguments); |
| - handleDynamicSend(node, setterSelector, setterMask, receiverType, |
| - new ArgumentsTypes<T>([newType], null)); |
| } else if (element.isLocal) { |
| LocalElement local = element; |
| getterType = locals.use(local); |
| - newType = handleDynamicSend( |
| - node, operatorSelector, operatorMask, |
| - getterType, operatorArguments); |
| - locals.update(element, newType, node); |
| } else { |
| // Bogus SendSet, for example [: myMethod += 42 :]. |
| getterType = types.dynamicType; |
| + } |
| + |
| + if (op == '??=') { |
| + newType = types.allocateDiamondPhi(getterType, rhsType); |
| + } else { |
| + Selector operatorSelector = |
| + elements.getOperatorSelectorInComplexSendSet(node); |
| newType = handleDynamicSend( |
| node, operatorSelector, operatorMask, |
| - getterType, operatorArguments); |
| + getterType, new ArgumentsTypes<T>([rhsType], null)); |
| } |
| - if (node.isPostfix) { |
| - return getterType; |
| - } else { |
| - return newType; |
| + if (Elements.isStaticOrTopLevelField(element)) { |
| + handleStaticSend( |
| + node, setterSelector, setterMask, element, |
| + new ArgumentsTypes<T>([newType], null)); |
| + } else if (Elements.isUnresolved(element) |
| + || element.isSetter |
| + || element.isField) { |
| + handleDynamicSend(node, setterSelector, setterMask, receiverType, |
| + new ArgumentsTypes<T>([newType], null)); |
| + } else if (element.isLocal) { |
| + locals.update(element, newType, node); |
| } |
| + |
| + return node.isPostfix ? getterType : newType; |
| } |
| } |
| @@ -955,12 +953,18 @@ class SimpleTypeInferrerVisitor<T> |
| getterMask, |
| receiverType, |
| new ArgumentsTypes<T>([indexType], null)); |
| - T returnType = handleDynamicSend( |
| - node, |
| - operatorSelector, |
| - operatorMask, |
| - getterType, |
| - new ArgumentsTypes<T>([rhsType], null)); |
| + |
| + T returnType; |
| + if (node.isIfNullAssignment) { |
| + returnType = types.allocateDiamondPhi(getterType, rhsType); |
| + } else { |
| + returnType = handleDynamicSend( |
| + node, |
| + operatorSelector, |
| + operatorMask, |
| + getterType, |
| + new ArgumentsTypes<T>([rhsType], null)); |
| + } |
| handleDynamicSend( |
| node, |
| setterSelector, |