Files
sdk/pkg/kernel/test/treeshaker_check.dart
T
Peter von der Ahé 4d1adf42d3 Deprecate IncrementalClassHierarchy
See https://github.com/dart-lang/sdk/issues/31842

Change-Id: I019909831a91a4e06138dc3a6bf32f766bca1ae6
Reviewed-on: https://dart-review.googlesource.com/34880
Commit-Queue: Peter von der Ahé <ahe@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
2018-01-17 13:30:17 +00:00

61 lines
1.6 KiB
Dart

// 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_check;
import 'dart:io';
import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/core_types.dart';
import 'package:kernel/kernel.dart';
import 'package:kernel/transformations/treeshaker.dart';
String usage = '''
Usage: treeshaker_check FILE.dill
Run the tree shaker on FILE.dill and perform some internal sanity checks.
''';
main(List<String> args) {
if (args.length == 0) {
print(usage);
exit(1);
}
var program = loadProgramFromBinary(args[0]);
var coreTypes = new CoreTypes(program);
var hierarchy = new ClassHierarchy(program);
var shaker = new TreeShaker(coreTypes, hierarchy, program);
shaker.transform(program);
new TreeShakingSanityCheck(shaker).visit(program);
}
class TreeShakingSanityCheck extends RecursiveVisitor {
final TreeShaker shaker;
bool isInCoreLibrary = false;
TreeShakingSanityCheck(this.shaker);
void visit(Node node) {
node.accept(this);
}
visitLibrary(Library node) {
isInCoreLibrary = (node.importUri.scheme == 'dart');
super.visitLibrary(node);
}
defaultMember(Member member) {
if (!isInCoreLibrary &&
member is! Constructor &&
!shaker.isMemberUsed(member)) {
throw 'Unused member $member was not removed';
}
}
defaultMemberReference(Member target) {
if (!shaker.isMemberUsed(target)) {
throw 'Found reference to $target';
}
}
}