Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(130)

Unified Diff: pkg/compiler/lib/src/js_model/closure.dart

Issue 2984643002: Add Class/MemberDefinition to handle synthesized classes/members (Closed)
Patch Set: Updated cf. comment Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/compiler/lib/src/kernel/element_map.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/js_model/closure.dart
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index 58fa5c777e5b33559dbec10642bceec1a056b490..bd8cafbec349605493088faf96ba71db12b6a679 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -5,6 +5,7 @@
import 'package:kernel/ast.dart' as ir;
import '../closure.dart';
+import '../common.dart';
import '../common/tasks.dart';
import '../elements/entities.dart';
import '../kernel/element_map.dart';
@@ -66,7 +67,10 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> {
}
if (entity.isAbstract) return;
if (entity.isField && !entity.isInstanceMember) {
- ir.Field field = _elementMap.getMemberNode(entity);
+ MemberDefinition definition = _elementMap.getMemberDefinition(entity);
+ assert(definition.kind == MemberKind.regular,
+ failedAt(entity, "Unexpected member definition $definition"));
+ ir.Field field = definition.node;
// Skip top-level/static fields without an initializer.
if (field.initializer == null) return;
}
@@ -86,7 +90,15 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> {
Map<ir.TreeNode, ScopeInfo> closuresToGenerate,
ClosedWorldRefiner closedWorldRefiner) {
if (_scopeMap.keys.contains(entity)) return;
- ir.Node node = _elementMap.getMemberNode(entity);
+ MemberDefinition definition = _elementMap.getMemberDefinition(entity);
+ switch (definition.kind) {
+ case MemberKind.regular:
+ case MemberKind.constructor:
+ break;
+ default:
+ failedAt(entity, "Unexpected member definition $definition");
+ }
+ ir.Node node = definition.node;
if (_scopesCapturedInClosureMap.keys.contains(node)) return;
CapturedScopeBuilder translator = new CapturedScopeBuilder(
_scopesCapturedInClosureMap,
@@ -114,7 +126,7 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> {
ClosedWorldRefiner closedWorldRefiner) {
Entity entity;
KernelClosureClass closureClass =
- new KernelClosureClass.fromScopeInfo(info);
+ new KernelClosureClass.fromScopeInfo(info, node.location);
if (node is ir.FunctionNode) {
// We want the original declaration where that function is used to point
// to the correct closure class.
@@ -153,9 +165,18 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> {
// TODO(efortuna): Eventually scopesCapturedInClosureMap[node] should always
// be non-null, and we should just test that with an assert.
@override
- CapturedScope getCapturedScope(MemberEntity entity) =>
- _scopesCapturedInClosureMap[_elementMap.getMemberNode(entity)] ??
- const CapturedScope();
+ CapturedScope getCapturedScope(MemberEntity entity) {
+ MemberDefinition definition = _elementMap.getMemberDefinition(entity);
+ switch (definition.kind) {
+ case MemberKind.regular:
+ case MemberKind.constructor:
+ case MemberKind.constructorBody:
+ return _scopesCapturedInClosureMap[definition.node] ??
+ const CapturedScope();
+ default:
+ throw failedAt(entity, "Unexpected member definition $definition");
+ }
+ }
@override
// TODO(efortuna): Eventually scopesCapturedInClosureMap[node] should always
@@ -235,6 +256,8 @@ class KernelCapturedLoopScope extends KernelCapturedScope
// TODO(johnniwinther): Add unittest for the computed [ClosureClass].
class KernelClosureClass extends KernelScopeInfo
implements ClosureRepresentationInfo, JClass {
+ final ir.Location location;
+
// TODO(efortuna): Generate unique name for each closure class.
final String name = 'ClosureClass';
@@ -244,7 +267,7 @@ class KernelClosureClass extends KernelScopeInfo
final Map<Local, JField> localToFieldMap = new Map<Local, JField>();
- KernelClosureClass.fromScopeInfo(KernelScopeInfo info)
+ KernelClosureClass.fromScopeInfo(KernelScopeInfo info, this.location)
: super.from(info.thisLocal, info);
// TODO(efortuna): Implement.
@@ -288,3 +311,18 @@ class KernelClosureClass extends KernelScopeInfo
String toString() => '${jsElementPrefix}class($name)';
}
+
+class ClosureClassDefinition implements ClassDefinition {
+ final ClassEntity cls;
+ final ir.Location location;
+
+ ClosureClassDefinition(this.cls, this.location);
+
+ ClassKind get kind => ClassKind.closure;
+
+ ir.Node get node =>
+ throw new UnsupportedError('ClosureClassDefinition.node for $cls');
+
+ String toString() =>
+ 'ClosureClassDefinition(kind:$kind,cls:$cls,location:$location)';
+}
« no previous file with comments | « no previous file | pkg/compiler/lib/src/kernel/element_map.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698