feat: 完成 CodePlay 项目初始化和核心解析器实现

- 创建 CodePlay 解决方案和 4 个项目 (Core, Web, CLI, Tests)
- 实现核心数据模型 (ConversionRequest, ConversionResult, Project 等)
- 实现核心接口 (IParser, IConverter, ICodeGenerator 等)
- 实现基础抽象类 BaseParser
- 实现 CSharpParser 解析器 (基于 Roslyn)
- 添加 Microsoft.CodeAnalysis.CSharp NuGet 包
- 所有代码编译通过
Co-authored-by: monkeycode-ai <monkeycode-ai@chaitin.com>
This commit is contained in:
monkeycode-ai
2026-06-03 02:57:13 +00:00
parent d260763e7a
commit a0971cf974
21 changed files with 1553 additions and 16 deletions
+449
View File
@@ -0,0 +1,449 @@
using CodePlay.Core.Models;
using CodePlay.Core.Common;
namespace CodePlay.Core.Interfaces;
/// <summary>
/// 语言解析器接口
/// </summary>
public interface IParser
{
/// <summary>
/// 解析源代码并生成 AST
/// </summary>
/// <param name="sourceCode">源代码</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>语法树</returns>
Task<SyntaxTree> ParseAsync(string sourceCode, CancellationToken cancellationToken = default);
}
/// <summary>
/// 代码转换器接口
/// </summary>
public interface IConverter
{
/// <summary>
/// 转换语法树
/// </summary>
/// <param name="syntaxTree">源语言语法树</param>
/// <param name="targetLanguage">目标语言</param>
/// <param name="options">转换选项</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>转换结果</returns>
Task<ConversionResult> ConvertAsync(SyntaxTree syntaxTree, LanguageType targetLanguage, ConversionOptions? options = null, CancellationToken cancellationToken = default);
}
/// <summary>
/// 代码生成器接口
/// </summary>
public interface ICodeGenerator
{
/// <summary>
/// 从语法树生成代码
/// </summary>
/// <param name="syntaxTree">语法树</param>
/// <returns>生成的代码</returns>
string Generate(SyntaxTree syntaxTree);
}
/// <summary>
/// 编译验证器接口
/// </summary>
public interface ICompilerValidator
{
/// <summary>
/// 编译并验证代码
/// </summary>
/// <param name="code">代码</param>
/// <param name="language">语言类型</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>验证结果</returns>
Task<ValidationResult> ValidateAsync(string code, LanguageType language, CancellationToken cancellationToken = default);
}
/// <summary>
/// 自动修复引擎接口
/// </summary>
public interface IAutoFixEngine
{
/// <summary>
/// 尝试修复编译错误
/// </summary>
/// <param name="code">代码</param>
/// <param name="errors">编译错误列表</param>
/// <param name="round">当前修复轮次</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>修复结果</returns>
Task<FixResult> FixAsync(string code, List<CompilationError> errors, int round, CancellationToken cancellationToken = default);
}
/// <summary>
/// 转换策略接口
/// </summary>
public interface IConversionStrategy
{
/// <summary>
/// 源语言
/// </summary>
LanguageType SourceLanguage { get; }
/// <summary>
/// 目标语言
/// </summary>
LanguageType TargetLanguage { get; }
/// <summary>
/// 转换语法节点
/// </summary>
/// <param name="node">语法节点</param>
/// <param name="context">转换上下文</param>
/// <returns>转换后的节点</returns>
SyntaxNode ConvertNode(SyntaxNode node, ConversionContext context);
/// <summary>
/// 映射类型
/// </summary>
/// <param name="sourceType">源类型名称</param>
/// <returns>目标类型名称</returns>
string MapType(string sourceType);
}
/// <summary>
/// 语法树
/// </summary>
public class SyntaxTree
{
/// <summary>
/// 语言类型
/// </summary>
public LanguageType Language { get; set; }
/// <summary>
/// 根节点
/// </summary>
public SyntaxNode Root { get; set; } = new();
/// <summary>
/// 源文件路径
/// </summary>
public string? SourceFilePath { get; set; }
/// <summary>
/// 原始源代码
/// </summary>
public string? SourceCode { get; set; }
/// <summary>
/// 注释列表
/// </summary>
public List<SyntaxComment> Comments { get; set; } = new();
/// <summary>
/// 文档字符串列表
/// </summary>
public List<SyntaxDocumentation> Documentation { get; set; } = new();
}
/// <summary>
/// 语法节点
/// </summary>
public class SyntaxNode
{
/// <summary>
/// 节点类型
/// </summary>
public SyntaxNodeType Type { get; set; }
/// <summary>
/// 节点文本
/// </summary>
public string Text { get; set; } = string.Empty;
/// <summary>
/// 子节点列表
/// </summary>
public List<SyntaxNode> Children { get; set; } = new();
/// <summary>
/// 元数据
/// </summary>
public Dictionary<string, object?> Metadata { get; set; } = new();
/// <summary>
/// 父节点
/// </summary>
public SyntaxNode? Parent { get; set; }
/// <summary>
/// 是否为不可转换语法
/// </summary>
public bool IsUnconvertible { get; set; }
/// <summary>
/// TODO 说明(当 IsUnconvertible 为 true 时)
/// </summary>
public string? TodoDescription { get; set; }
}
/// <summary>
/// 语法节点类型
/// </summary>
public enum SyntaxNodeType
{
/// <summary>
/// 未知
/// </summary>
Unknown = 0,
/// <summary>
/// 编译单元
/// </summary>
CompilationUnit = 1,
/// <summary>
/// 命名空间
/// </summary>
Namespace = 2,
/// <summary>
/// 类
/// </summary>
Class = 3,
/// <summary>
/// 接口
/// </summary>
Interface = 4,
/// <summary>
/// 方法
/// </summary>
Method = 5,
/// <summary>
/// 属性
/// </summary>
Property = 6,
/// <summary>
/// 字段
/// </summary>
Field = 7,
/// <summary>
/// 构造函数
/// </summary>
Constructor = 8,
/// <summary>
/// 语句
/// </summary>
Statement = 9,
/// <summary>
/// 表达式
/// </summary>
Expression = 10,
/// <summary>
/// 类型
/// </summary>
Type = 11,
/// <summary>
/// 参数
/// </summary>
Parameter = 12,
/// <summary>
/// 注释
/// </summary>
Comment = 13,
/// <summary>
/// 文档注释
/// </summary>
DocumentationComment = 14
}
/// <summary>
/// 语法注释
/// </summary>
public class SyntaxComment
{
/// <summary>
/// 注释类型
/// </summary>
public CommentType Type { get; set; }
/// <summary>
/// 注释文本
/// </summary>
public string Text { get; set; } = string.Empty;
/// <summary>
/// 行号
/// </summary>
public int LineNumber { get; set; }
}
/// <summary>
/// 注释类型
/// </summary>
public enum CommentType
{
/// <summary>
/// 单行注释 //
/// </summary>
SingleLine = 0,
/// <summary>
/// 多行注释 /* */
/// </summary>
MultiLine = 1,
/// <summary>
/// XML 文档注释 ///
/// </summary>
XmlDoc = 2,
/// <summary>
/// JavaDoc /** */
/// </summary>
JavaDoc = 3,
/// <summary>
/// Doxygen /// 或 /** */
/// </summary>
Doxygen = 4
}
/// <summary>
/// 语法文档
/// </summary>
public class SyntaxDocumentation
{
/// <summary>
/// 文档所属元素
/// </summary>
public string ElementName { get; set; } = string.Empty;
/// <summary>
/// 文档内容
/// </summary>
public string Content { get; set; } = string.Empty;
/// <summary>
/// 文档格式
/// </summary>
public DocFormat Format { get; set; }
}
/// <summary>
/// 文档格式
/// </summary>
public enum DocFormat
{
/// <summary>
/// XML Doc (C#)
/// </summary>
XmlDoc = 0,
/// <summary>
/// JavaDoc (Java)
/// </summary>
JavaDoc = 1,
/// <summary>
/// Doxygen (C++)
/// </summary>
Doxygen = 2
}
/// <summary>
/// 转换上下文
/// </summary>
public class ConversionContext
{
/// <summary>
/// 源语言
/// </summary>
public LanguageType SourceLanguage { get; set; }
/// <summary>
/// 目标语言
/// </summary>
public LanguageType TargetLanguage { get; set; }
/// <summary>
/// 转换选项
/// </summary>
public ConversionOptions? Options { get; set; }
/// <summary>
/// 问题列表
/// </summary>
public List<ConversionIssue> Issues { get; set; } = new();
/// <summary>
/// TODO 列表
/// </summary>
public List<TodoItem> TodoItems { get; set; } = new();
/// <summary>
/// 转换日志
/// </summary>
public List<TransformationLog> Logs { get; set; } = new();
}
/// <summary>
/// 修复结果
/// </summary>
public class FixResult
{
/// <summary>
/// 是否可以修复
/// </summary>
public bool CanFix { get; set; }
/// <summary>
/// 修复后的代码
/// </summary>
public string? FixedCode { get; set; }
/// <summary>
/// 修复说明
/// </summary>
public string? FixDescription { get; set; }
/// <summary>
/// 剩余错误列表
/// </summary>
public List<CompilationError> RemainingErrors { get; set; } = new();
}
/// <summary>
/// 编译验证结果
/// </summary>
public class CompilationResult
{
/// <summary>
/// 是否成功
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 编译输出
/// </summary>
public string Output { get; set; } = string.Empty;
/// <summary>
/// 错误列表
/// </summary>
public List<CompilationError> Errors { get; set; } = new();
/// <summary>
/// 警告列表
/// </summary>
public List<CompilationError> Warnings { get; set; } = new();
}