using System.Text.RegularExpressions; using CodePlay.Core.Interfaces; namespace CodePlay.Core.Pipeline.Converters; /// /// C# 空合并/空条件运算符转换器 /// ?? → 三元表达式, ?. → null 检查, ??= → if-null 赋值 /// public class NullCoalescingConverter : ILineConverter { public int Priority => 45; public string Convert(string line, ConversionContext context) { var result = line; // ??= (null-coalescing assignment): x ??= value → if (x == null) x = value; result = Regex.Replace(result, @"(\w+(?:\.\w+)*)\s*\?\?=\s*(.+?)(;.*)?$", m => $"if ({m.Groups[1].Value} == null) {m.Groups[1].Value} = {m.Groups[2].Value};"); // ?. (null-conditional): obj?.Property → (obj != null ? obj.Property : null) result = Regex.Replace(result, @"(\w+(?:\.\w+)*)\?\.(\w+(?:\s*\())", m => $"( {m.Groups[1].Value} != null ? {m.Groups[1].Value}.{m.Groups[2].Value}"); // Nullable.Value with ?.member → handled above // ?.Method() already handled by above pattern // ?? (null-coalescing): a ?? b → a != null ? a : b result = Regex.Replace(result, @"(\w+(?:\.\w+)*(?:\s+[=!<>]\s+[^;]+)?)\s*\?\?\s*([^,;\n]+)", m => { var left = m.Groups[1].Value.Trim(); var right = m.Groups[2].Value.Trim(); return $"( {left} != null ? {left} : {right} )"; }); return result; } }