scan method

  1. @override
Future<ScannerResult> scan(
  1. ProjectContext context
)
override

Executes the scan and returns a ScannerResult.

Implementation

@override
Future<ScannerResult> scan(ProjectContext context) async {
  context.logger.startSpinner('Scanning Themes...');
  final issues = <Issue>[];

  final dartFiles = FileUtils.getDartFiles(context.directory);
  final parser = AstParser(context);

  final textStyles = <String, int>{};
  final boxDecorations = <String, int>{};

  for (final file in dartFiles) {
    final content = await file.readAsString();
    final unit = parser.parseFile(file.path, content);
    if (unit == null) continue;

    final visitor = _ThemeVisitor(
      file.path,
      issues,
      textStyles,
      boxDecorations,
    );
    unit.visitChildren(visitor);
  }

  textStyles.forEach((style, count) {
    if (count >= 3) {
      issues.add(
        Issue(
          title: 'Duplicate TextStyle',
          description: 'A similar TextStyle is duplicated $count times.',
          category: 'Theme',
          severity: IssueSeverity.low,
          suggestion: 'Extract to a centralized AppTheme or TextTheme.',
        ),
      );
    }
  });

  boxDecorations.forEach((decoration, count) {
    if (count >= 3) {
      issues.add(
        Issue(
          title: 'Duplicate BoxDecoration',
          description: 'A similar BoxDecoration is duplicated $count times.',
          category: 'Theme',
          severity: IssueSeverity.low,
          suggestion: 'Extract to a centralized Theme or constant.',
        ),
      );
    }
  });

  context.logger.stopSpinner();
  return ScannerResult(issues: issues);
}