Forge
csharpdeeb25a2
1namespace CascadeIDE.Services;
2
3/// <summary>
4/// Чистые функции для MCP/редактора: перевод 1-based line/column в offset в тексте с разделителем <c>\n</c>
5/// и сравнение путей к файлам. Единая реализация вместо копий в View и VM (план B в architecture-migration).
6/// </summary>
7public static class EditorTextCoordinateUtilities
8{
9 /// <summary>
10 /// Переводит позицию (строка и колонка с 1) в смещение в символах. Разделитель строк — только <c>\n</c>.
11 /// Возвращает -1 при некорректных координатах.
12 /// </summary>
13 public static int LineColumnToOffset(string text, int line, int column)
14 {
15 if (line < 1 || column < 1)
16 return -1;
17
18 var lines = text.Split('\n');
19 if (line > lines.Length)
20 return -1;
21
22 int offset = 0;
23 for (int i = 0; i < line - 1; i++)
24 offset += lines[i].Length + 1;
25
26 int lineLen = lines[line - 1].Length;
27 int col = Math.Min(column, lineLen + 1);
28 return offset + (col - 1);
29 }
30
31 /// <summary>
32 /// Сравнивает пути к одному и тому же файлу (через <see cref="CanonicalFilePath"/> при возможности).
33 /// </summary>
34 public static bool PathsReferToSameFile(string a, string b)
35 {
36 if (CanonicalFilePath.TryNormalize(a, out var na) && CanonicalFilePath.TryNormalize(b, out var nb))
37 return string.Equals(na, nb, StringComparison.OrdinalIgnoreCase);
38 return string.Equals(a, b, StringComparison.OrdinalIgnoreCase);
39 }
40}
41
View only · write via MCP/CIDE