analyzeProject method

Future<SymbolAnalysisResult> analyzeProject()

Implementation

Future<SymbolAnalysisResult> analyzeProject() async {
  final graph = SymbolGraph();
  final List<String> warnings = [];

  final normalizedRoot = p.normalize(Directory(projectRoot).absolute.path);

  try {
    final collection = AnalysisContextCollection(includedPaths: [normalizedRoot]);
    final context = collection.contextFor(normalizedRoot);
    final session = context.currentSession;

    final libDir = Directory(p.join(normalizedRoot, 'lib'));
    final testDir = Directory(p.join(normalizedRoot, 'test'));

    final List<File> filesToAnalyze = [];

    if (libDir.existsSync()) {
      final entities = libDir.listSync(recursive: true);
      for (final e in entities) {
        if (e is File && e.path.endsWith('.dart') && !e.path.endsWith('.g.dart') && !e.path.endsWith('.freezed.dart')) {
          filesToAnalyze.add(e);
        }
      }
    }

    if (testDir.existsSync()) {
      final entities = testDir.listSync(recursive: true);
      for (final e in entities) {
        if (e is File && e.path.endsWith('.dart')) {
          filesToAnalyze.add(e);
        }
      }
    }

    for (final file in filesToAnalyze) {
      final normalizedFilePath = p.normalize(file.absolute.path);
      final relativePath = p.relative(normalizedFilePath, from: normalizedRoot).replaceAll('\\', '/');

      try {
        final result = await session.getResolvedUnit(normalizedFilePath);
        if (result is ResolvedUnitResult) {
          final resolvedUnit = result;
          final visitor = SymbolAstVisitor(
            filePath: relativePath,
            packageName: packageName,
            projectRoot: normalizedRoot,
            graph: graph,
          );
          resolvedUnit.unit.accept(visitor);
        } else {
          warnings.add('Could not resolve unit for ' + relativePath);
        }
      } catch (e) {
        warnings.add('Error analyzing symbols in ' + relativePath + ': ' + e.toString());
      }
    }

    return SymbolAnalysisResult(
      graph: graph,
      warnings: warnings,
      isSuccess: true,
    );
  } catch (e) {
    warnings.add('Failed to initialize AnalysisContextCollection: ' + e.toString());
    return SymbolAnalysisResult(
      graph: graph,
      warnings: warnings,
      isSuccess: false,
    );
  }
}