// Copyright (c) 2020, 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:analyzer/dart/ast/ast.dart';
import 'package:scrape/scrape.dart';

void main(List<String> arguments) {
  Scrape()
    ..addHistogram('Declarations')
    ..addHistogram('Uses')
    ..addHistogram('Superclass names')
    ..addHistogram('Superinterface names')
    ..addHistogram('Mixin names')
    ..addVisitor(() => ClassReuseVisitor())
    ..runCommandLine(arguments);
}

class ClassReuseVisitor extends ScrapeVisitor {
  @override
  void visitClassDeclaration(ClassDeclaration node) {
    if (node.abstractKeyword != null) {
      record('Declarations', 'abstract class');
    } else {
      record('Declarations', 'class');
    }

    var extendsClause = node.extendsClause;
    if (extendsClause != null) {
      record('Uses', 'extend');
      record('Superclass names', extendsClause.superclass.toString());
    }

    var withClause = node.withClause;
    if (withClause != null) {
      for (var mixin in withClause.mixinTypes) {
        record('Uses', 'mixin');
        record('Mixin names', mixin.toString());
      }
    }

    var implementsClause = node.implementsClause;
    if (implementsClause != null) {
      for (var type in implementsClause.interfaces) {
        record('Uses', 'implement');
        record('Superinterface names', type.toString());
      }
    }
  }
}
