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 library closureToClassMapper; | 5 library closureToClassMapper; |
6 | 6 |
7 import "elements/elements.dart"; | 7 import "elements/elements.dart"; |
8 import "dart2jslib.dart"; | 8 import "dart2jslib.dart"; |
9 import "tree/tree.dart"; | 9 import "tree/tree.dart"; |
10 import "util/util.dart"; | 10 import "util/util.dart"; |
(...skipping 27 matching lines...) Expand all Loading... |
38 } | 38 } |
39 assert(closureMappingCache[node] != null); | 39 assert(closureMappingCache[node] != null); |
40 return closureMappingCache[node]; | 40 return closureMappingCache[node]; |
41 }); | 41 }); |
42 } | 42 } |
43 | 43 |
44 ClosureClassMap getMappingForNestedFunction(FunctionExpression node) { | 44 ClosureClassMap getMappingForNestedFunction(FunctionExpression node) { |
45 return measure(() { | 45 return measure(() { |
46 ClosureClassMap nestedClosureData = closureMappingCache[node]; | 46 ClosureClassMap nestedClosureData = closureMappingCache[node]; |
47 if (nestedClosureData == null) { | 47 if (nestedClosureData == null) { |
48 // TODO(floitsch): we can only assume that the reason for not having a | 48 compiler.internalError("No closure cache", node: node); |
49 // closure data here is, because the function is inside an initializer. | |
50 compiler.unimplemented("Closures inside initializers", node: node); | |
51 } | 49 } |
52 return nestedClosureData; | 50 return nestedClosureData; |
53 }); | 51 }); |
54 } | 52 } |
55 } | 53 } |
56 | 54 |
57 class ClosureFieldElement extends Element { | 55 class ClosureFieldElement extends Element { |
58 ClosureFieldElement(SourceString name, ClassElement enclosing) | 56 ClosureFieldElement(SourceString name, ClassElement enclosing) |
59 : super(name, ElementKind.FIELD, enclosing); | 57 : super(name, ElementKind.FIELD, enclosing); |
60 | 58 |
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 if (element.isParameter()) { | 601 if (element.isParameter()) { |
604 // TODO(ahe): This is a hack. This method should *not* call | 602 // TODO(ahe): This is a hack. This method should *not* call |
605 // visitChildren. | 603 // visitChildren. |
606 return node.name.accept(this); | 604 return node.name.accept(this); |
607 } | 605 } |
608 | 606 |
609 visitInvokable(element, node, () { | 607 visitInvokable(element, node, () { |
610 // TODO(ahe): This is problematic. The backend should not repeat | 608 // TODO(ahe): This is problematic. The backend should not repeat |
611 // the work of the resolver. It is the resolver's job to create | 609 // the work of the resolver. It is the resolver's job to create |
612 // parameters, etc. Other phases should only visit statements. | 610 // parameters, etc. Other phases should only visit statements. |
613 // TODO(floitsch): we avoid visiting the initializers on purpose so that | |
614 // we get an error-message later in the builder. | |
615 if (node.parameters != null) node.parameters.accept(this); | 611 if (node.parameters != null) node.parameters.accept(this); |
| 612 if (node.initializers != null) node.initializers.accept(this); |
616 if (node.body != null) node.body.accept(this); | 613 if (node.body != null) node.body.accept(this); |
617 }); | 614 }); |
618 } | 615 } |
619 | 616 |
620 visitFunctionDeclaration(FunctionDeclaration node) { | 617 visitFunctionDeclaration(FunctionDeclaration node) { |
621 node.visitChildren(this); | 618 node.visitChildren(this); |
622 declareLocal(elements[node]); | 619 declareLocal(elements[node]); |
623 } | 620 } |
624 | 621 |
625 visitTryStatement(TryStatement node) { | 622 visitTryStatement(TryStatement node) { |
626 // TODO(ngeoffray): implement finer grain state. | 623 // TODO(ngeoffray): implement finer grain state. |
627 bool oldInTryStatement = inTryStatement; | 624 bool oldInTryStatement = inTryStatement; |
628 inTryStatement = true; | 625 inTryStatement = true; |
629 node.visitChildren(this); | 626 node.visitChildren(this); |
630 inTryStatement = oldInTryStatement; | 627 inTryStatement = oldInTryStatement; |
631 } | 628 } |
632 } | 629 } |
OLD | NEW |