Index: pkg/compiler/lib/src/kernel/element_map_impl.dart |
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart |
index 08d470cb96c72dec0178ac673d1d892362287b94..9580ab469dad89c44fa8682fc8a43f54d9f80826 100644 |
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart |
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart |
@@ -31,6 +31,7 @@ import '../js_backend/native_data.dart'; |
import '../js_backend/no_such_method_registry.dart'; |
import '../js_backend/runtime_types.dart'; |
import '../js_model/closure.dart'; |
+import '../js_model/closure_visitors.dart' show ThisVariable; |
import '../js_model/elements.dart'; |
import '../js_model/locals.dart'; |
import '../native/enqueue.dart'; |
@@ -2319,10 +2320,17 @@ class JsKernelToElementMap extends KernelToElementMapBase |
int fieldNumber, |
NodeBox box, |
KernelToLocalsMap localsMap) { |
- // NOTE: This construction order may be slightly different than the |
+ // NOTE: This construction *order* may be slightly different than the |
// old Element version. The old version did all the boxed items and then |
// all the others. |
- Local capturedLocal = localsMap.getLocalVariable(variable); |
+ ir.Node sourceNode = variable; |
+ Local capturedLocal; |
+ if (variable is ThisVariable) { |
+ capturedLocal = cls.thisLocal; |
+ sourceNode = getMemberDefinition(member).node; |
+ } else { |
+ capturedLocal = localsMap.getLocalVariable(variable); |
+ } |
JRecordField field = boxedCapturedVariables[capturedLocal]; |
FieldEntity closureField = new JClosureField( |
_getClosureVariableName(capturedLocal.name, fieldNumber), |
@@ -2333,9 +2341,9 @@ class JsKernelToElementMap extends KernelToElementMapBase |
_memberList.add(closureField); |
_memberData.add(new ClosureFieldData(new ClosureMemberDefinition( |
cls.localToFieldMap[capturedLocal], |
- computeSourceSpanFromTreeNode(variable), |
+ computeSourceSpanFromTreeNode(sourceNode), |
MemberKind.closureField, |
- variable))); |
+ sourceNode))); |
memberMap[closureField.name] = closureField; |
if (boxedCapturedVariables.containsKey(capturedLocal)) { |
cls.localToFieldMap[field.box] = closureField; |