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

Side by Side Diff: tests/compiler/dart2js/closure/closure_test.dart

Issue 2951723002: Add closure_test for kernel based members (Closed)
Patch Set: Cleanup Created 3 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, 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 import 'dart:io'; 5 import 'dart:io';
6 import 'package:async_helper/async_helper.dart'; 6 import 'package:async_helper/async_helper.dart';
7 import 'package:compiler/src/closure.dart'; 7 import 'package:compiler/src/closure.dart';
8 import 'package:compiler/src/common.dart';
8 import 'package:compiler/src/compiler.dart'; 9 import 'package:compiler/src/compiler.dart';
9 import 'package:compiler/src/diagnostics/diagnostic_listener.dart'; 10 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
10 import 'package:compiler/src/elements/elements.dart'; 11 import 'package:compiler/src/elements/elements.dart';
11 import 'package:compiler/src/elements/entities.dart'; 12 import 'package:compiler/src/elements/entities.dart';
12 import 'package:compiler/src/tree/nodes.dart'; 13 import 'package:compiler/src/kernel/element_map.dart';
14 import 'package:compiler/src/kernel/kernel_backend_strategy.dart';
15 import 'package:compiler/src/tree/nodes.dart' as ast;
13 import '../equivalence/id_equivalence.dart'; 16 import '../equivalence/id_equivalence.dart';
14 import '../equivalence/id_equivalence_helper.dart'; 17 import '../equivalence/id_equivalence_helper.dart';
18 import 'package:kernel/ast.dart' as ir;
15 19
16 main() { 20 main() {
17 asyncTest(() async { 21 asyncTest(() async {
18 Directory dataDir = new Directory.fromUri(Platform.script.resolve('data')); 22 Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
19 await for (FileSystemEntity entity in dataDir.list()) { 23 await for (FileSystemEntity entity in dataDir.list()) {
20 print('Checking ${entity.uri}'); 24 print('Checking ${entity.uri}');
21 String annotatedCode = await new File.fromUri(entity.uri).readAsString(); 25 String annotatedCode = await new File.fromUri(entity.uri).readAsString();
22 await checkCode(annotatedCode, checkClosureData); 26 await checkCode(annotatedCode, computeClosureData, compileFromSource);
27 await checkCode(annotatedCode, computeKernelClosureData, compileFromDill);
23 } 28 }
24 }); 29 });
25 } 30 }
26 31
27 void checkClosureData( 32 /// Compute closure data mapping for [_member] as a [MemberElement].
28 Compiler compiler, Map<Id, String> expectedMap, MemberEntity _member) { 33 ///
34 /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
35 /// for the data origin.
36 void computeClosureData(Compiler compiler, MemberEntity _member,
37 Map<Id, String> actualMap, Map<Id, SourceSpan> sourceSpanMap) {
29 MemberElement member = _member; 38 MemberElement member = _member;
30 new ClosureChecker(compiler.reporter, expectedMap, member.resolvedAst, 39 ClosureDataLookup<ast.Node> closureDataLookup =
31 compiler.backendStrategy.closureDataLookup as ClosureDataLookup<Node>) 40 compiler.backendStrategy.closureDataLookup as ClosureDataLookup<ast.Node>;
32 .check(); 41 new ClosureAstComputer(compiler.reporter, actualMap, sourceSpanMap,
42 member.resolvedAst, closureDataLookup)
43 .run();
33 } 44 }
34 45
35 class ClosureChecker extends AbstractResolvedAstChecker { 46 /// Compute closure data mapping for [member] as a kernel based element.
36 final ClosureDataLookup<Node> closureDataLookup; 47 ///
48 /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
49 /// for the data origin.
50 void computeKernelClosureData(Compiler compiler, MemberEntity member,
51 Map<Id, String> actualMap, Map<Id, SourceSpan> sourceSpanMap) {
52 KernelBackendStrategy backendStrategy = compiler.backendStrategy;
53 KernelToElementMap elementMap = backendStrategy.elementMap;
54 GlobalLocalsMap localsMap = backendStrategy.globalLocalsMapForTesting;
55 ClosureDataLookup closureDataLookup = backendStrategy.closureDataLookup;
56 new ClosureIrChecker(actualMap, sourceSpanMap, elementMap, member,
57 localsMap.getLocalsMap(member), closureDataLookup)
58 .run(elementMap.getMemberNode(member));
59 }
60
61 /// Ast visitor for computing closure data.
62 class ClosureAstComputer extends AbstractResolvedAstComputer {
63 final ClosureDataLookup<ast.Node> closureDataLookup;
37 final ClosureRepresentationInfo info; 64 final ClosureRepresentationInfo info;
38 65
39 ClosureChecker(DiagnosticReporter reporter, Map<Id, String> expectedMap, 66 ClosureAstComputer(
40 ResolvedAst resolvedAst, this.closureDataLookup) 67 DiagnosticReporter reporter,
68 Map<Id, String> actualMap,
69 Map<Id, Spannable> spannableMap,
70 ResolvedAst resolvedAst,
71 this.closureDataLookup)
41 : this.info = 72 : this.info =
42 closureDataLookup.getClosureRepresentationInfo(resolvedAst.element), 73 closureDataLookup.getClosureRepresentationInfo(resolvedAst.element),
43 super(reporter, expectedMap, resolvedAst); 74 super(reporter, actualMap, spannableMap, resolvedAst);
44 75
45 @override 76 @override
46 String computeNodeValue(Node node, [AstElement element]) { 77 String computeNodeValue(ast.Node node, [AstElement element]) {
47 if (element != null && element.isLocal) { 78 if (element != null && element.isLocal) {
48 LocalElement local = element; 79 LocalElement local = element;
49 StringBuffer sb = new StringBuffer(); 80 return computeLocalValue(info, local);
50 if (info.variableIsUsedInTryOrSync(local)) {
51 sb.write('inTry');
52 }
53 return sb.toString();
54 } 81 }
82 // TODO(johnniwinther,efortuna): Collect data for other nodes?
55 return null; 83 return null;
56 } 84 }
57 85
58 @override 86 @override
59 String computeElementValue(AstElement element) { 87 String computeElementValue(AstElement element) {
88 // TODO(johnniwinther,efortuna): Collect data for the member
89 // (has thisLocal, has box, etc.).
60 return null; 90 return null;
61 } 91 }
62 } 92 }
93
94 /// Kernel IR visitor for computing closure data.
95 class ClosureIrChecker extends AbstractIrComputer {
96 final ClosureDataLookup<ir.Node> closureDataLookup;
97 final ClosureRepresentationInfo info;
98 final KernelToLocalsMap _localsMap;
99
100 ClosureIrChecker(
101 Map<Id, String> actualMap,
102 Map<Id, SourceSpan> sourceSpanMap,
103 KernelToElementMap elementMap,
104 MemberEntity member,
105 this._localsMap,
106 this.closureDataLookup)
107 : this.info = closureDataLookup.getClosureRepresentationInfo(member),
108 super(actualMap, sourceSpanMap);
109
110 @override
111 String computeNodeValue(ir.Node node) {
112 if (node is ir.VariableDeclaration) {
113 Local local = _localsMap.getLocal(node);
114 return computeLocalValue(info, local);
115 }
116 // TODO(johnniwinther,efortuna): Collect data for other nodes?
117 return null;
118 }
119
120 @override
121 String computeMemberValue(ir.Member member) {
122 // TODO(johnniwinther,efortuna): Collect data for the member
123 // (has thisLocal, has box, etc.).
124 return null;
125 }
126 }
127
128 /// Compute a string representation of the data stored for [local] in [info].
129 String computeLocalValue(ClosureRepresentationInfo info, Local local) {
130 StringBuffer sb = new StringBuffer();
131 if (info.variableIsUsedInTryOrSync(local)) {
132 sb.write('inTry');
133 }
134 // TODO(johnniwinther,efortuna): Add more info (captured, boxed etc.).
135 return sb.toString();
136 }
OLDNEW
« no previous file with comments | « tests/compiler/dart2js/bad_output_io_test.dart ('k') | tests/compiler/dart2js/equivalence/id_equivalence.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698