check method

  1. @override
void check(
  1. DcqRegistry registry
)

Implementation

@override
void check(
  DcqRegistry registry,
) {
  registry.addCompilationUnit((node) {
    final filePath = registry.context.currentUnit?.file.path ?? '';

    final separatorIndex = filePath.lastIndexOf(RegExp(r'[/\\]'));
    final fileName = separatorIndex < 0
        ? filePath
        : filePath.substring(separatorIndex + 1);
    if (!fileName.endsWith('.dart')) return;

    if ((configStringList(ruleConfig, 'exclude') ??
            const ['.g.dart', '.mapper.dart', '.freezed.dart'])
        .any(fileName.endsWith)) {
      return;
    }

    final baseName = fileName.substring(0, fileName.length - 5);
    if (baseName.startsWith('_')) return;

    final expectedName = _snakeToPascal(baseName);

    final typeDeclarations = node.declarations.where(
      (d) =>
          d is ClassDeclaration ||
          d is EnumDeclaration ||
          d is MixinDeclaration ||
          d is ExtensionTypeDeclaration ||
          (!(configBool(ruleConfig, 'ignore-typedefs') ?? true) &&
              d is GenericTypeAlias),
    );

    if (typeDeclarations.isEmpty) return;

    final first = typeDeclarations.first;
    final nameToken = switch (first) {
      final ClassDeclaration d => d.namePart.typeName,
      final EnumDeclaration d => d.namePart.typeName,
      final MixinDeclaration d => d.name,
      final ExtensionTypeDeclaration d => d.primaryConstructor.typeName,
      final GenericTypeAlias d => d.name,
      _ => null,
    };
    if (nameToken == null) return;
    final name = nameToken.lexeme;
    if (name.startsWith('_')) return;

    if (name != expectedName &&
        name.toLowerCase() != expectedName.toLowerCase()) {
      reportAtToken(nameToken);
    }
  });
}