| 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 'common.dart'; | 7 import 'common.dart'; |
| 8 import 'common/names.dart' show | 8 import 'common/names.dart' show |
| 9 Identifiers; | 9 Identifiers; |
| 10 import 'common/resolution.dart' show | 10 import 'common/resolution.dart' show |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 } | 96 } |
| 97 } | 97 } |
| 98 | 98 |
| 99 /// Common interface for [BoxFieldElement] and [ClosureFieldElement] as | 99 /// Common interface for [BoxFieldElement] and [ClosureFieldElement] as |
| 100 /// non-elements. | 100 /// non-elements. |
| 101 abstract class CapturedVariable implements Element {} | 101 abstract class CapturedVariable implements Element {} |
| 102 | 102 |
| 103 // TODO(ahe): These classes continuously cause problems. We need to | 103 // TODO(ahe): These classes continuously cause problems. We need to |
| 104 // find a more general solution. | 104 // find a more general solution. |
| 105 class ClosureFieldElement extends ElementX | 105 class ClosureFieldElement extends ElementX |
| 106 implements FieldElement, CapturedVariable { | 106 implements FieldElement, CapturedVariable, PrivatelyNamedJSEntity { |
| 107 /// The [BoxLocal] or [LocalElement] being accessed through the field. | 107 /// The [BoxLocal] or [LocalElement] being accessed through the field. |
| 108 final Local local; | 108 final Local local; |
| 109 | 109 |
| 110 ClosureFieldElement(String name, | 110 ClosureFieldElement(String name, |
| 111 this.local, | 111 this.local, |
| 112 ClosureClassElement enclosing) | 112 ClosureClassElement enclosing) |
| 113 : super(name, ElementKind.FIELD, enclosing); | 113 : super(name, ElementKind.FIELD, enclosing); |
| 114 | 114 |
| 115 /// Use [closureClass] instead. | 115 /// Use [closureClass] instead. |
| 116 @deprecated | 116 @deprecated |
| 117 get enclosingElement => super.enclosingElement; | 117 get enclosingElement => super.enclosingElement; |
| 118 | 118 |
| 119 ClosureClassElement get closureClass => super.enclosingElement; | 119 ClosureClassElement get closureClass => super.enclosingElement; |
| 120 | 120 |
| 121 MemberElement get memberContext => closureClass.methodElement.memberContext; | 121 MemberElement get memberContext => closureClass.methodElement.memberContext; |
| 122 | 122 |
| 123 @override |
| 124 Entity get declaredEntity => local; |
| 125 @override |
| 126 Entity get rootOfScope => closureClass; |
| 127 |
| 123 bool get hasNode => false; | 128 bool get hasNode => false; |
| 124 | 129 |
| 125 Node get node { | 130 Node get node { |
| 126 throw new SpannableAssertionFailure(local, | 131 throw new SpannableAssertionFailure(local, |
| 127 'Should not access node of ClosureFieldElement.'); | 132 'Should not access node of ClosureFieldElement.'); |
| 128 } | 133 } |
| 129 | 134 |
| 130 bool get hasResolvedAst => hasTreeElements; | 135 bool get hasResolvedAst => hasTreeElements; |
| 131 | 136 |
| 132 ResolvedAst get resolvedAst { | 137 ResolvedAst get resolvedAst { |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 class BoxLocal extends Local { | 244 class BoxLocal extends Local { |
| 240 final String name; | 245 final String name; |
| 241 final ExecutableElement executableContext; | 246 final ExecutableElement executableContext; |
| 242 | 247 |
| 243 BoxLocal(this.name, this.executableContext); | 248 BoxLocal(this.name, this.executableContext); |
| 244 } | 249 } |
| 245 | 250 |
| 246 // TODO(ngeoffray, ahe): These classes continuously cause problems. We need to | 251 // TODO(ngeoffray, ahe): These classes continuously cause problems. We need to |
| 247 // find a more general solution. | 252 // find a more general solution. |
| 248 class BoxFieldElement extends ElementX | 253 class BoxFieldElement extends ElementX |
| 249 implements TypedElement, CapturedVariable, FieldElement { | 254 implements TypedElement, CapturedVariable, FieldElement, |
| 255 PrivatelyNamedJSEntity { |
| 250 final BoxLocal box; | 256 final BoxLocal box; |
| 251 | 257 |
| 252 BoxFieldElement(String name, this.variableElement, BoxLocal box) | 258 BoxFieldElement(String name, this.variableElement, |
| 259 BoxLocal box) |
| 253 : this.box = box, | 260 : this.box = box, |
| 254 super(name, ElementKind.FIELD, box.executableContext); | 261 super(name, ElementKind.FIELD, box.executableContext); |
| 255 | 262 |
| 256 DartType computeType(Resolution resolution) => type; | 263 DartType computeType(Resolution resolution) => type; |
| 257 | 264 |
| 258 DartType get type => variableElement.type; | 265 DartType get type => variableElement.type; |
| 259 | 266 |
| 267 @override |
| 268 Entity get declaredEntity => variableElement; |
| 269 @override |
| 270 Entity get rootOfScope => box; |
| 271 |
| 260 final VariableElement variableElement; | 272 final VariableElement variableElement; |
| 261 | 273 |
| 262 accept(ElementVisitor visitor, arg) { | 274 accept(ElementVisitor visitor, arg) { |
| 263 return visitor.visitBoxFieldElement(this, arg); | 275 return visitor.visitBoxFieldElement(this, arg); |
| 264 } | 276 } |
| 265 | 277 |
| 266 @override | 278 @override |
| 267 bool get hasNode => false; | 279 bool get hasNode => false; |
| 268 | 280 |
| 269 @override | 281 @override |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 | 524 |
| 513 /// Generate a unique name for the [id]th closure field, with proposed name | 525 /// Generate a unique name for the [id]th closure field, with proposed name |
| 514 /// [name]. | 526 /// [name]. |
| 515 /// | 527 /// |
| 516 /// The result is used as the name of [ClosureFieldElement]s, and must | 528 /// The result is used as the name of [ClosureFieldElement]s, and must |
| 517 /// therefore be unique to avoid breaking an invariant in the element model | 529 /// therefore be unique to avoid breaking an invariant in the element model |
| 518 /// (classes cannot declare multiple fields with the same name). | 530 /// (classes cannot declare multiple fields with the same name). |
| 519 /// | 531 /// |
| 520 /// Also, the names should be distinct from real field names to prevent | 532 /// Also, the names should be distinct from real field names to prevent |
| 521 /// clashes with selectors for those fields. | 533 /// clashes with selectors for those fields. |
| 534 /// |
| 535 /// These names are not used in generated code, just as element name. |
| 522 String getClosureVariableName(String name, int id) { | 536 String getClosureVariableName(String name, int id) { |
| 523 return "_captured_${name}_$id"; | 537 return "_captured_${name}_$id"; |
| 524 } | 538 } |
| 525 | 539 |
| 526 /// Generate a unique name for the [id]th box field, with proposed name | 540 /// Generate a unique name for the [id]th box field, with proposed name |
| 527 /// [name]. | 541 /// [name]. |
| 528 /// | 542 /// |
| 529 /// The result is used as the name of [BoxFieldElement]s, and must | 543 /// The result is used as the name of [BoxFieldElement]s, and must |
| 530 /// therefore be unique to avoid breaking an invariant in the element model | 544 /// therefore be unique to avoid breaking an invariant in the element model |
| 531 /// (classes cannot declare multiple fields with the same name). | 545 /// (classes cannot declare multiple fields with the same name). |
| 532 /// | 546 /// |
| 533 /// Also, the names should be distinct from real field names to prevent | 547 /// Also, the names should be distinct from real field names to prevent |
| 534 /// clashes with selectors for those fields. | 548 /// clashes with selectors for those fields. |
| 549 /// |
| 550 /// These names are not used in generated code, just as element name. |
| 535 String getBoxFieldName(int id) { | 551 String getBoxFieldName(int id) { |
| 536 return "_box_$id"; | 552 return "_box_$id"; |
| 537 } | 553 } |
| 538 | 554 |
| 539 bool isCapturedVariable(Local element) { | 555 bool isCapturedVariable(Local element) { |
| 540 return _capturedVariableMapping.containsKey(element); | 556 return _capturedVariableMapping.containsKey(element); |
| 541 } | 557 } |
| 542 | 558 |
| 543 void addCapturedVariable(Node node, Local variable) { | 559 void addCapturedVariable(Node node, Local variable) { |
| 544 if (_capturedVariableMapping[variable] != null) { | 560 if (_capturedVariableMapping[variable] != null) { |
| (...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1127 | 1143 |
| 1128 String get name => typeVariable.name; | 1144 String get name => typeVariable.name; |
| 1129 | 1145 |
| 1130 int get hashCode => typeVariable.hashCode; | 1146 int get hashCode => typeVariable.hashCode; |
| 1131 | 1147 |
| 1132 bool operator ==(other) { | 1148 bool operator ==(other) { |
| 1133 if (other is! TypeVariableLocal) return false; | 1149 if (other is! TypeVariableLocal) return false; |
| 1134 return typeVariable == other.typeVariable; | 1150 return typeVariable == other.typeVariable; |
| 1135 } | 1151 } |
| 1136 } | 1152 } |
| 1153 |
| 1154 /// |
| 1155 /// Move the below classes to a JS model eventually. |
| 1156 /// |
| 1157 abstract class JSEntity implements Entity { |
| 1158 Entity get declaredEntity; |
| 1159 } |
| 1160 |
| 1161 abstract class PrivatelyNamedJSEntity implements JSEntity { |
| 1162 Entity get rootOfScope; |
| 1163 } |
| OLD | NEW |