#!/usr/bin/env dart

// Copyright (c) 2018, 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.

import 'dart:io';

import 'package:kernel/kernel.dart';
import 'package:kernel/src/tool/command_line_util.dart';

void usage() {
  print("Enumerates the different node types in the provided dill file");
  print("and counts them.");
  print("");
  print("Usage: dart <script> dillFile.dill");
  print("The given argument should be an existing file");
  print("that is valid to load as a dill file.");
  exit(1);
}

void main(List<String> args) {
  CommandLineHelper.requireExactlyOneArgument(
    args,
    usage,
    requireFileExists: true,
  );
  Component component = CommandLineHelper.tryLoadDill(args[0]);
  TypeCounter counter = new TypeCounter();
  component.accept(counter);
  counter.printStats();
}

class TypeCounter extends RecursiveVisitor {
  Map<String, int> _typeCounts = <String, int>{};

  @override
  void defaultNode(Node node) {
    String key = node.runtimeType.toString();
    _typeCounts[key] = (_typeCounts[key] ??= 0) + 1;
    super.defaultNode(node);
  }

  void printStats() {
    List<List<Object>> data = [];
    _typeCounts.forEach((type, count) {
      data.add([type, count]);
    });
    data.sort((a, b) {
      int aCount = a[1] as int;
      int bCount = b[1] as int;
      return bCount - aCount;
    });
    for (var entry in data) {
      print("${entry[0]}: ${entry[1]}");
    }
  }
}
