// 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.

import 'package:kernel/kernel.dart';
import 'dart:io';

String usage = '''
Usage: type_hashcode_quality FILE.dill

Counts the number of hash collisions between DartTypes in the given file.
''';

void main(List<String> args) {
  if (args.length == 0) {
    print(usage);
    exit(1);
  }
  Component component = loadComponentFromBinary(args[0]);
  var visitor = new DartTypeCollector();
  component.accept(visitor);
  print('''
Types:      ${visitor.numberOfTypes}
Collisions: ${visitor.numberOfCollisions}''');
}

class DartTypeCollector extends RecursiveVisitor {
  final Set<DartType> seenTypes = new Set<DartType>();
  final Map<int, DartType> table = <int, DartType>{};
  int numberOfCollisions = 0;
  int numberOfTypes = 0;

  @override
  defaultDartType(DartType node) {
    if (!seenTypes.add(node)) return;
    ++numberOfTypes;
    int hash = node.hashCode;
    if (hash == 0) {
      print('Type has a hash code of zero: $node');
    }
    DartType? existing = table[hash];
    if (existing == null) {
      table[hash] = node;
    } else if (existing != node) {
      print('Collision between $existing and $node');
      ++numberOfCollisions;
    }
  }
}
