// 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.isAbstract) {
      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());
      }
    }
  }
}
