| Index: tests/compiler/dart2js/closure/closure_test.dart
|
| diff --git a/tests/compiler/dart2js/closure/closure_test.dart b/tests/compiler/dart2js/closure/closure_test.dart
|
| index 1b69d6d370852d20a31dbd2c98a8f246bb52366b..8db19bd1915d59c5dc17b814634bc902a93667df 100644
|
| --- a/tests/compiler/dart2js/closure/closure_test.dart
|
| +++ b/tests/compiler/dart2js/closure/closure_test.dart
|
| @@ -5,13 +5,17 @@
|
| import 'dart:io';
|
| import 'package:async_helper/async_helper.dart';
|
| import 'package:compiler/src/closure.dart';
|
| +import 'package:compiler/src/common.dart';
|
| import 'package:compiler/src/compiler.dart';
|
| import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
|
| import 'package:compiler/src/elements/elements.dart';
|
| import 'package:compiler/src/elements/entities.dart';
|
| -import 'package:compiler/src/tree/nodes.dart';
|
| +import 'package:compiler/src/kernel/element_map.dart';
|
| +import 'package:compiler/src/kernel/kernel_backend_strategy.dart';
|
| +import 'package:compiler/src/tree/nodes.dart' as ast;
|
| import '../equivalence/id_equivalence.dart';
|
| import '../equivalence/id_equivalence_helper.dart';
|
| +import 'package:kernel/ast.dart' as ir;
|
|
|
| main() {
|
| asyncTest(() async {
|
| @@ -19,44 +23,114 @@ main() {
|
| await for (FileSystemEntity entity in dataDir.list()) {
|
| print('Checking ${entity.uri}');
|
| String annotatedCode = await new File.fromUri(entity.uri).readAsString();
|
| - await checkCode(annotatedCode, checkClosureData);
|
| + await checkCode(annotatedCode, computeClosureData, compileFromSource);
|
| + await checkCode(annotatedCode, computeKernelClosureData, compileFromDill);
|
| }
|
| });
|
| }
|
|
|
| -void checkClosureData(
|
| - Compiler compiler, Map<Id, String> expectedMap, MemberEntity _member) {
|
| +/// Compute closure data mapping for [_member] as a [MemberElement].
|
| +///
|
| +/// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
|
| +/// for the data origin.
|
| +void computeClosureData(Compiler compiler, MemberEntity _member,
|
| + Map<Id, String> actualMap, Map<Id, SourceSpan> sourceSpanMap) {
|
| MemberElement member = _member;
|
| - new ClosureChecker(compiler.reporter, expectedMap, member.resolvedAst,
|
| - compiler.backendStrategy.closureDataLookup as ClosureDataLookup<Node>)
|
| - .check();
|
| + ClosureDataLookup<ast.Node> closureDataLookup =
|
| + compiler.backendStrategy.closureDataLookup as ClosureDataLookup<ast.Node>;
|
| + new ClosureAstComputer(compiler.reporter, actualMap, sourceSpanMap,
|
| + member.resolvedAst, closureDataLookup)
|
| + .run();
|
| }
|
|
|
| -class ClosureChecker extends AbstractResolvedAstChecker {
|
| - final ClosureDataLookup<Node> closureDataLookup;
|
| +/// Compute closure data mapping for [member] as a kernel based element.
|
| +///
|
| +/// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
|
| +/// for the data origin.
|
| +void computeKernelClosureData(Compiler compiler, MemberEntity member,
|
| + Map<Id, String> actualMap, Map<Id, SourceSpan> sourceSpanMap) {
|
| + KernelBackendStrategy backendStrategy = compiler.backendStrategy;
|
| + KernelToElementMap elementMap = backendStrategy.elementMap;
|
| + GlobalLocalsMap localsMap = backendStrategy.globalLocalsMapForTesting;
|
| + ClosureDataLookup closureDataLookup = backendStrategy.closureDataLookup;
|
| + new ClosureIrChecker(actualMap, sourceSpanMap, elementMap, member,
|
| + localsMap.getLocalsMap(member), closureDataLookup)
|
| + .run(elementMap.getMemberNode(member));
|
| +}
|
| +
|
| +/// Ast visitor for computing closure data.
|
| +class ClosureAstComputer extends AbstractResolvedAstComputer {
|
| + final ClosureDataLookup<ast.Node> closureDataLookup;
|
| final ClosureRepresentationInfo info;
|
|
|
| - ClosureChecker(DiagnosticReporter reporter, Map<Id, String> expectedMap,
|
| - ResolvedAst resolvedAst, this.closureDataLookup)
|
| + ClosureAstComputer(
|
| + DiagnosticReporter reporter,
|
| + Map<Id, String> actualMap,
|
| + Map<Id, Spannable> spannableMap,
|
| + ResolvedAst resolvedAst,
|
| + this.closureDataLookup)
|
| : this.info =
|
| closureDataLookup.getClosureRepresentationInfo(resolvedAst.element),
|
| - super(reporter, expectedMap, resolvedAst);
|
| + super(reporter, actualMap, spannableMap, resolvedAst);
|
|
|
| @override
|
| - String computeNodeValue(Node node, [AstElement element]) {
|
| + String computeNodeValue(ast.Node node, [AstElement element]) {
|
| if (element != null && element.isLocal) {
|
| LocalElement local = element;
|
| - StringBuffer sb = new StringBuffer();
|
| - if (info.variableIsUsedInTryOrSync(local)) {
|
| - sb.write('inTry');
|
| - }
|
| - return sb.toString();
|
| + return computeLocalValue(info, local);
|
| }
|
| + // TODO(johnniwinther,efortuna): Collect data for other nodes?
|
| return null;
|
| }
|
|
|
| @override
|
| String computeElementValue(AstElement element) {
|
| + // TODO(johnniwinther,efortuna): Collect data for the member
|
| + // (has thisLocal, has box, etc.).
|
| + return null;
|
| + }
|
| +}
|
| +
|
| +/// Kernel IR visitor for computing closure data.
|
| +class ClosureIrChecker extends AbstractIrComputer {
|
| + final ClosureDataLookup<ir.Node> closureDataLookup;
|
| + final ClosureRepresentationInfo info;
|
| + final KernelToLocalsMap _localsMap;
|
| +
|
| + ClosureIrChecker(
|
| + Map<Id, String> actualMap,
|
| + Map<Id, SourceSpan> sourceSpanMap,
|
| + KernelToElementMap elementMap,
|
| + MemberEntity member,
|
| + this._localsMap,
|
| + this.closureDataLookup)
|
| + : this.info = closureDataLookup.getClosureRepresentationInfo(member),
|
| + super(actualMap, sourceSpanMap);
|
| +
|
| + @override
|
| + String computeNodeValue(ir.Node node) {
|
| + if (node is ir.VariableDeclaration) {
|
| + Local local = _localsMap.getLocal(node);
|
| + return computeLocalValue(info, local);
|
| + }
|
| + // TODO(johnniwinther,efortuna): Collect data for other nodes?
|
| return null;
|
| }
|
| +
|
| + @override
|
| + String computeMemberValue(ir.Member member) {
|
| + // TODO(johnniwinther,efortuna): Collect data for the member
|
| + // (has thisLocal, has box, etc.).
|
| + return null;
|
| + }
|
| +}
|
| +
|
| +/// Compute a string representation of the data stored for [local] in [info].
|
| +String computeLocalValue(ClosureRepresentationInfo info, Local local) {
|
| + StringBuffer sb = new StringBuffer();
|
| + if (info.variableIsUsedInTryOrSync(local)) {
|
| + sb.write('inTry');
|
| + }
|
| + // TODO(johnniwinther,efortuna): Add more info (captured, boxed etc.).
|
| + return sb.toString();
|
| }
|
|
|