blob: 1568bd3ec7a135d27d7ebf237e3cfc501bcb83bd [file]
// Copyright (c) 2023, 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 '../config/config.dart';
import '../elements/elements.dart';
import '../logging/logging.dart';
import 'visitor.dart';
bool _isPrivate(ClassMember classMember) =>
!classMember.isPublic && !classMember.isProtected;
class Excluder extends Visitor<Classes, void> {
final Config config;
const Excluder(this.config);
@override
void visit(Classes node) {
node.decls.removeWhere((_, classDecl) {
final excluded = _isPrivate(classDecl) ||
!(config.exclude?.classes?.included(classDecl) ?? true);
if (excluded) {
log.fine('Excluded class ${classDecl.binaryName}');
}
return excluded;
});
final classExcluder = _ClassExcluder(config);
for (final classDecl in node.decls.values) {
classDecl.accept(classExcluder);
}
}
}
class _ClassExcluder extends Visitor<ClassDecl, void> {
final Config config;
_ClassExcluder(this.config);
@override
void visit(ClassDecl node) {
node.methods = node.methods.where((method) {
final included = !_isPrivate(method) &&
!method.name.startsWith('_') &&
(config.exclude?.methods?.included(node, method) ?? true);
if (!included) {
log.fine('Excluded method ${node.binaryName}#${method.name}');
}
return included;
}).toList();
node.fields = node.fields.where((field) {
final included = !_isPrivate(field) &&
!field.name.startsWith('_') &&
(config.exclude?.fields?.included(node, field) ?? true);
if (!included) {
log.fine('Excluded field ${node.binaryName}#${field.name}');
}
return included;
}).toList();
}
}