analyze method
Future<List<EndpointDefinition> >
analyze({
- required CodeAnalysisCollector collector,
- Set<
String> ? changedFiles,
Analyze all files in the AnalysisContextCollection
.
changedFiles
is an optional list of files that should have their context
refreshed before analysis. This is useful when only a subset of files have
changed since updateFileContexts was last called.
Implementation
Future<List<EndpointDefinition>> analyze({
required CodeAnalysisCollector collector,
Set<String>? changedFiles,
}) async {
await _refreshContextForFiles(changedFiles);
var endpointDefs = <EndpointDefinition>[];
List<(ResolvedLibraryResult, String)> validLibraries = [];
Map<String, int> endpointClassMap = {};
await for (var (library, filePath) in _libraries) {
var endpointClasses = _getEndpointClasses(library);
if (endpointClasses.isEmpty) {
continue;
}
var maybeDartErrors = await _getErrorsForFile(library.session, filePath);
if (maybeDartErrors.isNotEmpty) {
collector.addError(
SourceSpanSeverityException(
'Endpoint analysis skipped due to invalid Dart syntax. Please '
'review and correct the syntax errors.'
'\nFile: $filePath',
null,
severity: SourceSpanSeverity.error,
),
);
continue;
}
for (var endpointClass in endpointClasses) {
var className = endpointClass.name;
endpointClassMap.update(
className,
(value) => value + 1,
ifAbsent: () => 1,
);
}
validLibraries.add((library, filePath));
}
var duplicateEndpointClasses = endpointClassMap.entries
.where((entry) => entry.value > 1)
.map((entry) => entry.key)
.toSet();
for (var (library, filePath) in validLibraries) {
var severityExceptions = _validateLibrary(
library,
filePath,
duplicateEndpointClasses,
);
collector.addErrors(severityExceptions.values.expand((e) => e).toList());
var failingExceptions = _filterNoFailExceptions(severityExceptions);
endpointDefs.addAll(_parseLibrary(
library,
collector,
filePath,
failingExceptions,
));
}
_endpointDefinitions = endpointDefs.toSet();
return endpointDefs;
}