| 1 | using System.Text.RegularExpressions; |
| 2 | using CascadeIDE.Contracts; |
| 3 | using CascadeIDE.Services; |
| 4 | |
| 5 | namespace CascadeIDE.Features.Shell.Application; |
| 6 | |
| 7 | /// <summary>Построение паттерна ripgrep для префиксов Go-to палитры (<c>x:</c>/<c>t:</c>/<c>m:</c>).</summary> |
| 8 | [PresentationProjection("goto-palette-ripgrep-pattern")] |
| 9 | public static class GoToPaletteRipgrepPatternBuilder |
| 10 | { |
| 11 | public static (string Pattern, bool FixedString, string? Glob) Build(GoToAllQuery q) |
| 12 | { |
| 13 | var term = q.Term.Trim(); |
| 14 | return q.Prefix switch |
| 15 | { |
| 16 | 'x' => (term, true, null), |
| 17 | 't' => TypeNameSearchPattern(term), |
| 18 | 'm' => MemberNameSearchPattern(term), |
| 19 | _ => (term, true, null), |
| 20 | }; |
| 21 | } |
| 22 | |
| 23 | private static (string Pattern, bool FixedString, string? Glob) TypeNameSearchPattern(string term) |
| 24 | { |
| 25 | var esc = Regex.Escape(term); |
| 26 | var pattern = $@"(class|interface|enum|record|struct)\s+\S*{esc}\S*"; |
| 27 | return (pattern, false, "*.cs"); |
| 28 | } |
| 29 | |
| 30 | private static (string Pattern, bool FixedString, string? Glob) MemberNameSearchPattern(string term) |
| 31 | { |
| 32 | var esc = Regex.Escape(term); |
| 33 | var pattern = $@"\b{esc}\b\s*\("; |
| 34 | return (pattern, false, "*.cs"); |
| 35 | } |
| 36 | } |
| 37 | |