normalizeLocationResult function
Normalizes a textDocument/definition-family result: accepts null,
Location, Location[], LocationLink, or LocationLink[] and returns
a flat location list (omp's normalizeLocationResult, reduced).
Implementation
List<LspLocation> normalizeLocationResult(Object? result) {
List<LspLocation> convert(Object? item) {
if (item is! Map<String, dynamic>) return const [];
// LocationLink: {targetUri, targetRange, targetSelectionRange?}.
if (item.containsKey('targetUri')) {
final selection = item['targetSelectionRange'] ?? item['targetRange'];
if (selection is! Map<String, dynamic>) return const [];
return [
LspLocation(
uri: item['targetUri'] as String,
range: LspRange.fromJson(selection),
),
];
}
if (item['uri'] is String && item['range'] is Map<String, dynamic>) {
return [LspLocation.fromJson(item)];
}
return const [];
}
if (result is List) {
return [for (final item in result) ...convert(item)];
}
return convert(result);
}