src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization.ts/fileMatchToSearchResultFormat
function fileMatchToSearchResultFormat(fileMatch: FileMatch, labelFormatter: (x: URI) => string): SearchResultSerialization {
	const sortedMatches = fileMatch.matches().sort(searchMatchComparer);
	const longestLineNumber = sortedMatches[sortedMatches.length - 1].range().endLineNumber.toString().length;

	const uriString = labelFormatter(fileMatch.resource);
	const text: string[] = [`${uriString}:`];
	const matchRanges: Range[] = [];

	const targetLineNumberToOffset: Record<string, number> = {};

	const context: { line: string; lineNumber: number }[] = [];
	fileMatch.context.forEach((line, lineNumber) => context.push({ line, lineNumber }));
	context.sort((a, b) => a.lineNumber - b.lineNumber);

	let lastLine: number | undefined = undefined;

	const seenLines = new Set<string>();
	sortedMatches.forEach(match => {
		matchToSearchResultFormat(match, longestLineNumber).forEach(match => {
			if (!seenLines.has(match.lineNumber)) {
				while (context.length && context[0].lineNumber < +match.lineNumber) {
					const { line, lineNumber } = context.shift()!;
					if (lastLine !== undefined && lineNumber !== lastLine + 1) {
						text.push('');
					}
					text.push(`  ${' '.repeat(longestLineNumber - `${lineNumber}`.length)}${lineNumber}  ${line}`);
					lastLine = lineNumber;
				}

				targetLineNumberToOffset[match.lineNumber] = text.length;
				seenLines.add(match.lineNumber);
				text.push(match.line);
				lastLine = +match.lineNumber;
			}

			matchRanges.push(...match.ranges.map(translateRangeLines(targetLineNumberToOffset[match.lineNumber])));
		});
	});

	while (context.length) {
		const { line, lineNumber } = context.shift()!;
		text.push(`  ${lineNumber}  ${line}`);
	}

	return { text, matchRanges };
}