scan method
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);
}