Chromium Code Reviews| Index: pkg/compiler/lib/src/resolution/members.dart |
| diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart |
| index 762c6f223b6ca06e6575e3d694e0215f77ad6646..5e90ff7f0ed21994e19f3cf8c223e03a9718f414 100644 |
| --- a/pkg/compiler/lib/src/resolution/members.dart |
| +++ b/pkg/compiler/lib/src/resolution/members.dart |
| @@ -2597,7 +2597,24 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| var oldCategory = allowedCategory; |
| allowedCategory |= ElementCategory.PREFIX | ElementCategory.SUPER; |
| + |
| + bool oldSendIsMemberAccess = sendIsMemberAccess; |
| + int oldAllowedCategory = allowedCategory; |
| + |
| + // Conditional sends like `e?.foo` treat the receiver as an expression. So |
| + // `C?.foo` needs to be treated like `(C).foo`, not like C.foo. Prefixes and |
| + // super are not allowed on their own in that context. |
| + if (node.isConditional) { |
| + sendIsMemberAccess = false; |
| + allowedCategory = ElementCategory.VARIABLE | ElementCategory.FUNCTION |
| + | ElementCategory.IMPLIES_TYPE; |
|
Johnni Winther
2015/05/22 12:39:49
Format like this:
allowedCategory =
ElementCa
Siggi Cherem (dart-lang)
2015/05/22 19:49:54
Done.
|
| + } |
| ResolutionResult resolvedReceiver = visit(node.receiver); |
| + if (node.isConditional) { |
| + sendIsMemberAccess = oldSendIsMemberAccess; |
| + allowedCategory = oldAllowedCategory; |
| + } |
| + |
| allowedCategory = oldCategory; |
| Element target; |
| @@ -3029,9 +3046,16 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| registry.registerThrowNoSuchMethod(); |
| } |
| } else if (target.impliesType) { |
| - setter = reportAndCreateErroneousElement(node.selector, target.name, |
| - MessageKind.ASSIGNING_TYPE, const {}); |
| - registry.registerThrowNoSuchMethod(); |
| + if (node.isIfNullAssignment) { |
| + setter = reportAndCreateErroneousElement(node.selector, target.name, |
| + MessageKind.IF_NULL_ASSIGNING_TYPE, const {}); |
| + // In this case, no assignment happens, the rest of the compiler can |
| + // treat the expression `C ??= e` as if it's just reading `C`. |
| + } else { |
| + setter = reportAndCreateErroneousElement(node.selector, target.name, |
| + MessageKind.ASSIGNING_TYPE, const {}); |
| + registry.registerThrowNoSuchMethod(); |
| + } |
| registerTypeLiteralAccess(node, target); |
|
Siggi Cherem (dart-lang)
2015/05/22 03:50:49
funny thing that you just added this - I was doing
|
| } else if (target.isFinal || target.isConst) { |
| if (Elements.isStaticOrTopLevelField(target) || target.isLocal) { |