| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2012, 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; | 5 part of dart2js; | 
| 6 | 6 | 
| 7 abstract class ResolvedVisitor<R> extends Visitor<R> { | 7 abstract class ResolvedVisitor<R> extends Visitor<R> { | 
| 8   TreeElements elements; | 8   TreeElements elements; | 
| 9 | 9 | 
| 10   ResolvedVisitor(this.elements); | 10   ResolvedVisitor(this.elements); | 
| 11 | 11 | 
| 12   R visitSend(Send node) { | 12   R visitSend(Send node) { | 
| 13     if (node.isSuperCall) { | 13     if (node.isSuperCall) { | 
| 14       return visitSuperSend(node); | 14       return visitSuperSend(node); | 
| 15     } else if (node.isOperator) { | 15     } else if (node.isOperator) { | 
| 16       return visitOperatorSend(node); | 16       return visitOperatorSend(node); | 
| 17     } else if (node.isPropertyAccess) { | 17     } else if (node.isPropertyAccess) { | 
| 18       return visitGetterSend(node); | 18       Element element = elements[node]; | 
|  | 19       if (!Elements.isUnresolved(element) && element.impliesType()) { | 
|  | 20         // A reference to a class literal, typedef or type variable. | 
|  | 21         return visitTypeReferenceSend(node); | 
|  | 22       } else { | 
|  | 23         return visitGetterSend(node); | 
|  | 24       } | 
| 19     } else if (Elements.isClosureSend(node, elements[node])) { | 25     } else if (Elements.isClosureSend(node, elements[node])) { | 
| 20       return visitClosureSend(node); | 26       return visitClosureSend(node); | 
| 21     } else { | 27     } else { | 
| 22       Element element = elements[node]; | 28       Element element = elements[node]; | 
| 23       if (Elements.isUnresolved(element)) { | 29       if (Elements.isUnresolved(element)) { | 
| 24         if (element == null) { | 30         if (element == null) { | 
| 25           // Example: f() with 'f' unbound. | 31           // Example: f() with 'f' unbound. | 
| 26           // This can only happen inside an instance method. | 32           // This can only happen inside an instance method. | 
| 27           return visitDynamicSend(node); | 33           return visitDynamicSend(node); | 
| 28         } else { | 34         } else { | 
| 29           return visitStaticSend(node); | 35           return visitStaticSend(node); | 
| 30         } | 36         } | 
| 31       } else if (element.kind == ElementKind.CLASS) { | 37       } else if (element.impliesType()) { | 
| 32         internalError("Cannot generate code for send", node: node); | 38         // A reference to a class literal, typedef or type variable. | 
|  | 39         return visitTypeReferenceSend(node); | 
| 33       } else if (element.isInstanceMember()) { | 40       } else if (element.isInstanceMember()) { | 
| 34         // Example: f() with 'f' bound to instance method. | 41         // Example: f() with 'f' bound to instance method. | 
| 35         return visitDynamicSend(node); | 42         return visitDynamicSend(node); | 
| 36       } else if (identical(element.kind, ElementKind.FOREIGN)) { | 43       } else if (identical(element.kind, ElementKind.FOREIGN)) { | 
| 37         return visitForeignSend(node); | 44         return visitForeignSend(node); | 
| 38       } else if (!element.isInstanceMember()) { | 45       } else if (!element.isInstanceMember()) { | 
| 39         // Example: A.f() or f() with 'f' bound to a static function. | 46         // Example: A.f() or f() with 'f' bound to a static function. | 
| 40         // Also includes new A() or new A.named() which is treated like a | 47         // Also includes new A() or new A.named() which is treated like a | 
| 41         // static call to a factory. | 48         // static call to a factory. | 
| 42         return visitStaticSend(node); | 49         return visitStaticSend(node); | 
| 43       } else { | 50       } else { | 
| 44         internalError("Cannot generate code for send", node: node); | 51         internalError("Cannot generate code for send", node: node); | 
| 45       } | 52       } | 
| 46     } | 53     } | 
| 47   } | 54   } | 
| 48 | 55 | 
| 49   abstract R visitSuperSend(Send node); | 56   abstract R visitSuperSend(Send node); | 
| 50   abstract R visitOperatorSend(Send node); | 57   abstract R visitOperatorSend(Send node); | 
| 51   abstract R visitGetterSend(Send node); | 58   abstract R visitGetterSend(Send node); | 
| 52   abstract R visitClosureSend(Send node); | 59   abstract R visitClosureSend(Send node); | 
| 53   abstract R visitDynamicSend(Send node); | 60   abstract R visitDynamicSend(Send node); | 
| 54   abstract R visitForeignSend(Send node); | 61   abstract R visitForeignSend(Send node); | 
| 55   abstract R visitStaticSend(Send node); | 62   abstract R visitStaticSend(Send node); | 
|  | 63   abstract R visitTypeReferenceSend(Send node); | 
| 56 | 64 | 
| 57   abstract void internalError(String reason, {Node node}); | 65   abstract void internalError(String reason, {Node node}); | 
| 58 | 66 | 
| 59   R visitNode(Node node) { | 67   R visitNode(Node node) { | 
| 60     internalError("Unhandled node", node: node); | 68     internalError("Unhandled node", node: node); | 
| 61   } | 69   } | 
| 62 } | 70 } | 
| OLD | NEW | 
|---|