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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user