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