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:
monkeycode-ai
2026-06-16 07:08:11 +00:00
parent f772973b68
commit db536cfb2c
70 changed files with 6999 additions and 2240 deletions
+155 -389
View File
@@ -1,41 +1,19 @@
using CodePlay.Core.Common;
using System.ComponentModel.DataAnnotations;
namespace CodePlay.Core.Models;
// ==================== 核心转换模型 ====================
/// <summary>
/// 转换请求模型
/// 转换请求
/// </summary>
public class ConversionRequest
{
/// <summary>
/// 源代码
/// </summary>
public string SourceCode { get; set; } = string.Empty;
/// <summary>
/// 源语言
/// </summary>
public LanguageType SourceLanguage { get; set; }
/// <summary>
/// 目标语言
/// </summary>
public LanguageType TargetLanguage { get; set; }
/// <summary>
/// 项目 ID(可选)
/// </summary>
public string? ProjectId { get; set; }
/// <summary>
/// 验证轮次(1-3
/// </summary>
public int ValidationRounds { get; set; } = 2;
/// <summary>
/// 转换选项
/// </summary>
public ConversionOptions? Options { get; set; }
public string SourceLanguage { get; set; } = "";
public string TargetLanguage { get; set; } = "";
public string SourceCode { get; set; } = "";
public int ValidationRounds { get; set; }
public ConversionOptions Options { get; set; } = new();
}
/// <summary>
@@ -43,157 +21,23 @@ public class ConversionRequest
/// </summary>
public class ConversionOptions
{
/// <summary>
/// 保留注释
/// </summary>
public bool KeepComments { get; set; } = true;
/// <summary>
/// 保留文档字符串
/// </summary>
public bool KeepDocStrings { get; set; } = true;
/// <summary>
/// 保留代码格式
/// </summary>
public bool KeepFormatting { get; set; } = true;
/// <summary>
/// 缩进大小
/// </summary>
public int IndentSize { get; set; } = 4;
/// <summary>
/// 使用制表符缩进
/// </summary>
public bool UseTabs { get; set; } = false;
/// <summary>
/// 自动修复启用
/// </summary>
public bool EnableAutoFix { get; set; } = true;
public bool AutoFormat { get; set; } = true;
public int MaxRetryRounds { get; set; } = 3;
public string? ProjectId { get; set; }
}
/// <summary>
/// 转换结果模型
/// 转换结果
/// </summary>
public class ConversionResult
{
/// <summary>
/// 是否成功
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 转换后的代码
/// </summary>
public string TransformedCode { get; set; } = string.Empty;
/// <summary>
/// 转换报告
/// </summary>
public ConversionReport? Report { get; set; }
/// <summary>
/// 警告列表
/// </summary>
public List<ConversionWarning> Warnings { get; set; } = new();
/// <summary>
/// 验证摘要
/// </summary>
public ValidationSummary? ValidationSummary { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public bool Success { get; set; } = true;
public string TransformedCode { get; set; } = "";
public string? ErrorMessage { get; set; }
}
/// <summary>
/// 转换报告
/// </summary>
public class ConversionReport
{
/// <summary>
/// 报告 ID
/// </summary>
public string Id { get; set; } = Guid.NewGuid().ToString("N")[..20];
/// <summary>
/// 项目 ID
/// </summary>
public string ProjectId { get; set; } = string.Empty;
/// <summary>
/// 源语言
/// </summary>
public LanguageType SourceLanguage { get; set; }
/// <summary>
/// 目标语言
/// </summary>
public LanguageType TargetLanguage { get; set; }
/// <summary>
/// 转换的行数
/// </summary>
public int LinesConverted { get; set; }
/// <summary>
/// 转换的类数量
/// </summary>
public int ClassesConverted { get; set; }
/// <summary>
/// 转换的方法数量
/// </summary>
public int MethodsConverted { get; set; }
/// <summary>
/// 转换耗时
/// </summary>
public TimeSpan Duration { get; set; }
/// <summary>
/// 问题数量
/// </summary>
public int IssueCount { get; set; }
/// <summary>
/// TODO 数量
/// </summary>
public int TodoCount { get; set; }
/// <summary>
/// 问题列表
/// </summary>
public List<ConversionIssue> Issues { get; set; } = new();
/// <summary>
/// 转换日志
/// </summary>
public List<TransformationLog> TransformationLog { get; set; } = new();
/// <summary>
/// TODO 列表
/// </summary>
public List<TodoItem> TodoItems { get; set; } = new();
/// <summary>
/// 验证状态
/// </summary>
public string ValidationStatus { get; set; } = "NotValidated";
/// <summary>
/// 最后验证时间
/// </summary>
public DateTime? LastValidatedAt { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
public ConversionReport Report { get; set; } = new();
public List<ConversionWarning> Warnings { get; set; } = new();
}
/// <summary>
@@ -201,30 +45,83 @@ public class ConversionReport
/// </summary>
public class ConversionWarning
{
/// <summary>
/// 警告代码
/// </summary>
public string Code { get; set; } = string.Empty;
/// <summary>
/// 警告消息
/// </summary>
public string Message { get; set; } = string.Empty;
/// <summary>
/// 行号
/// </summary>
public string Message { get; set; } = "";
public int Line { get; set; }
public string Suggestion { get; set; } = "";
public string Type { get; set; } = "";
public string Code { get; set; } = "";
}
/// <summary>
/// 转换报告
/// </summary>
public class ConversionReport
{
public string Id { get; set; } = Guid.NewGuid().ToString("N")[..20];
public string? ProjectId { get; set; }
public string SourceLanguage { get; set; } = "";
public string TargetLanguage { get; set; } = "";
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
public int LinesConverted { get; set; }
public int ClassesConverted { get; set; }
public int MethodsConverted { get; set; }
public int IssueCount { get; set; }
public int TodoCount { get; set; }
public string ValidationStatus { get; set; } = "";
public List<TodoItem> TodoItems { get; set; } = new();
public List<IssueInfo> Issues { get; set; } = new();
public List<TransformationLogEntry> TransformationLog { get; set; } = new();
}
/// <summary>
/// TODO 项
/// </summary>
public class TodoItem
{
public string Description { get; set; } = string.Empty;
public int LineNumber { get; set; }
/// <summary>
/// 列号
/// </summary>
public string OriginalSyntax { get; set; } = string.Empty;
public string WhyNotDirect { get; set; } = string.Empty;
public string RecommendedAlternative { get; set; } = string.Empty;
}
/// <summary>
/// 问题信息
/// </summary>
public class IssueInfo
{
public string Description { get; set; } = string.Empty;
public string Severity { get; set; } = "";
public int Line { get; set; }
public string Suggestion { get; set; } = string.Empty;
}
/// <summary>
/// 转换日志
/// </summary>
public class TransformationLogEntry
{
public DateTime Timestamp { get; set; } = DateTime.UtcNow;
public string Operation { get; set; } = "";
public string Details { get; set; } = "";
public string Level { get; set; } = "Info";
public string Code { get; set; } = "";
}
/// <summary>
/// 编译错误
/// </summary>
public class CompilationError
{
public int Line { get; set; }
public int LineNumber { get; set; }
public int Column { get; set; }
public int ColumnNumber { get; set; }
/// <summary>
/// 建议
/// </summary>
public string? Suggestion { get; set; }
public string Message { get; set; } = "";
public string Severity { get; set; } = "Error";
public string Id { get; set; } = "";
public string ErrorId { get; set; } = "";
public bool IsError { get; set; } = true;
}
/// <summary>
@@ -232,29 +129,16 @@ public class ConversionWarning
/// </summary>
public class ValidationSummary
{
/// <summary>
/// 是否通过验证
/// </summary>
public bool Passed { get; set; }
/// <summary>
/// 验证轮次
/// </summary>
public bool Success { get; set; }
public string Output { get; set; } = "";
public int ErrorCount { get; set; }
public int WarningCount { get; set; }
public int RoundsExecuted { get; set; }
/// <summary>
/// 是否需要人工审查
/// </summary>
public bool NeedsManualReview { get; set; }
/// <summary>
/// 编译错误列表
/// </summary>
public List<CompilationError> Errors { get; set; } = new();
public List<CompilationError> CompilationErrors { get; set; } = new();
/// <summary>
/// 验证日志
/// </summary>
public List<string> Warnings { get; set; } = new();
public List<string> ValidationLog { get; set; } = new();
}
@@ -263,61 +147,35 @@ public class ValidationSummary
/// </summary>
public class ConversionIssue
{
/// <summary>
/// 问题类型
/// </summary>
public IssueType Type { get; set; }
/// <summary>
/// 问题严重程度
/// </summary>
public IssueSeverity Severity { get; set; }
/// <summary>
/// 问题描述
/// </summary>
public string Description { get; set; } = string.Empty;
/// <summary>
/// 位置(行号)
/// </summary>
public string Description { get; set; } = "";
public string Severity { get; set; } = "";
public int Line { get; set; }
public int LineNumber { get; set; }
/// <summary>
/// 原始代码片段
/// </summary>
public string? OriginalCode { get; set; }
/// <summary>
/// 建议操作
/// </summary>
public string? Suggestion { get; set; }
/// <summary>
/// 源语言
/// </summary>
public LanguageType Language { get; set; }
public string Suggestion { get; set; } = "";
public string SourceSyntax { get; set; } = "";
public string OriginalCode { get; set; } = "";
public string Type { get; set; } = "";
public string Language { get; set; } = "";
public int Column { get; set; }
public bool IsError { get; set; }
public string ErrorId { get; set; } = "";
}
// ==================== 项目模型 ====================
/// <summary>
/// 问题严重程度
/// 项目信息
/// </summary>
public enum IssueSeverity
public class ProjectInfo
{
/// <summary>
/// 低优先级
/// </summary>
Low = 0,
/// <summary>
/// 中优先级
/// </summary>
Medium = 1,
/// <summary>
/// 高优先级
/// </summary>
High = 2
public Guid Id { get; set; }
public string Name { get; set; } = "";
public string SourceLanguage { get; set; } = "";
public string TargetLanguage { get; set; } = "";
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
public DateTime? UpdatedAt { get; set; }
public List<string> Files { get; set; } = new();
public int TotalConversions { get; set; }
}
/// <summary>
@@ -325,56 +183,12 @@ public enum IssueSeverity
/// </summary>
public enum IssueType
{
/// <summary>
/// 不可转换语法
/// </summary>
UnconvertibleSyntax = 0,
/// <summary>
/// 类型映射警告
/// </summary>
TypeMappingWarning = 1,
/// <summary>
/// API 差异
/// </summary>
ApiDifference = 2,
/// <summary>
/// 语义差异
/// </summary>
SemanticDifference = 3,
/// <summary>
/// 性能考虑
/// </summary>
PerformanceConsideration = 4
}
/// <summary>
/// 转换日志
/// </summary>
public class TransformationLog
{
/// <summary>
/// 时间戳
/// </summary>
public DateTime Timestamp { get; set; }
/// <summary>
/// 操作类型
/// </summary>
public string Operation { get; set; } = string.Empty;
/// <summary>
/// 详情
/// </summary>
public string Details { get; set; } = string.Empty;
/// <summary>
/// 日志级别
/// </summary>
public LogLevel Level { get; set; }
Syntax,
Semantic,
Compatibility,
Performance,
Maintainability,
UnconvertibleSyntax
}
/// <summary>
@@ -382,90 +196,42 @@ public class TransformationLog
/// </summary>
public enum LogLevel
{
/// <summary>
/// 信息
/// </summary>
Info = 0,
/// <summary>
/// 警告
/// </summary>
Warning = 1,
/// <summary>
/// 错误
/// </summary>
Error = 2,
/// <summary>
/// 调试
/// </summary>
Debug = 3
Debug,
Info,
Warning,
Error,
Critical
}
/// <summary>
/// TODO 项
/// 转换日志
/// </summary>
public class TodoItem
public class TransformationLog
{
/// <summary>
/// TODO 描述
/// </summary>
public string Description { get; set; } = string.Empty;
/// <summary>
/// 位置(行号)
/// </summary>
public int LineNumber { get; set; }
/// <summary>
/// 原始语法说明
/// </summary>
public string OriginalSyntax { get; set; } = string.Empty;
/// <summary>
/// 为什么无法直接转换
/// </summary>
public string WhyNotDirect { get; set; } = string.Empty;
/// <summary>
/// 推荐的替代方案
/// </summary>
public string RecommendedAlternative { get; set; } = string.Empty;
/// <summary>
/// 参考代码位置
/// </summary>
public string? ReferenceLocation { get; set; }
public DateTime Timestamp { get; set; } = DateTime.UtcNow;
public string Operation { get; set; } = "";
public string Details { get; set; } = "";
public LogLevel Level { get; set; } = LogLevel.Info;
}
/// <summary>
/// 编译错误
/// 问题严重程度
/// </summary>
public class CompilationError
public enum IssueSeverity
{
/// <summary>
/// 错误 ID
/// </summary>
public string ErrorId { get; set; } = string.Empty;
/// <summary>
/// 错误消息
/// </summary>
public string Message { get; set; } = string.Empty;
/// <summary>
/// 行号
/// </summary>
public int LineNumber { get; set; }
/// <summary>
/// 列号
/// </summary>
public int ColumnNumber { get; set; }
/// <summary>
/// 错误级别(错误或警告)
/// </summary>
public bool IsError { get; set; } = true;
Low,
Medium,
High,
Critical
}
/// <summary>
/// 修复选项
/// </summary>
public enum FixOption
{
Replace,
Comment,
Annotate,
Remove
}