using System; using System.Text; using System.Text.RegularExpressions; using CodePlay.Core.Interfaces; namespace CodePlay.Core.Pipeline.Converters; /// /// C# switch 表达式转换器 /// switch { pattern => expression, _ => default } → 嵌套 if-else /// public class SwitchExpressionConverter : ILineConverter { public int Priority => 55; public string Convert(string line, ConversionContext context) { if (!line.Contains("switch") && !line.Contains("=>")) return line; // 检测 switch 表达式赋值: var x = expr switch { ... }; var assignMatch = Regex.Match(line, @"(\w+)\s+(\w+)\s*=\s*(.+)\s+switch\s*\{"); // 单行 switch 表达式: expr switch { pattern => val, _ => defVal } var singleLineMatch = Regex.Match(line, @"(.+?)\s+switch\s*\{\s*(.+?)\s*,\s*_\s*=>\s*(.+?)\s*\}"); if (singleLineMatch.Success) { var expr = singleLineMatch.Groups[1].Value.Trim(); var cases = singleLineMatch.Groups[2].Value.Trim(); var defaultVal = singleLineMatch.Groups[3].Value.Trim(); var parts = Regex.Split(cases, @"\s*,\s*(?=(?:(?:[^""]*""){2})*[^""]*$)(?![^()]*\))"); var sb = new StringBuilder(); sb.AppendLine("{"); if (parts.Length > 0) { var firstCase = Regex.Match(parts[0], @"(.+?)\s*=>\s*(.+)"); if (firstCase.Success) { var pattern = firstCase.Groups[1].Value.Trim(); var value = firstCase.Groups[2].Value.Trim(); sb.AppendLine($" if ({expr} == {pattern}) return {value};"); } } for (var i = 1; i < parts.Length; i++) { var caseMatch = Regex.Match(parts[i], @"(.+?)\s*=>\s*(.+)"); if (caseMatch.Success) { var pattern = caseMatch.Groups[1].Value.Trim(); var value = caseMatch.Groups[2].Value.Trim(); sb.AppendLine($" if ({expr} == {pattern}) return {value};"); } } sb.AppendLine($" return {defaultVal};"); sb.Append("}"); return sb.ToString(); } // 多行 switch 表达式赋值: var x = expr switch { ... } if (assignMatch.Success && line.TrimEnd().EndsWith("{")) { var varType = assignMatch.Groups[1].Value; var varName = assignMatch.Groups[2].Value; var expr = assignMatch.Groups[3].Value.Trim(); var sb = new StringBuilder(); sb.AppendLine($"{varType} {varName};"); sb.Append($"// switch expression for {varName} = {expr} switch {{...}}"); return sb.ToString(); } return line; } }