| Index: tests/compiler/dart2js/analyze_helper.dart
 | 
| diff --git a/tests/compiler/dart2js/analyze_helper.dart b/tests/compiler/dart2js/analyze_helper.dart
 | 
| index ef6439d255971cb883d28a4c7a55dc2e4450360d..41dc321a00e730b628f69bcc3e03bd43e8251e68 100644
 | 
| --- a/tests/compiler/dart2js/analyze_helper.dart
 | 
| +++ b/tests/compiler/dart2js/analyze_helper.dart
 | 
| @@ -10,7 +10,8 @@ import 'package:compiler/compiler.dart' as api;
 | 
|  import 'package:compiler/src/apiimpl.dart';
 | 
|  import 'package:compiler/src/commandline_options.dart';
 | 
|  import 'package:compiler/src/diagnostics/messages.dart' show
 | 
| -    Message;
 | 
| +    Message,
 | 
| +    MessageKind;
 | 
|  import 'package:compiler/src/filenames.dart';
 | 
|  import 'package:compiler/src/source_file_provider.dart';
 | 
|  import 'package:compiler/src/util/uri_extras.dart';
 | 
| @@ -33,15 +34,16 @@ class CollectingDiagnosticHandler extends FormattingDiagnosticHandler {
 | 
|    bool hasErrors = false;
 | 
|    bool lastWasWhitelisted = false;
 | 
|  
 | 
| -  Map<String, Map<String, int>> whiteListMap
 | 
| -      = new Map<String, Map<String, int>>();
 | 
| +  Map<String, Map<dynamic/*String|MessageKind*/, int>> whiteListMap
 | 
| +      = new Map<String, Map<dynamic/*String|MessageKind*/, int>>();
 | 
|  
 | 
| -  CollectingDiagnosticHandler(Map<String, List<String>> whiteList,
 | 
| -                              SourceFileProvider provider)
 | 
| +  CollectingDiagnosticHandler(
 | 
| +      Map<String, List/*<String|MessageKind>*/> whiteList,
 | 
| +      SourceFileProvider provider)
 | 
|        : super(provider) {
 | 
| -    whiteList.forEach((String file, List<String> messageParts) {
 | 
| -      var useMap = new Map<String,int>();
 | 
| -      for (String messagePart in messageParts) {
 | 
| +    whiteList.forEach((String file, List/*<String|MessageKind>*/ messageParts) {
 | 
| +      var useMap = new Map<dynamic/*String|MessageKind*/, int>();
 | 
| +      for (var messagePart in messageParts) {
 | 
|          useMap[messagePart] = 0;
 | 
|        }
 | 
|        whiteListMap[file] = useMap;
 | 
| @@ -57,7 +59,7 @@ class CollectingDiagnosticHandler extends FormattingDiagnosticHandler {
 | 
|    bool checkWhiteListUse() {
 | 
|      bool allUsed = true;
 | 
|      for (String file in whiteListMap.keys) {
 | 
| -      for (String messagePart in whiteListMap[file].keys) {
 | 
| +      for (var messagePart in whiteListMap[file].keys) {
 | 
|          if (whiteListMap[file][messagePart] == 0) {
 | 
|            print("Whitelisting '$messagePart' is unused in '$file'. "
 | 
|                  "Remove the whitelisting from the whitelist map.");
 | 
| @@ -70,7 +72,7 @@ class CollectingDiagnosticHandler extends FormattingDiagnosticHandler {
 | 
|  
 | 
|    void reportWhiteListUse() {
 | 
|      for (String file in whiteListMap.keys) {
 | 
| -      for (String messagePart in whiteListMap[file].keys) {
 | 
| +      for (var messagePart in whiteListMap[file].keys) {
 | 
|          int useCount = whiteListMap[file][messagePart];
 | 
|          print("Whitelisted message '$messagePart' suppressed $useCount "
 | 
|                "time(s) in '$file'.");
 | 
| @@ -78,15 +80,22 @@ class CollectingDiagnosticHandler extends FormattingDiagnosticHandler {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  bool checkWhiteList(Uri uri, String message) {
 | 
| +  bool checkWhiteList(Uri uri, Message message, String text) {
 | 
|      if (uri == null) {
 | 
|        return false;
 | 
|      }
 | 
|      String path = uri.path;
 | 
|      for (String file in whiteListMap.keys) {
 | 
|        if (path.contains(file)) {
 | 
| -        for (String messagePart in whiteListMap[file].keys) {
 | 
| -          if (message.contains(messagePart)) {
 | 
| +        for (var messagePart in whiteListMap[file].keys) {
 | 
| +          bool found = false;
 | 
| +          if (messagePart is String) {
 | 
| +            found = text.contains(messagePart);
 | 
| +          } else {
 | 
| +            assert(messagePart is MessageKind);
 | 
| +            found = message.kind == messagePart;
 | 
| +          }
 | 
| +          if (found) {
 | 
|              whiteListMap[file][messagePart]++;
 | 
|              return true;
 | 
|            }
 | 
| @@ -100,7 +109,7 @@ class CollectingDiagnosticHandler extends FormattingDiagnosticHandler {
 | 
|    void report(Message message, Uri uri, int begin, int end, String text,
 | 
|                api.Diagnostic kind) {
 | 
|      if (kind == api.Diagnostic.WARNING) {
 | 
| -      if (checkWhiteList(uri, text)) {
 | 
| +      if (checkWhiteList(uri, message, text)) {
 | 
|          // Suppress whitelisted warnings.
 | 
|          lastWasWhitelisted = true;
 | 
|          return;
 | 
| @@ -108,7 +117,7 @@ class CollectingDiagnosticHandler extends FormattingDiagnosticHandler {
 | 
|        hasWarnings = true;
 | 
|      }
 | 
|      if (kind == api.Diagnostic.HINT) {
 | 
| -      if (checkWhiteList(uri, text)) {
 | 
| +      if (checkWhiteList(uri, message, text)) {
 | 
|          // Suppress whitelisted hints.
 | 
|          lastWasWhitelisted = true;
 | 
|          return;
 | 
| @@ -116,7 +125,7 @@ class CollectingDiagnosticHandler extends FormattingDiagnosticHandler {
 | 
|        hasHint = true;
 | 
|      }
 | 
|      if (kind == api.Diagnostic.ERROR) {
 | 
| -      if (checkWhiteList(uri, text)) {
 | 
| +      if (checkWhiteList(uri, message, text)) {
 | 
|          // Suppress whitelisted errors.
 | 
|          lastWasWhitelisted = true;
 | 
|          return;
 | 
| @@ -134,11 +143,22 @@ class CollectingDiagnosticHandler extends FormattingDiagnosticHandler {
 | 
|  typedef bool CheckResults(CompilerImpl compiler,
 | 
|                            CollectingDiagnosticHandler handler);
 | 
|  
 | 
| +enum AnalysisMode {
 | 
| +  /// Analyze all declarations in all libraries in one go.
 | 
| +  ALL,
 | 
| +  /// Analyze all declarations in the main library.
 | 
| +  MAIN,
 | 
| +  /// Analyze all declarations in the given URIs one at a time. This mode can
 | 
| +  /// handle URIs for parts (i.e. skips these).
 | 
| +  URI,
 | 
| +  /// Analyze all declarations reachable from the entry point.
 | 
| +  TREE_SHAKING,
 | 
| +}
 | 
| +
 | 
|  Future analyze(List<Uri> uriList,
 | 
| -               Map<String, List<String>> whiteList,
 | 
| -               {bool analyzeAll: true,
 | 
| -                bool analyzeMain: false,
 | 
| -                CheckResults checkResults}) {
 | 
| +               Map<String, List/*<String|MessageKind>*/> whiteList,
 | 
| +               {AnalysisMode mode: AnalysisMode.ALL,
 | 
| +                CheckResults checkResults}) async {
 | 
|    String testFileName =
 | 
|        relativize(Uri.base, Platform.script, Platform.isWindows);
 | 
|  
 | 
| @@ -159,8 +179,17 @@ Future analyze(List<Uri> uriList,
 | 
|    var handler = new CollectingDiagnosticHandler(whiteList, provider);
 | 
|    var options = <String>[Flags.analyzeOnly, '--categories=Client,Server',
 | 
|        Flags.showPackageWarnings];
 | 
| -  if (analyzeAll) options.add(Flags.analyzeAll);
 | 
| -  if (analyzeMain) options.add(Flags.analyzeMain);
 | 
| +  switch (mode) {
 | 
| +    case AnalysisMode.URI:
 | 
| +    case AnalysisMode.MAIN:
 | 
| +      options.add(Flags.analyzeMain);
 | 
| +      break;
 | 
| +    case AnalysisMode.ALL:
 | 
| +      options.add(Flags.analyzeAll);
 | 
| +      break;
 | 
| +    case AnalysisMode.TREE_SHAKING:
 | 
| +      break;
 | 
| +  }
 | 
|    var compiler = new CompilerImpl(
 | 
|        provider,
 | 
|        null,
 | 
| @@ -179,22 +208,25 @@ Future analyze(List<Uri> uriList,
 | 
|  ===
 | 
|  """;
 | 
|  
 | 
| -  void onCompletion(_) {
 | 
| -    bool result;
 | 
| -    if (checkResults != null) {
 | 
| -      result = checkResults(compiler, handler);
 | 
| -    } else {
 | 
| -      result = handler.checkResults();
 | 
| -    }
 | 
| -    if (!result) {
 | 
| -      print(MESSAGE);
 | 
| -      exit(1);
 | 
| +  if (mode == AnalysisMode.URI) {
 | 
| +    for (Uri uri in uriList) {
 | 
| +      await compiler.analyzeUri(uri);
 | 
|      }
 | 
| -  }
 | 
| -  if (analyzeAll || analyzeMain) {
 | 
| +  } else if (mode != AnalysisMode.TREE_SHAKING) {
 | 
|      compiler.librariesToAnalyzeWhenRun = uriList;
 | 
| -    return compiler.run(null).then(onCompletion);
 | 
| +    await compiler.run(null);
 | 
|    } else {
 | 
| -    return compiler.run(uriList.single).then(onCompletion);
 | 
| +    await compiler.run(uriList.single);
 | 
| +  }
 | 
| +
 | 
| +  bool result;
 | 
| +  if (checkResults != null) {
 | 
| +    result = checkResults(compiler, handler);
 | 
| +  } else {
 | 
| +    result = handler.checkResults();
 | 
| +  }
 | 
| +  if (!result) {
 | 
| +    print(MESSAGE);
 | 
| +    exit(1);
 | 
|    }
 | 
|  }
 | 
| 
 |