analyzeFile method
Analyzes a file and returns diagnostics.
Implementation
Future<List<Diagnostic>> analyzeFile(String filePath) async {
if (!_initialized) {
throw StateError('Server not initialized');
}
final diagnostics = <Diagnostic>[];
final result = await _sourceLoader.resolveFile(filePath);
if (result == null) {
return diagnostics;
}
// Calculate file-level metrics
final fileResult = _miCalculator.calculateForFile(result.unit);
// Report functions with poor maintainability (ADR-015 1.3 - actual source positions)
for (final entry in fileResult.needsAttention) {
final node = _findFunctionNode(result.unit, entry.key);
final range = node != null
? _nodeToRange(result.unit, node)
: Range.zero;
diagnostics.add(Diagnostic(
message:
'Function "${entry.key}" has low maintainability index: ${entry.value.maintainabilityIndex.toStringAsFixed(1)}',
severity: DiagnosticSeverity.warning,
range: range,
source: 'anteater',
code: 'low_maintainability_index',
));
}
// Check cyclomatic complexity thresholds
for (final entry in fileResult.functions.entries) {
final node = _findFunctionNode(result.unit, entry.key);
final range = node != null
? _nodeToRange(result.unit, node)
: Range.zero;
if (entry.value.cyclomaticComplexity > 20) {
diagnostics.add(Diagnostic(
message:
'Function "${entry.key}" has high cyclomatic complexity: ${entry.value.cyclomaticComplexity}',
severity: DiagnosticSeverity.warning,
range: range,
source: 'anteater',
code: 'high_cyclomatic_complexity',
));
}
if (entry.value.cognitiveComplexity > 15) {
diagnostics.add(Diagnostic(
message:
'Function "${entry.key}" has high cognitive complexity: ${entry.value.cognitiveComplexity}',
severity: DiagnosticSeverity.hint,
range: range,
source: 'anteater',
code: 'high_cognitive_complexity',
));
}
}
return diagnostics;
}