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("