| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of dart2js.semantics_visitor; | 5 part of dart2js.semantics_visitor; |
| 6 | 6 |
| 7 enum SendStructureKind { | 7 enum SendStructureKind { |
| 8 GET, | 8 GET, |
| 9 SET, | 9 SET, |
| 10 INVOKE, | 10 INVOKE, |
| 11 UNARY, | 11 UNARY, |
| 12 NOT, | 12 NOT, |
| 13 BINARY, | 13 BINARY, |
| 14 EQ, | 14 EQ, |
| 15 NOT_EQ, | 15 NOT_EQ, |
| 16 COMPOUND, | 16 COMPOUND, |
| 17 INDEX, | 17 INDEX, |
| 18 INDEX_SET, | 18 INDEX_SET, |
| 19 COMPOUND_INDEX_SET, | 19 COMPOUND_INDEX_SET, |
| 20 PREFIX, | 20 PREFIX, |
| 21 POSTFIX, | 21 POSTFIX, |
| 22 INDEX_PREFIX, |
| 23 INDEX_POSTFIX, |
| 22 } | 24 } |
| 23 | 25 |
| 24 abstract class SendResolverMixin { | 26 abstract class SendResolverMixin { |
| 25 TreeElements get elements; | 27 TreeElements get elements; |
| 26 | 28 |
| 27 internalError(Spannable spannable, String message); | 29 internalError(Spannable spannable, String message); |
| 28 | 30 |
| 29 AccessSemantics handleStaticallyResolvedAccess(Send node, | 31 AccessSemantics handleStaticallyResolvedAccess(Send node, |
| 30 Element element, | 32 Element element, |
| 31 Element getter) { | 33 Element getter) { |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 kind = SendStructureKind.EQ; | 180 kind = SendStructureKind.EQ; |
| 179 break; | 181 break; |
| 180 case BinaryOperatorKind.NOT_EQ: | 182 case BinaryOperatorKind.NOT_EQ: |
| 181 if (node.isSuperCall) { | 183 if (node.isSuperCall) { |
| 182 // `super != foo` is a compile-time error. | 184 // `super != foo` is a compile-time error. |
| 183 return const InvalidBinaryStructure(); | 185 return const InvalidBinaryStructure(); |
| 184 } | 186 } |
| 185 kind = SendStructureKind.NOT_EQ; | 187 kind = SendStructureKind.NOT_EQ; |
| 186 break; | 188 break; |
| 187 case BinaryOperatorKind.INDEX: | 189 case BinaryOperatorKind.INDEX: |
| 188 if (node.arguments.tail.isEmpty) { | 190 if (node.isPrefix) { |
| 191 kind = SendStructureKind.INDEX_PREFIX; |
| 192 } else if (node.isPostfix) { |
| 193 kind = SendStructureKind.INDEX_POSTFIX; |
| 194 } else if (node.arguments.tail.isEmpty) { |
| 189 // a[b] | 195 // a[b] |
| 190 kind = SendStructureKind.INDEX; | 196 kind = SendStructureKind.INDEX; |
| 191 } else { | 197 } else { |
| 192 if (kind == SendStructureKind.COMPOUND) { | 198 if (kind == SendStructureKind.COMPOUND) { |
| 193 // a[b] += c | 199 // a[b] += c |
| 194 kind = SendStructureKind.COMPOUND_INDEX_SET; | 200 kind = SendStructureKind.COMPOUND_INDEX_SET; |
| 195 } else { | 201 } else { |
| 196 // a[b] = c | 202 // a[b] = c |
| 197 kind = SendStructureKind.INDEX_SET; | 203 kind = SendStructureKind.INDEX_SET; |
| 198 } | 204 } |
| 199 } | 205 } |
| 200 break; | 206 break; |
| 201 default: | 207 default: |
| 202 kind = SendStructureKind.BINARY; | 208 kind = SendStructureKind.BINARY; |
| 203 break; | 209 break; |
| 204 } | 210 } |
| 205 } else { | 211 } else { |
| 206 return const InvalidBinaryStructure(); | 212 return const InvalidBinaryStructure(); |
| 207 } | 213 } |
| 208 } | 214 } |
| 209 } | 215 } |
| 210 AccessSemantics semantics = computeAccessSemantics( | 216 AccessSemantics semantics = computeAccessSemantics( |
| 211 node, | 217 node, |
| 212 isGetOrSet: kind == SendStructureKind.GET || | 218 isGetOrSet: kind == SendStructureKind.GET || |
| 213 kind == SendStructureKind.SET, | 219 kind == SendStructureKind.SET, |
| 214 isInvoke: kind == SendStructureKind.INVOKE, | 220 isInvoke: kind == SendStructureKind.INVOKE, |
| 215 isCompound: kind == SendStructureKind.COMPOUND || | 221 isCompound: kind == SendStructureKind.COMPOUND || |
| 216 kind == SendStructureKind.COMPOUND_INDEX_SET || | 222 kind == SendStructureKind.COMPOUND_INDEX_SET || |
| 217 kind == SendStructureKind.PREFIX || | 223 kind == SendStructureKind.PREFIX || |
| 218 kind == SendStructureKind.POSTFIX); | 224 kind == SendStructureKind.POSTFIX || |
| 225 kind == SendStructureKind.INDEX_PREFIX || |
| 226 kind == SendStructureKind.INDEX_POSTFIX); |
| 219 if (semantics == null) { | 227 if (semantics == null) { |
| 220 return internalError(node, 'No semantics for $node'); | 228 return internalError(node, 'No semantics for $node'); |
| 221 } | 229 } |
| 222 Selector selector = elements.getSelector(node); | 230 Selector selector = elements.getSelector(node); |
| 223 switch (kind) { | 231 switch (kind) { |
| 224 case SendStructureKind.GET: | 232 case SendStructureKind.GET: |
| 225 return new GetStructure(semantics, selector); | 233 return new GetStructure(semantics, selector); |
| 226 case SendStructureKind.SET: | 234 case SendStructureKind.SET: |
| 227 return new SetStructure(semantics, selector); | 235 return new SetStructure(semantics, selector); |
| 228 case SendStructureKind.INVOKE: | 236 case SendStructureKind.INVOKE: |
| (...skipping 22 matching lines...) Expand all Loading... |
| 251 case SendStructureKind.INDEX_SET: | 259 case SendStructureKind.INDEX_SET: |
| 252 return new IndexSetStructure(semantics, selector); | 260 return new IndexSetStructure(semantics, selector); |
| 253 case SendStructureKind.COMPOUND_INDEX_SET: | 261 case SendStructureKind.COMPOUND_INDEX_SET: |
| 254 Selector getterSelector = | 262 Selector getterSelector = |
| 255 elements.getGetterSelectorInComplexSendSet(node); | 263 elements.getGetterSelectorInComplexSendSet(node); |
| 256 return new CompoundIndexSetStructure( | 264 return new CompoundIndexSetStructure( |
| 257 semantics, | 265 semantics, |
| 258 assignmentOperator, | 266 assignmentOperator, |
| 259 getterSelector, | 267 getterSelector, |
| 260 selector); | 268 selector); |
| 269 case SendStructureKind.INDEX_PREFIX: |
| 270 Selector getterSelector = |
| 271 elements.getGetterSelectorInComplexSendSet(node); |
| 272 return new IndexPrefixStructure( |
| 273 semantics, |
| 274 incDecOperator, |
| 275 getterSelector, |
| 276 selector); |
| 277 case SendStructureKind.INDEX_POSTFIX: |
| 278 Selector getterSelector = |
| 279 elements.getGetterSelectorInComplexSendSet(node); |
| 280 return new IndexPostfixStructure( |
| 281 semantics, |
| 282 incDecOperator, |
| 283 getterSelector, |
| 284 selector); |
| 261 case SendStructureKind.PREFIX: | 285 case SendStructureKind.PREFIX: |
| 262 Selector getterSelector = | 286 Selector getterSelector = |
| 263 elements.getGetterSelectorInComplexSendSet(node); | 287 elements.getGetterSelectorInComplexSendSet(node); |
| 264 return new PrefixStructure( | 288 return new PrefixStructure( |
| 265 semantics, | 289 semantics, |
| 266 incDecOperator, | 290 incDecOperator, |
| 267 getterSelector, | 291 getterSelector, |
| 268 selector); | 292 selector); |
| 269 case SendStructureKind.POSTFIX: | 293 case SendStructureKind.POSTFIX: |
| 270 Selector getterSelector = | 294 Selector getterSelector = |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 // TODO(johnniwinther): Provide an [ErroneousElement]. | 392 // TODO(johnniwinther): Provide an [ErroneousElement]. |
| 369 // This happens for code like `C.this`. | 393 // This happens for code like `C.this`. |
| 370 return new StaticAccess.unresolved(null); | 394 return new StaticAccess.unresolved(null); |
| 371 } else { | 395 } else { |
| 372 return handleStaticallyResolvedAccess(node, element, getter); | 396 return handleStaticallyResolvedAccess(node, element, getter); |
| 373 } | 397 } |
| 374 } | 398 } |
| 375 } | 399 } |
| 376 } | 400 } |
| 377 | 401 |
| OLD | NEW |