#![allow(clippy::wildcard_imports, clippy::enum_glob_use)]
#![allow(
clippy::cast_precision_loss,
clippy::cast_possible_truncation,
clippy::cast_sign_loss
)]
use super::*;
fn csharp_count_member(member: &Node) -> usize {
use Csharp::*;
match member.kind_id().into() {
MethodDeclaration
| ConstructorDeclaration
| DestructorDeclaration
| OperatorDeclaration
| ConversionOperatorDeclaration => 1,
PropertyDeclaration | IndexerDeclaration => csharp_accessor_count(member).max(1),
_ => 0,
}
}
fn csharp_member_public_method_count(member: &Node) -> usize {
use Csharp::*;
let total = csharp_count_member(member);
let narrowed = member
.children()
.filter(|c| matches!(c.kind_id().into(), AccessorList))
.flat_map(|list| list.children())
.filter(|c| matches!(c.kind_id().into(), AccessorDeclaration))
.filter(super::npa::csharp_node_has_private_or_protected_modifier)
.count();
total.saturating_sub(narrowed)
}
impl Npm for CsharpCode {
fn compute<'a>(node: &Node<'a>, _code: &'a [u8], stats: &mut Stats) {
use Csharp::*;
if Self::is_func_space(node) && stats.is_disabled() {
stats.is_class_space = true;
}
if !matches!(node.kind_id().into(), DeclarationList) {
return;
}
let Some(parent_kind) = node.parent().map(|p| p.kind_id().into()) else {
return;
};
match parent_kind {
ClassDeclaration | StructDeclaration | RecordDeclaration => {
for member in node.children() {
stats.class_nm += csharp_count_member(&member);
if super::npa::csharp_is_explicit_public(&member) {
stats.class_npm += csharp_member_public_method_count(&member);
}
}
}
InterfaceDeclaration => {
for member in node.children() {
stats.interface_nm += csharp_count_member(&member);
}
stats.interface_npm = stats.interface_nm;
}
_ => {}
}
}
}