Chromium Code Reviews| Index: pkg/kernel/test/treeshaker_stacktracer.dart |
| diff --git a/pkg/kernel/test/treeshaker_stacktracer.dart b/pkg/kernel/test/treeshaker_stacktracer.dart |
| deleted file mode 100644 |
| index 74afbaeaefcc5259526f3e03bcb1dd9b5d0af6e4..0000000000000000000000000000000000000000 |
| --- a/pkg/kernel/test/treeshaker_stacktracer.dart |
| +++ /dev/null |
| @@ -1,122 +0,0 @@ |
| -// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| -// for details. All rights reserved. Use of this source code is governed by a |
| -// BSD-style license that can be found in the LICENSE file. |
| -library kernel.treeshaker.stacktracer; |
| - |
| -import 'package:kernel/kernel.dart'; |
| -import 'package:kernel/transformations/treeshaker.dart'; |
| -import 'dart:io'; |
| -import 'package:ansicolor/ansicolor.dart'; |
|
asgerf
2016/11/23 13:31:56
This depends on the ansicolor package which is not
|
| - |
| -String usage = ''' |
| -USAGE: treeshaker_stacktracer FILE.dill STACKTRACE.txt |
| - |
| -Given a program and a stack trace from it, highlight the stack trace entries |
| -that the tree shaker marked as unreachable. These are indicative of bugs |
| -in the tree shaker since their presence in the stack trace proves them reachable. |
| - |
| -Example usage: |
| - ${comment("# Not shown: insert a 'throw' in testcase.dart")} |
| - dart testcase.dart > error.txt ${comment("# Get the stack trace")} |
| - dartk testcase.dart -l -otestcase.dill ${comment("# Compile binary")} |
| - dart test/treeshaker_stacktracer.dart testcase.dill error.txt ${comment("# Analyze")} |
| -'''; |
| - |
| -String legend = ''' |
| -Legend: |
| - ${reachable('reachable member')} or ${reachable('instantiated class')} |
| - ${unreachable('unreachable member')} or ${unreachable('uninstantiated class')} |
| - ${unknown('name unrecognized')} |
| -'''; |
| - |
| -// TODO: Also support the stack trace format from stack_trace. |
| -RegExp stackTraceEntry = new RegExp(r'(#[0-9]+\s+)([a-zA-Z0-9_$.&<> ]+) \((.*)\)'); |
| - |
| -AnsiPen reachable = new AnsiPen()..green(); |
| -AnsiPen unreachable = new AnsiPen()..red(); |
| -AnsiPen unknown = new AnsiPen()..gray(level: 0.5); |
| -AnsiPen filecolor = new AnsiPen()..gray(level: 0.5); |
| -AnsiPen comment = new AnsiPen()..gray(level: 0.5); |
| - |
| -String stackTraceName(Member member) { |
| - String name = member.name?.name; |
| - String className = member.enclosingClass?.name; |
| - if (member is Constructor && name != null) { |
| - return '$className.$className'; |
| - } else if (className != null) { |
| - return '$className.$name'; |
| - } else { |
| - return name; |
| - } |
| -} |
| - |
| -int findReachablePrefix(String name, Set<String> strings) { |
| - for (int index = name.length; |
| - index > 0; |
| - index = name.lastIndexOf('.', index - 1)) { |
| - if (strings.contains(name.substring(0, index))) { |
| - return index; |
| - } |
| - } |
| - return 0; |
| -} |
| - |
| -String shortenFilename(String filename) { |
| - if (filename.startsWith('file:')) { |
| - int libIndex = filename.lastIndexOf('lib/'); |
| - if (libIndex != -1) { |
| - return filename.substring(libIndex + 'lib/'.length); |
| - } |
| - } |
| - return filename; |
| -} |
| - |
| -main(List<String> args) { |
| - if (args.length != 2) { |
| - print(usage); |
| - exit(1); |
| - } |
| - List<String> stackTrace = new File(args[1]).readAsLinesSync(); |
| - Program program = loadProgramFromBinary(args[0]); |
| - TreeShaker shaker = new TreeShaker(program); |
| - Set<String> reachablePatterns = new Set<String>(); |
| - Set<String> allMembers = new Set<String>(); |
| - Set<String> instantiatedClasses = new Set<String>(); |
| - void visitMember(Member member) { |
| - allMembers.add(stackTraceName(member)); |
| - if (shaker.isMemberUsed(member)) { |
| - reachablePatterns.add(stackTraceName(member)); |
| - } |
| - } |
| - for (var library in program.libraries) { |
| - for (var classNode in library.classes) { |
| - if (shaker.isInstantiated(classNode)) { |
| - instantiatedClasses.add(classNode.name); |
| - } |
| - classNode.members.forEach(visitMember); |
| - } |
| - library.members.forEach(visitMember); |
| - } |
| - for (String line in stackTrace) { |
| - var match = stackTraceEntry.matchAsPrefix(line); |
| - if (match == null) continue; |
| - String entry = match.group(2); |
| - int reachableIndex = findReachablePrefix(entry, reachablePatterns); |
| - int knownIndex = findReachablePrefix(entry, allMembers); |
| - int classIndex = findReachablePrefix(entry, instantiatedClasses); |
| - if (reachableIndex == 0) { |
| - reachableIndex = classIndex; |
| - if (reachableIndex > knownIndex) { |
| - knownIndex = reachableIndex; |
| - } |
| - } |
| - String numberPart = match.group(1); |
| - String reachablePart = reachable(entry.substring(0, reachableIndex)); |
| - String knownPart = unreachable(entry.substring(reachableIndex, knownIndex)); |
| - String unknownPart = unknown(entry.substring(knownIndex)); |
| - String filePart = filecolor(shortenFilename(match.group(3))); |
| - String string = '$numberPart$reachablePart$knownPart$unknownPart'; |
| - print(string.padRight(110) + filePart); |
| - } |
| - print(legend); |
| -} |