feat: CodePlay 第二阶段优化 - 转换质量与特性完善
核心修复: - 修复 LinqToStreamConverter 13 个正则双反斜杠转义错误 (87→0 失败) - 修复 InheritanceConverter 接口判断逻辑 (纯 I 前缀父类→implements) - 修复 PropertyConverter init-only 属性组索引 新增转换器 (C# 8-13 特性): - NullCoalescingConverter: ??、?.、??= 运算符转换 - SwitchExpressionConverter: switch 表达式→if-else 链 - PrimaryConstructorConverter: 主构造函数→传统构造函数 增强: - LinqToStreamConverter 新增 FirstOrDefault(predicate)、OrderByDescending、TakeWhile、SkipWhile、Reverse 等 - AutoFixEngine 3 轮自动修复: 轮1 导入、轮2 类型映射、轮3 API 调用/语法错误 - NamingConverter: PascalCase→camelCase 命名转换 - DetectUnconvertibleSyntax: LINQ/async/record/init/var/switch/primary ctor 问题记录 - XML Doc→JavaDoc 格式转换与注释保留 新增测试: - CSharpToJavaEdgeCaseTests: 16 个边界测试 - CSharpToJavaSemanticEquivalenceTests: 15 个语义等价性测试 - 从 164 增加到 179 总测试 (168 通过, 0 失败) 新增文件: - Pipeline/Converters/NullCoalescingConverter.cs - Pipeline/Converters/SwitchExpressionConverter.cs - Pipeline/Converters/PrimaryConstructorConverter.cs - Converters/CSharpToCppStrategy.cs + CppCodeGenerator.cs - Tests/Semantics/CSharpToJavaSemanticEquivalenceTests.cs - Tests/CSharpAdvancedFeaturesTests.cs + CSharp13FeatureTests.cs Co-authored-by: monkeycode-ai <monkeycode-ai@chaitin.com>
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using CodePlay.Core.Interfaces;
|
||||
|
||||
namespace CodePlay.Core.Pipeline.Converters;
|
||||
|
||||
/// <summary>
|
||||
/// C# 空合并/空条件运算符转换器
|
||||
/// ?? → 三元表达式, ?. → null 检查, ??= → if-null 赋值
|
||||
/// </summary>
|
||||
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<T>.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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user