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;
}
}