diff --git a/.gitignore b/.gitignore
index 18d4e91..7996bc0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -174,3 +174,9 @@
*.lz
*.lzma
*.iso
+
+# CodePlay generated files
+**/bin/
+**/obj/
+*.suo
+*.user
diff --git a/.monkeycode/specs/codeplay-conversion-platform/tasklist.md b/.monkeycode/specs/codeplay-conversion-platform/tasklist.md
index bbe135c..887acc3 100644
--- a/.monkeycode/specs/codeplay-conversion-platform/tasklist.md
+++ b/.monkeycode/specs/codeplay-conversion-platform/tasklist.md
@@ -6,29 +6,29 @@ Updated: 2026-06-03
## Phase 1: 项目初始化
### Task 1.1: 创建 .NET Solution 和项目骨架
-- [ ] 创建 CodePlay.sln 解决方案文件
-- [ ] 创建 CodePlay.Core 类库项目(核心转换引擎)
-- [ ] 创建 CodePlay.Web ASP.NET Core Web API 项目
-- [ ] 创建 CodePlay.CLI 控制台应用项目
-- [ ] 创建 CodePlay.Tests 测试项目
-- [ ] 配置全局 using 和共享依赖
-- [ ] 创建解决方案级别的目录结构
+- [x] 创建 CodePlay.sln 解决方案文件
+- [x] 创建 CodePlay.Core 类库项目(核心转换引擎)
+- [x] 创建 CodePlay.Web ASP.NET Core Web API 项目
+- [x] 创建 CodePlay.CLI 控制台应用项目
+- [x] 创建 CodePlay.Tests 测试项目
+- [x] 配置全局 using 和共享依赖
+- [x] 创建解决方案级别的目录结构
### Task 1.2: 配置项目依赖
- [ ] 安装 Microsoft.CodeAnalysis (Roslyn) 用于 C# 解析
- [ ] 安装 JavaParser 或类似库用于 Java 解析
-- [ ] 安装 clang-sharp 用于 C++ 解析
-- [ ] 配置 xUnit 测试框架
-- [ ] 配置依赖注入容器
-- [ ] 创建 shared project 或 NuGet 包管理共享代码
+- [x] 安装 clang-sharp 用于 C++ 解析
+- [x] 配置 xUnit 测试框架
+- [x] 配置依赖注入容器
+- [x] 创建 shared project 或 NuGet 包管理共享代码
### Task 1.3: 建立基础架构
- [ ] 创建核心接口定义(IConverter, IParser, ICodeGenerator)
-- [ ] 创建基础抽象类(BaseConverter, BaseParser)
-- [ ] 创建数据模型类(ConversionRequest, ConversionResult, ConversionReport 等)
-- [ ] 创建枚举类型(LanguageType, ProjectStatus, ConversionStatus)
-- [ ] 配置日志系统(Serilog)
-- [ ] 配置异常处理中间件
+- [x] 创建基础抽象类(BaseConverter, BaseParser)
+- [x] 创建数据模型类(ConversionRequest, ConversionResult, ConversionReport 等)
+- [x] 创建枚举类型(LanguageType, ProjectStatus, ConversionStatus)
+- [x] 配置日志系统(Serilog)
+- [x] 配置异常处理中间件
## Phase 2: 核心转换引擎
diff --git a/CodePlay.CLI/CodePlay.CLI.csproj b/CodePlay.CLI/CodePlay.CLI.csproj
new file mode 100644
index 0000000..206b89a
--- /dev/null
+++ b/CodePlay.CLI/CodePlay.CLI.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/CodePlay.CLI/Program.cs b/CodePlay.CLI/Program.cs
new file mode 100644
index 0000000..83fa4f4
--- /dev/null
+++ b/CodePlay.CLI/Program.cs
@@ -0,0 +1,2 @@
+// See https://aka.ms/new-console-template for more information
+Console.WriteLine("Hello, World!");
diff --git a/CodePlay.Core/CodePlay.Core.csproj b/CodePlay.Core/CodePlay.Core.csproj
new file mode 100644
index 0000000..f411554
--- /dev/null
+++ b/CodePlay.Core/CodePlay.Core.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/CodePlay.Core/Common/Enums.cs b/CodePlay.Core/Common/Enums.cs
new file mode 100644
index 0000000..f330c02
--- /dev/null
+++ b/CodePlay.Core/Common/Enums.cs
@@ -0,0 +1,120 @@
+namespace CodePlay.Core.Common;
+
+///
+/// 支持的编程语言类型
+///
+public enum LanguageType
+{
+ ///
+ /// 未指定
+ ///
+ None = 0,
+
+ ///
+ /// C#
+ ///
+ CSharp = 1,
+
+ ///
+ /// Java
+ ///
+ Java = 2,
+
+ ///
+ /// C++
+ ///
+ CPlusPlus = 3
+}
+
+///
+/// 转换状态
+///
+public enum ConversionStatus
+{
+ ///
+ /// 等待中
+ ///
+ Pending = 0,
+
+ ///
+ /// 进行中
+ ///
+ InProgress = 1,
+
+ ///
+ /// 已完成
+ ///
+ Completed = 2,
+
+ ///
+ /// 部分完成(需要人工检查)
+ ///
+ PartiallyCompleted = 3,
+
+ ///
+ /// 失败
+ ///
+ Failed = 4,
+
+ ///
+ /// 已取消
+ ///
+ Cancelled = 5
+}
+
+///
+/// 项目状态
+///
+public enum ProjectStatus
+{
+ ///
+ /// 进行中
+ ///
+ InProgress = 0,
+
+ ///
+ /// 已完成
+ ///
+ Completed = 1,
+
+ ///
+ /// 已验证
+ ///
+ Verified = 2,
+
+ ///
+ /// 已归档
+ ///
+ Archived = 3
+}
+
+///
+/// 验证结果状态
+///
+public enum ValidationResult
+{
+ ///
+ /// 未验证
+ ///
+ NotValidated = 0,
+
+ ///
+ /// 验证通过
+ ///
+ Passed = 1,
+
+ ///
+ /// 验证失败 - 需要人工检查
+ ///
+ Failed_NeedsManualReview = 2,
+
+ ///
+ /// 验证失败 - 编译错误
+ ///
+ Failed_CompilationError = 3,
+
+ ///
+ /// 验证失败 - 测试失败
+ ///
+ Failed_TestFailed = 4
+}
diff --git a/CodePlay.Core/Interfaces/IInterfaces.cs b/CodePlay.Core/Interfaces/IInterfaces.cs
new file mode 100644
index 0000000..dd2a375
--- /dev/null
+++ b/CodePlay.Core/Interfaces/IInterfaces.cs
@@ -0,0 +1,449 @@
+using CodePlay.Core.Models;
+using CodePlay.Core.Common;
+
+namespace CodePlay.Core.Interfaces;
+
+///
+/// 语言解析器接口
+///
+public interface IParser
+{
+ ///
+ /// 解析源代码并生成 AST
+ ///
+ /// 源代码
+ /// 取消令牌
+ /// 语法树
+ Task ParseAsync(string sourceCode, CancellationToken cancellationToken = default);
+}
+
+///
+/// 代码转换器接口
+///
+public interface IConverter
+{
+ ///
+ /// 转换语法树
+ ///
+ /// 源语言语法树
+ /// 目标语言
+ /// 转换选项
+ /// 取消令牌
+ /// 转换结果
+ Task ConvertAsync(SyntaxTree syntaxTree, LanguageType targetLanguage, ConversionOptions? options = null, CancellationToken cancellationToken = default);
+}
+
+///
+/// 代码生成器接口
+///
+public interface ICodeGenerator
+{
+ ///
+ /// 从语法树生成代码
+ ///
+ /// 语法树
+ /// 生成的代码
+ string Generate(SyntaxTree syntaxTree);
+}
+
+///
+/// 编译验证器接口
+///
+public interface ICompilerValidator
+{
+ ///
+ /// 编译并验证代码
+ ///
+ /// 代码
+ /// 语言类型
+ /// 取消令牌
+ /// 验证结果
+ Task ValidateAsync(string code, LanguageType language, CancellationToken cancellationToken = default);
+}
+
+///
+/// 自动修复引擎接口
+///
+public interface IAutoFixEngine
+{
+ ///
+ /// 尝试修复编译错误
+ ///
+ /// 代码
+ /// 编译错误列表
+ /// 当前修复轮次
+ /// 取消令牌
+ /// 修复结果
+ Task FixAsync(string code, List errors, int round, CancellationToken cancellationToken = default);
+}
+
+///
+/// 转换策略接口
+///
+public interface IConversionStrategy
+{
+ ///
+ /// 源语言
+ ///
+ LanguageType SourceLanguage { get; }
+
+ ///
+ /// 目标语言
+ ///
+ LanguageType TargetLanguage { get; }
+
+ ///
+ /// 转换语法节点
+ ///
+ /// 语法节点
+ /// 转换上下文
+ /// 转换后的节点
+ SyntaxNode ConvertNode(SyntaxNode node, ConversionContext context);
+
+ ///
+ /// 映射类型
+ ///
+ /// 源类型名称
+ /// 目标类型名称
+ string MapType(string sourceType);
+}
+
+///
+/// 语法树
+///
+public class SyntaxTree
+{
+ ///
+ /// 语言类型
+ ///
+ public LanguageType Language { get; set; }
+
+ ///
+ /// 根节点
+ ///
+ public SyntaxNode Root { get; set; } = new();
+
+ ///
+ /// 源文件路径
+ ///
+ public string? SourceFilePath { get; set; }
+
+ ///
+ /// 原始源代码
+ ///
+ public string? SourceCode { get; set; }
+
+ ///
+ /// 注释列表
+ ///
+ public List Comments { get; set; } = new();
+
+ ///
+ /// 文档字符串列表
+ ///
+ public List Documentation { get; set; } = new();
+}
+
+///
+/// 语法节点
+///
+public class SyntaxNode
+{
+ ///
+ /// 节点类型
+ ///
+ public SyntaxNodeType Type { get; set; }
+
+ ///
+ /// 节点文本
+ ///
+ public string Text { get; set; } = string.Empty;
+
+ ///
+ /// 子节点列表
+ ///
+ public List Children { get; set; } = new();
+
+ ///
+ /// 元数据
+ ///
+ public Dictionary Metadata { get; set; } = new();
+
+ ///
+ /// 父节点
+ ///
+ public SyntaxNode? Parent { get; set; }
+
+ ///
+ /// 是否为不可转换语法
+ ///
+ public bool IsUnconvertible { get; set; }
+
+ ///
+ /// TODO 说明(当 IsUnconvertible 为 true 时)
+ ///
+ public string? TodoDescription { get; set; }
+}
+
+///
+/// 语法节点类型
+///
+public enum SyntaxNodeType
+{
+ ///
+ /// 未知
+ ///
+ Unknown = 0,
+
+ ///
+ /// 编译单元
+ ///
+ CompilationUnit = 1,
+
+ ///
+ /// 命名空间
+ ///
+ Namespace = 2,
+
+ ///
+ /// 类
+ ///
+ Class = 3,
+
+ ///
+ /// 接口
+ ///
+ Interface = 4,
+
+ ///
+ /// 方法
+ ///
+ Method = 5,
+
+ ///
+ /// 属性
+ ///
+ Property = 6,
+
+ ///
+ /// 字段
+ ///
+ Field = 7,
+
+ ///
+ /// 构造函数
+ ///
+ Constructor = 8,
+
+ ///
+ /// 语句
+ ///
+ Statement = 9,
+
+ ///
+ /// 表达式
+ ///
+ Expression = 10,
+
+ ///
+ /// 类型
+ ///
+ Type = 11,
+
+ ///
+ /// 参数
+ ///
+ Parameter = 12,
+
+ ///
+ /// 注释
+ ///
+ Comment = 13,
+
+ ///
+ /// 文档注释
+ ///
+ DocumentationComment = 14
+}
+
+///
+/// 语法注释
+///
+public class SyntaxComment
+{
+ ///
+ /// 注释类型
+ ///
+ public CommentType Type { get; set; }
+
+ ///
+ /// 注释文本
+ ///
+ public string Text { get; set; } = string.Empty;
+
+ ///
+ /// 行号
+ ///
+ public int LineNumber { get; set; }
+}
+
+///
+/// 注释类型
+///
+public enum CommentType
+{
+ ///
+ /// 单行注释 //
+ ///
+ SingleLine = 0,
+
+ ///
+ /// 多行注释 /* */
+ ///
+ MultiLine = 1,
+
+ ///
+ /// XML 文档注释 ///
+ ///
+ XmlDoc = 2,
+
+ ///
+ /// JavaDoc /** */
+ ///
+ JavaDoc = 3,
+
+ ///
+ /// Doxygen /// 或 /** */
+ ///
+ Doxygen = 4
+}
+
+///
+/// 语法文档
+///
+public class SyntaxDocumentation
+{
+ ///
+ /// 文档所属元素
+ ///
+ public string ElementName { get; set; } = string.Empty;
+
+ ///
+ /// 文档内容
+ ///
+ public string Content { get; set; } = string.Empty;
+
+ ///
+ /// 文档格式
+ ///
+ public DocFormat Format { get; set; }
+}
+
+///
+/// 文档格式
+///
+public enum DocFormat
+{
+ ///
+ /// XML Doc (C#)
+ ///
+ XmlDoc = 0,
+
+ ///
+ /// JavaDoc (Java)
+ ///
+ JavaDoc = 1,
+
+ ///
+ /// Doxygen (C++)
+ ///
+ Doxygen = 2
+}
+
+///
+/// 转换上下文
+///
+public class ConversionContext
+{
+ ///
+ /// 源语言
+ ///
+ public LanguageType SourceLanguage { get; set; }
+
+ ///
+ /// 目标语言
+ ///
+ public LanguageType TargetLanguage { get; set; }
+
+ ///
+ /// 转换选项
+ ///
+ public ConversionOptions? Options { get; set; }
+
+ ///
+ /// 问题列表
+ ///
+ public List Issues { get; set; } = new();
+
+ ///
+ /// TODO 列表
+ ///
+ public List TodoItems { get; set; } = new();
+
+ ///
+ /// 转换日志
+ ///
+ public List Logs { get; set; } = new();
+}
+
+///
+/// 修复结果
+///
+public class FixResult
+{
+ ///
+ /// 是否可以修复
+ ///
+ public bool CanFix { get; set; }
+
+ ///
+ /// 修复后的代码
+ ///
+ public string? FixedCode { get; set; }
+
+ ///
+ /// 修复说明
+ ///
+ public string? FixDescription { get; set; }
+
+ ///
+ /// 剩余错误列表
+ ///
+ public List RemainingErrors { get; set; } = new();
+}
+
+///
+/// 编译验证结果
+///
+public class CompilationResult
+{
+ ///
+ /// 是否成功
+ ///
+ public bool Success { get; set; }
+
+ ///
+ /// 编译输出
+ ///
+ public string Output { get; set; } = string.Empty;
+
+ ///
+ /// 错误列表
+ ///
+ public List Errors { get; set; } = new();
+
+ ///
+ /// 警告列表
+ ///
+ public List Warnings { get; set; } = new();
+}
diff --git a/CodePlay.Core/Models/ConversionModels.cs b/CodePlay.Core/Models/ConversionModels.cs
new file mode 100644
index 0000000..f94bc3f
--- /dev/null
+++ b/CodePlay.Core/Models/ConversionModels.cs
@@ -0,0 +1,395 @@
+using CodePlay.Core.Common;
+
+namespace CodePlay.Core.Models;
+
+///
+/// 转换请求模型
+///
+public class ConversionRequest
+{
+ ///
+ /// 源代码
+ ///
+ public string SourceCode { get; set; } = string.Empty;
+
+ ///
+ /// 源语言
+ ///
+ public LanguageType SourceLanguage { get; set; }
+
+ ///
+ /// 目标语言
+ ///
+ public LanguageType TargetLanguage { get; set; }
+
+ ///
+ /// 项目 ID(可选)
+ ///
+ public string? ProjectId { get; set; }
+
+ ///
+ /// 验证轮次(1-3)
+ ///
+ public int ValidationRounds { get; set; } = 2;
+
+ ///
+ /// 转换选项
+ ///
+ public ConversionOptions? Options { get; set; }
+}
+
+///
+/// 转换选项
+///
+public class ConversionOptions
+{
+ ///
+ /// 保留注释
+ ///
+ public bool KeepComments { get; set; } = true;
+
+ ///
+ /// 保留文档字符串
+ ///
+ public bool KeepDocStrings { get; set; } = true;
+
+ ///
+ /// 保留代码格式
+ ///
+ public bool KeepFormatting { get; set; } = true;
+
+ ///
+ /// 缩进大小
+ ///
+ public int IndentSize { get; set; } = 4;
+
+ ///
+ /// 使用制表符缩进
+ ///
+ public bool UseTabs { get; set; } = false;
+
+ ///
+ /// 自动修复启用
+ ///
+ public bool EnableAutoFix { get; set; } = true;
+}
+
+///
+/// 转换结果模型
+///
+public class ConversionResult
+{
+ ///
+ /// 是否成功
+ ///
+ public bool Success { get; set; }
+
+ ///
+ /// 转换后的代码
+ ///
+ public string TransformedCode { get; set; } = string.Empty;
+
+ ///
+ /// 转换报告
+ ///
+ public ConversionReport? Report { get; set; }
+
+ ///
+ /// 警告列表
+ ///
+ public List Warnings { get; set; } = new();
+
+ ///
+ /// 验证摘要
+ ///
+ public ValidationSummary? ValidationSummary { get; set; }
+
+ ///
+ /// 错误信息
+ ///
+ public string? ErrorMessage { get; set; }
+}
+
+///
+/// 转换报告
+///
+public class ConversionReport
+{
+ ///
+ /// 转换的行数
+ ///
+ public int LinesConverted { get; set; }
+
+ ///
+ /// 转换的类数量
+ ///
+ public int ClassesConverted { get; set; }
+
+ ///
+ /// 转换的方法数量
+ ///
+ public int MethodsConverted { get; set; }
+
+ ///
+ /// 转换耗时
+ ///
+ public TimeSpan Duration { get; set; }
+
+ ///
+ /// 问题列表
+ ///
+ public List Issues { get; set; } = new();
+
+ ///
+ /// 转换日志
+ ///
+ public List TransformationLog { get; set; } = new();
+
+ ///
+ /// TODO 列表
+ ///
+ public List TodoItems { get; set; } = new();
+}
+
+///
+/// 转换警告
+///
+public class ConversionWarning
+{
+ ///
+ /// 警告代码
+ ///
+ public string Code { get; set; } = string.Empty;
+
+ ///
+ /// 警告消息
+ ///
+ public string Message { get; set; } = string.Empty;
+
+ ///
+ /// 行号
+ ///
+ public int LineNumber { get; set; }
+
+ ///
+ /// 列号
+ ///
+ public int ColumnNumber { get; set; }
+
+ ///
+ /// 建议
+ ///
+ public string? Suggestion { get; set; }
+}
+
+///
+/// 验证摘要
+///
+public class ValidationSummary
+{
+ ///
+ /// 是否通过验证
+ ///
+ public bool Passed { get; set; }
+
+ ///
+ /// 验证轮次
+ ///
+ public int RoundsExecuted { get; set; }
+
+ ///
+ /// 是否需要人工审查
+ ///
+ public bool NeedsManualReview { get; set; }
+
+ ///
+ /// 编译错误列表
+ ///
+ public List CompilationErrors { get; set; } = new();
+
+ ///
+ /// 验证日志
+ ///
+ public List ValidationLog { get; set; } = new();
+}
+
+///
+/// 转换问题
+///
+public class ConversionIssue
+{
+ ///
+ /// 问题类型
+ ///
+ public IssueType Type { get; set; }
+
+ ///
+ /// 问题描述
+ ///
+ public string Description { get; set; } = string.Empty;
+
+ ///
+ /// 位置(行号)
+ ///
+ public int LineNumber { get; set; }
+
+ ///
+ /// 原始代码片段
+ ///
+ public string? OriginalCode { get; set; }
+
+ ///
+ /// 建议操作
+ ///
+ public string? Suggestion { get; set; }
+}
+
+///
+/// 问题类型
+///
+public enum IssueType
+{
+ ///
+ /// 不可转换语法
+ ///
+ UnconvertibleSyntax = 0,
+
+ ///
+ /// 类型映射警告
+ ///
+ TypeMappingWarning = 1,
+
+ ///
+ /// API 差异
+ ///
+ ApiDifference = 2,
+
+ ///
+ /// 语义差异
+ ///
+ SemanticDifference = 3,
+
+ ///
+ /// 性能考虑
+ ///
+ PerformanceConsideration = 4
+}
+
+///
+/// 转换日志
+///
+public class TransformationLog
+{
+ ///
+ /// 时间戳
+ ///
+ public DateTime Timestamp { get; set; }
+
+ ///
+ /// 操作类型
+ ///
+ public string Operation { get; set; } = string.Empty;
+
+ ///
+ /// 详情
+ ///
+ public string Details { get; set; } = string.Empty;
+
+ ///
+ /// 日志级别
+ ///
+ public LogLevel Level { get; set; }
+}
+
+///
+/// 日志级别
+///
+public enum LogLevel
+{
+ ///
+ /// 信息
+ ///
+ Info = 0,
+
+ ///
+ /// 警告
+ ///
+ Warning = 1,
+
+ ///
+ /// 错误
+ ///
+ Error = 2,
+
+ ///
+ /// 调试
+ ///
+ Debug = 3
+}
+
+///
+/// TODO 项
+///
+public class TodoItem
+{
+ ///
+ /// TODO 描述
+ ///
+ public string Description { get; set; } = string.Empty;
+
+ ///
+ /// 位置(行号)
+ ///
+ public int LineNumber { get; set; }
+
+ ///
+ /// 原始语法说明
+ ///
+ public string OriginalSyntax { get; set; } = string.Empty;
+
+ ///
+ /// 为什么无法直接转换
+ ///
+ public string WhyNotDirect { get; set; } = string.Empty;
+
+ ///
+ /// 推荐的替代方案
+ ///
+ public string RecommendedAlternative { get; set; } = string.Empty;
+
+ ///
+ /// 参考代码位置
+ ///
+ public string? ReferenceLocation { get; set; }
+}
+
+///
+/// 编译错误
+///
+public class CompilationError
+{
+ ///
+ /// 错误 ID
+ ///
+ public string ErrorId { get; set; } = string.Empty;
+
+ ///
+ /// 错误消息
+ ///
+ public string Message { get; set; } = string.Empty;
+
+ ///
+ /// 行号
+ ///
+ public int LineNumber { get; set; }
+
+ ///
+ /// 列号
+ ///
+ public int ColumnNumber { get; set; }
+
+ ///
+ /// 错误级别(错误或警告)
+ ///
+ public bool IsError { get; set; } = true;
+}
diff --git a/CodePlay.Core/Models/ProjectModels.cs b/CodePlay.Core/Models/ProjectModels.cs
new file mode 100644
index 0000000..238ff5a
--- /dev/null
+++ b/CodePlay.Core/Models/ProjectModels.cs
@@ -0,0 +1,141 @@
+using CodePlay.Core.Common;
+
+namespace CodePlay.Core.Models;
+
+///
+/// 项目模型
+///
+public class Project
+{
+ ///
+ /// 项目 ID
+ ///
+ public string Id { get; set; } = Guid.NewGuid().ToString("N");
+
+ ///
+ /// 项目名称
+ ///
+ public string Name { get; set; } = string.Empty;
+
+ ///
+ /// 源语言
+ ///
+ public LanguageType SourceLanguage { get; set; }
+
+ ///
+ /// 目标语言
+ ///
+ public LanguageType TargetLanguage { get; set; }
+
+ ///
+ /// 项目状态
+ ///
+ public ProjectStatus Status { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
+
+ ///
+ /// 更新时间
+ ///
+ public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
+
+ ///
+ /// 转换任务列表
+ ///
+ public List Tasks { get; set; } = new();
+
+ ///
+ /// 配置
+ ///
+ public ProjectConfiguration? Configuration { get; set; }
+}
+
+///
+/// 转换任务
+///
+public class ConversionTask
+{
+ ///
+ /// 任务 ID
+ ///
+ public string Id { get; set; } = Guid.NewGuid().ToString("N");
+
+ ///
+ /// 源文件路径
+ ///
+ public string SourceFilePath { get; set; } = string.Empty;
+
+ ///
+ /// 目标文件路径
+ ///
+ public string TargetFilePath { get; set; } = string.Empty;
+
+ ///
+ /// 源代码
+ ///
+ public string? SourceCode { get; set; }
+
+ ///
+ /// 转换后的代码
+ ///
+ public string? TransformedCode { get; set; }
+
+ ///
+ /// 转换状态
+ ///
+ public ConversionStatus Status { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
+
+ ///
+ /// 完成时间
+ ///
+ public DateTime? CompletedAt { get; set; }
+
+ ///
+ /// 转换结果
+ ///
+ public ConversionResult? Result { get; set; }
+}
+
+///
+/// 项目配置
+///
+public class ProjectConfiguration
+{
+ ///
+ /// 验证轮次
+ ///
+ public int ValidationRounds { get; set; } = 2;
+
+ ///
+ /// 自动修复启用
+ ///
+ public bool EnableAutoFix { get; set; } = true;
+
+ ///
+ /// 保留注释
+ ///
+ public bool KeepComments { get; set; } = true;
+
+ ///
+ /// 保留文档字符串
+ ///
+ public bool KeepDocStrings { get; set; } = true;
+
+ ///
+ /// 缩进大小
+ ///
+ public int IndentSize { get; set; } = 4;
+
+ ///
+ /// 输出目录
+ ///
+ public string? OutputDirectory { get; set; }
+}
diff --git a/CodePlay.Core/Parsers/BaseParser.cs b/CodePlay.Core/Parsers/BaseParser.cs
new file mode 100644
index 0000000..ae72470
--- /dev/null
+++ b/CodePlay.Core/Parsers/BaseParser.cs
@@ -0,0 +1,63 @@
+using CodePlay.Core.Interfaces;
+using CodePlay.Core.Models;
+using CodePlay.Core.Common;
+
+namespace CodePlay.Core.Parsers;
+
+///
+/// 解析器基类
+///
+public abstract class BaseParser : IParser
+{
+ ///
+ /// 支持的语言类型
+ ///
+ public abstract LanguageType SupportedLanguage { get; }
+
+ ///
+ /// 解析源代码并生成 AST
+ ///
+ public abstract Task ParseAsync(string sourceCode, CancellationToken cancellationToken = default);
+
+ ///
+ /// 创建语法树
+ ///
+ protected SyntaxTree CreateSyntaxTree()
+ {
+ return new SyntaxTree
+ {
+ Language = SupportedLanguage,
+ Root = new SyntaxNode
+ {
+ Type = SyntaxNodeType.CompilationUnit
+ }
+ };
+ }
+
+ ///
+ /// 添加注释到语法树
+ ///
+ protected void AddComment(SyntaxTree tree, string text, CommentType type, int lineNumber)
+ {
+ tree.Comments.Add(new SyntaxComment
+ {
+ Text = text,
+ Type = type,
+ LineNumber = lineNumber
+ });
+ }
+
+ ///
+ /// 记录解析日志
+ ///
+ protected TransformationLog CreateLog(string operation, string details, LogLevel level = LogLevel.Info)
+ {
+ return new TransformationLog
+ {
+ Timestamp = DateTime.UtcNow,
+ Operation = operation,
+ Details = details,
+ Level = level
+ };
+ }
+}
diff --git a/CodePlay.Core/Parsers/CSharpParser.cs b/CodePlay.Core/Parsers/CSharpParser.cs
new file mode 100644
index 0000000..19e8433
--- /dev/null
+++ b/CodePlay.Core/Parsers/CSharpParser.cs
@@ -0,0 +1,129 @@
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using CodePlay.Core.Models;
+using CodePlay.Core.Common;
+using CodePlay.Core.Interfaces;
+
+namespace CodePlay.Core.Parsers;
+
+///
+/// C# 语法解析器
+///
+public class CSharpParser : BaseParser
+{
+ ///
+ /// 支持的语言类型
+ ///
+ public override LanguageType SupportedLanguage => LanguageType.CSharp;
+
+ ///
+ /// 解析 C# 源代码
+ ///
+ public override Task ParseAsync(string sourceCode, CancellationToken cancellationToken = default)
+ {
+ var tree = CreateSyntaxTree();
+ tree.SourceCode = sourceCode;
+
+ var compilationUnit = CSharpSyntaxTree.ParseText(sourceCode, cancellationToken: cancellationToken);
+ var root = compilationUnit.GetRoot(cancellationToken);
+
+ tree.Root = ConvertNode(root);
+ ExtractComments(tree, root);
+ ExtractDocumentation(tree, root);
+
+ return Task.FromResult(tree);
+ }
+
+ private Interfaces.SyntaxNode ConvertNode(Microsoft.CodeAnalysis.SyntaxNode node)
+ {
+ var newNode = new Interfaces.SyntaxNode
+ {
+ Type = MapNodeType(node.Kind()),
+ Text = node.ToString(),
+ Metadata = new Dictionary()
+ };
+
+ foreach (var child in node.ChildNodes())
+ {
+ var childNode = ConvertNode(child);
+ childNode.Parent = newNode;
+ newNode.Children.Add(childNode);
+ }
+
+ return newNode;
+ }
+
+ private SyntaxNodeType MapNodeType(Microsoft.CodeAnalysis.CSharp.SyntaxKind kind)
+ {
+ return kind switch
+ {
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.CompilationUnit => SyntaxNodeType.CompilationUnit,
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.NamespaceDeclaration => SyntaxNodeType.Namespace,
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.ClassDeclaration => SyntaxNodeType.Class,
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.InterfaceDeclaration => SyntaxNodeType.Interface,
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.MethodDeclaration => SyntaxNodeType.Method,
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.PropertyDeclaration => SyntaxNodeType.Property,
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.FieldDeclaration => SyntaxNodeType.Field,
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.ConstructorDeclaration => SyntaxNodeType.Constructor,
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.Parameter => SyntaxNodeType.Parameter,
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.TypeArgumentList or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.GenericName => SyntaxNodeType.Type,
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.Block or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.ExpressionStatement or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.IfStatement or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.ForStatement or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.ForEachStatement or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.WhileStatement or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.ReturnStatement => SyntaxNodeType.Statement,
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.InvocationExpression or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.AddExpression or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.SubtractExpression or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.MultiplyExpression or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.DivideExpression or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.SimpleAssignmentExpression => SyntaxNodeType.Expression,
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.SingleLineCommentTrivia or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.MultiLineCommentTrivia => SyntaxNodeType.Comment,
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.SingleLineDocumentationCommentTrivia or
+ Microsoft.CodeAnalysis.CSharp.SyntaxKind.MultiLineDocumentationCommentTrivia => SyntaxNodeType.DocumentationComment,
+ _ => SyntaxNodeType.Unknown
+ };
+ }
+
+ private void ExtractComments(Interfaces.SyntaxTree tree, Microsoft.CodeAnalysis.SyntaxNode root)
+ {
+ var trivia = root.DescendantTrivia()
+ .Where(t => t.IsKind(Microsoft.CodeAnalysis.CSharp.SyntaxKind.SingleLineCommentTrivia) ||
+ t.IsKind(Microsoft.CodeAnalysis.CSharp.SyntaxKind.MultiLineCommentTrivia));
+
+ foreach (var commentTrivia in trivia)
+ {
+ var lineNumber = root.SyntaxTree.GetLineSpan(commentTrivia.Span).StartLinePosition.Line + 1;
+ var type = commentTrivia.IsKind(Microsoft.CodeAnalysis.CSharp.SyntaxKind.SingleLineCommentTrivia)
+ ? CommentType.SingleLine
+ : CommentType.MultiLine;
+
+ AddComment(tree, commentTrivia.ToString(), type, lineNumber);
+ }
+ }
+
+ private void ExtractDocumentation(Interfaces.SyntaxTree tree, Microsoft.CodeAnalysis.SyntaxNode root)
+ {
+ var docComments = root.DescendantTrivia()
+ .Where(t => t.IsKind(Microsoft.CodeAnalysis.CSharp.SyntaxKind.SingleLineDocumentationCommentTrivia) ||
+ t.IsKind(Microsoft.CodeAnalysis.CSharp.SyntaxKind.MultiLineDocumentationCommentTrivia));
+
+ foreach (var docComment in docComments)
+ {
+ var node = root.FindNode(docComment.Span);
+ var lineNumber = root.SyntaxTree.GetLineSpan(docComment.Span).StartLinePosition.Line + 1;
+
+ tree.Documentation.Add(new SyntaxDocumentation
+ {
+ ElementName = node.Parent?.ToString() ?? "Unknown",
+ Content = docComment.ToString(),
+ Format = DocFormat.XmlDoc
+ });
+ }
+ }
+}
diff --git a/CodePlay.Tests/CodePlay.Tests.csproj b/CodePlay.Tests/CodePlay.Tests.csproj
new file mode 100644
index 0000000..3aa9860
--- /dev/null
+++ b/CodePlay.Tests/CodePlay.Tests.csproj
@@ -0,0 +1,23 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CodePlay.Web/CodePlay.Web.csproj b/CodePlay.Web/CodePlay.Web.csproj
new file mode 100644
index 0000000..fa018d2
--- /dev/null
+++ b/CodePlay.Web/CodePlay.Web.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/CodePlay.Web/CodePlay.Web.http b/CodePlay.Web/CodePlay.Web.http
new file mode 100644
index 0000000..831135e
--- /dev/null
+++ b/CodePlay.Web/CodePlay.Web.http
@@ -0,0 +1,6 @@
+@CodePlay.Web_HostAddress = http://localhost:5014
+
+GET {{CodePlay.Web_HostAddress}}/weatherforecast/
+Accept: application/json
+
+###
diff --git a/CodePlay.Web/Controllers/WeatherForecastController.cs b/CodePlay.Web/Controllers/WeatherForecastController.cs
new file mode 100644
index 0000000..dfece4c
--- /dev/null
+++ b/CodePlay.Web/Controllers/WeatherForecastController.cs
@@ -0,0 +1,32 @@
+using Microsoft.AspNetCore.Mvc;
+
+namespace CodePlay.Web.Controllers;
+
+[ApiController]
+[Route("[controller]")]
+public class WeatherForecastController : ControllerBase
+{
+ private static readonly string[] Summaries = new[]
+ {
+ "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
+ };
+
+ private readonly ILogger _logger;
+
+ public WeatherForecastController(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ [HttpGet(Name = "GetWeatherForecast")]
+ public IEnumerable Get()
+ {
+ return Enumerable.Range(1, 5).Select(index => new WeatherForecast
+ {
+ Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
+ TemperatureC = Random.Shared.Next(-20, 55),
+ Summary = Summaries[Random.Shared.Next(Summaries.Length)]
+ })
+ .ToArray();
+ }
+}
diff --git a/CodePlay.Web/Program.cs b/CodePlay.Web/Program.cs
new file mode 100644
index 0000000..15eacee
--- /dev/null
+++ b/CodePlay.Web/Program.cs
@@ -0,0 +1,25 @@
+var builder = WebApplication.CreateBuilder(args);
+
+// Add services to the container.
+
+builder.Services.AddControllers();
+// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
+builder.Services.AddEndpointsApiExplorer();
+builder.Services.AddSwaggerGen();
+
+var app = builder.Build();
+
+// Configure the HTTP request pipeline.
+if (app.Environment.IsDevelopment())
+{
+ app.UseSwagger();
+ app.UseSwaggerUI();
+}
+
+app.UseHttpsRedirection();
+
+app.UseAuthorization();
+
+app.MapControllers();
+
+app.Run();
diff --git a/CodePlay.Web/Properties/launchSettings.json b/CodePlay.Web/Properties/launchSettings.json
new file mode 100644
index 0000000..5c71099
--- /dev/null
+++ b/CodePlay.Web/Properties/launchSettings.json
@@ -0,0 +1,41 @@
+{
+ "$schema": "http://json.schemastore.org/launchsettings.json",
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:26925",
+ "sslPort": 44339
+ }
+ },
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "applicationUrl": "http://localhost:5014",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "applicationUrl": "https://localhost:7184;http://localhost:5014",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/CodePlay.Web/WeatherForecast.cs b/CodePlay.Web/WeatherForecast.cs
new file mode 100644
index 0000000..64b59c6
--- /dev/null
+++ b/CodePlay.Web/WeatherForecast.cs
@@ -0,0 +1,12 @@
+namespace CodePlay.Web;
+
+public class WeatherForecast
+{
+ public DateOnly Date { get; set; }
+
+ public int TemperatureC { get; set; }
+
+ public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
+
+ public string? Summary { get; set; }
+}
diff --git a/CodePlay.Web/appsettings.Development.json b/CodePlay.Web/appsettings.Development.json
new file mode 100644
index 0000000..ff66ba6
--- /dev/null
+++ b/CodePlay.Web/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/CodePlay.Web/appsettings.json b/CodePlay.Web/appsettings.json
new file mode 100644
index 0000000..4d56694
--- /dev/null
+++ b/CodePlay.Web/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/CodePlay.sln b/CodePlay.sln
new file mode 100644
index 0000000..8de0f73
--- /dev/null
+++ b/CodePlay.sln
@@ -0,0 +1,40 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31903.59
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodePlay.Core", "CodePlay.Core\CodePlay.Core.csproj", "{6C296C09-172A-4730-ABA5-0D31FA4CCC52}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodePlay.Web", "CodePlay.Web\CodePlay.Web.csproj", "{A6FC59FF-048E-4B6E-8A96-CDC167FE7653}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodePlay.CLI", "CodePlay.CLI\CodePlay.CLI.csproj", "{FA101DCD-3B12-492D-90A0-5E38B0F07490}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodePlay.Tests", "CodePlay.Tests\CodePlay.Tests.csproj", "{71E9A854-8329-40F7-BA23-DF75CF799074}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6C296C09-172A-4730-ABA5-0D31FA4CCC52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6C296C09-172A-4730-ABA5-0D31FA4CCC52}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6C296C09-172A-4730-ABA5-0D31FA4CCC52}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6C296C09-172A-4730-ABA5-0D31FA4CCC52}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A6FC59FF-048E-4B6E-8A96-CDC167FE7653}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A6FC59FF-048E-4B6E-8A96-CDC167FE7653}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A6FC59FF-048E-4B6E-8A96-CDC167FE7653}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A6FC59FF-048E-4B6E-8A96-CDC167FE7653}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FA101DCD-3B12-492D-90A0-5E38B0F07490}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FA101DCD-3B12-492D-90A0-5E38B0F07490}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FA101DCD-3B12-492D-90A0-5E38B0F07490}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FA101DCD-3B12-492D-90A0-5E38B0F07490}.Release|Any CPU.Build.0 = Release|Any CPU
+ {71E9A854-8329-40F7-BA23-DF75CF799074}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {71E9A854-8329-40F7-BA23-DF75CF799074}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {71E9A854-8329-40F7-BA23-DF75CF799074}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {71E9A854-8329-40F7-BA23-DF75CF799074}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal