Forge
csharpdeeb25a2
1using System.Text.Json;
2using CascadeIDE.Features.Editor.Application.Monaco;
3
4#nullable enable
5
6namespace CascadeIDE.Features.Lsp.DataAcquisition;
7
8/// <summary>Parses LSP semantic tokens legend and encoded <c>data</c> arrays.</summary>
9public static class CSharpLspSemanticTokensParser
10{
11 public static CideEditorSemanticTokensLegend? TryParseLegend(JsonElement initializeResult)
12 {
13 if (!initializeResult.TryGetProperty("capabilities", out var caps))
14 return null;
15 if (!caps.TryGetProperty("semanticTokensProvider", out var provider))
16 return null;
17 if (!provider.TryGetProperty("legend", out var legend))
18 return null;
19
20 var types = ReadStringArray(legend, "tokenTypes");
21 var mods = ReadStringArray(legend, "tokenModifiers");
22 if (types.Count == 0)
23 return null;
24
25 return new CideEditorSemanticTokensLegend(types, mods);
26 }
27
28 public static CideEditorSemanticTokensData? TryParseFullResponse(JsonDocument? doc)
29 {
30 if (doc is null)
31 return null;
32 var root = doc.RootElement;
33 if (root.TryGetProperty("error", out _))
34 return null;
35 if (!root.TryGetProperty("result", out var result) || result.ValueKind == JsonValueKind.Null)
36 return null;
37 if (!result.TryGetProperty("data", out var dataEl) || dataEl.ValueKind != JsonValueKind.Array)
38 return null;
39
40 var list = new List<uint>(dataEl.GetArrayLength());
41 foreach (var item in dataEl.EnumerateArray())
42 {
43 if (item.ValueKind == JsonValueKind.Number && item.TryGetUInt32(out var v))
44 list.Add(v);
45 }
46
47 if (list.Count % 5 != 0)
48 return null;
49
50 string? resultId = result.TryGetProperty("resultId", out var rid) && rid.ValueKind == JsonValueKind.String
51 ? rid.GetString()
52 : null;
53
54 return new CideEditorSemanticTokensData(list, resultId);
55 }
56
57 private static IReadOnlyList<string> ReadStringArray(JsonElement parent, string name)
58 {
59 if (!parent.TryGetProperty(name, out var arr) || arr.ValueKind != JsonValueKind.Array)
60 return [];
61
62 var list = new List<string>();
63 foreach (var item in arr.EnumerateArray())
64 {
65 if (item.ValueKind == JsonValueKind.String)
66 {
67 var s = item.GetString();
68 if (!string.IsNullOrEmpty(s))
69 list.Add(s);
70 }
71 }
72
73 return list;
74 }
75}
76
View only · write via MCP/CIDE