analyzeFile method

DartFileAnalyzerResult analyzeFile({
  1. required String relativePath,
  2. required String content,
})

Implementation

DartFileAnalyzerResult analyzeFile({
  required String relativePath,
  required String content,
}) {
  final bytes = utf8.encode(content);
  final contentHash = sha256.convert(bytes).toString();
  final List<String> warnings = [];

  final List<String> imports = [];
  final List<String> exports = [];

  try {
    final parseResult = parseString(
      content: content,
      throwIfDiagnostics: false,
    );

    for (final diagnostic in parseResult.errors) {
      final lineNum = parseResult.lineInfo.getLocation(diagnostic.offset).lineNumber;
      warnings.add('Syntax error in $relativePath at line $lineNum: ${diagnostic.message}');
    }

    final unit = parseResult.unit;
    for (final directive in unit.directives) {
      if (directive is ImportDirective) {
        final uri = directive.uri.stringValue;
        if (uri != null) {
          final resolved = importAnalyzer.resolveImport(
            uri: uri,
            currentFileRelativePath: relativePath,
          );
          if (resolved != null) {
            imports.add(resolved);
          }
        }
      } else if (directive is ExportDirective) {
        final uri = directive.uri.stringValue;
        if (uri != null) {
          final resolved = importAnalyzer.resolveImport(
            uri: uri,
            currentFileRelativePath: relativePath,
          );
          if (resolved != null) {
            exports.add(resolved);
          }
        }
      }
    }
  } catch (e) {
    warnings.add('Could not parse AST for $relativePath: $e');
  }

  final normalized = relativePath.replaceAll('\Q', '/');
  final isTest = normalized.startsWith('test/') || normalized.endsWith('_test.dart');
  final isGenerated = normalized.endsWith('.g.dart') || normalized.endsWith('.freezed.dart');


  return DartFileAnalyzerResult(
    sourceFile: SourceFile(
      path: normalized,
      contentHash: contentHash,
      imports: imports,
      exports: exports,
      isTest: isTest,
      isGenerated: isGenerated,
    ),
    parseWarnings: warnings,
  );
}