Forge
csharpdeeb25a2
1using Microsoft.CodeAnalysis.CSharp;
2using Microsoft.CodeAnalysis.CSharp.Syntax;
3using Microsoft.CodeAnalysis.Text;
4
5namespace CascadeIDE.Services;
6
7public sealed partial class CSharpLanguageService
8{
9 /// <summary>Sort using directives and remove duplicates (Roslyn fast path).</summary>
10 public string OrganizeUsings(string filePath, string sourceText, CancellationToken ct = default)
11 {
12 if (string.IsNullOrEmpty(filePath))
13 return sourceText;
14
15 try
16 {
17 var tree = CSharpSyntaxTree.ParseText(sourceText, path: filePath, cancellationToken: ct);
18 if (tree.GetRoot(ct) is not CompilationUnitSyntax root)
19 return sourceText;
20
21 var seen = new HashSet<string>(StringComparer.Ordinal);
22 var sorted = new List<UsingDirectiveSyntax>();
23 foreach (var u in root.Usings.OrderBy(static u => u.Name?.ToString() ?? "", StringComparer.Ordinal))
24 {
25 var key = u.ToFullString().Trim();
26 if (!seen.Add(key))
27 continue;
28 sorted.Add(u);
29 }
30
31 var newRoot = root.WithUsings(SyntaxFactory.List(sorted));
32 return newRoot.ToFullString();
33 }
34 catch
35 {
36 return sourceText;
37 }
38 }
39}
40
View only · write via MCP/CIDE