using CodePlay.Core.Interfaces; using CodePlay.Core.Models; using CodePlay.Core.Common; using CodePlay.Core.Parsers; namespace CodePlay.Core.Converters; /// /// C# 到 Java 代码转换器 /// public class CSharpToJavaConverter : IConverter { private readonly CSharpToJavaStrategy _strategy; private readonly ICodeGenerator _codeGenerator; public CSharpToJavaConverter() { _strategy = new CSharpToJavaStrategy(); _codeGenerator = new JavaCodeGenerator(); } /// /// 转换语法树 /// public async Task ConvertAsync( Interfaces.SyntaxTree syntaxTree, LanguageType targetLanguage, ConversionOptions? options = null, CancellationToken cancellationToken = default) { var result = new ConversionResult { Success = false, Warnings = new List(), Report = new ConversionReport() }; if (targetLanguage != LanguageType.Java) { result.ErrorMessage = "This converter only supports C# to Java conversion"; return result; } try { var context = new ConversionContext { SourceLanguage = LanguageType.CSharp, TargetLanguage = LanguageType.Java, Options = options }; // 转换根节点 var convertedRoot = _strategy.ConvertNode(syntaxTree.Root, context); // 创建新的语法树 var convertedTree = new Interfaces.SyntaxTree { Language = LanguageType.Java, Root = convertedRoot, SourceCode = syntaxTree.SourceCode }; // 保留注释 if (options?.KeepComments == true) { convertedTree.Documentation = syntaxTree.Documentation .Select(d => new SyntaxDocumentation { ElementName = d.ElementName, Content = ConvertDocumentation(d.Content), Format = DocFormat.JavaDoc }).ToList(); } // 生成 Java 代码 var generatedCode = _codeGenerator.Generate(convertedTree); result.TransformedCode = generatedCode; result.Success = true; // 生成报告 if (result.Report != null) { result.Report.LinesConverted = syntaxTree.SourceCode?.Split('\n').Length ?? 0; result.Report.ClassesConverted = CountClasses(syntaxTree.Root); result.Report.MethodsConverted = CountMethods(syntaxTree.Root); result.Report.TodoItems = context.TodoItems; result.Report.Issues = context.Issues.Select(i => new IssueInfo { Description = i.Description, Severity = i.Severity, Line = i.Line, Suggestion = i.Suggestion }).ToList(); result.Report.TransformationLog = context.Logs.Select(l => new TransformationLogEntry { Timestamp = l.Timestamp, Operation = l.Operation, Details = l.Details, Level = l.Level.ToString() }).ToList(); } context.Logs.Add(new TransformationLog { Timestamp = DateTime.UtcNow, Operation = "Conversion", Details = "C# to Java conversion completed", Level = LogLevel.Info }); } catch (Exception ex) { result.ErrorMessage = ex.Message; result.Success = false; } return await Task.FromResult(result); } private string ConvertDocumentation(string xmlDocContent) { // 简单的 XML Doc 到 JavaDoc 转换 return xmlDocContent .Replace("///", " *") .Replace("", "") .Replace("", "") .Replace("", "@return") .Replace("", "") .Replace("