using CodePlay.Core.Interfaces;
using CodePlay.Core.Models;
using CodePlay.Core.Common;
namespace CodePlay.Core.Converters;
///
/// Java 到 C# 代码转换器
///
public class JavaToCSharpConverter : IConverter
{
private readonly JavaToCSharpStrategy _strategy;
private readonly CSharpCodeGenerator _codeGenerator;
public JavaToCSharpConverter()
{
_strategy = new JavaToCSharpStrategy();
_codeGenerator = new CSharpCodeGenerator();
}
///
/// 转换语法树
///
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.CSharp)
{
result.ErrorMessage = "This converter only supports Java to C# conversion";
return result;
}
try
{
var context = new ConversionContext
{
SourceLanguage = LanguageType.Java,
TargetLanguage = LanguageType.CSharp,
Options = options
};
// 转换根节点
var convertedRoot = _strategy.ConvertNode(syntaxTree.Root, context);
// 创建新的语法树
var convertedTree = new Interfaces.SyntaxTree
{
Language = LanguageType.CSharp,
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.XmlDoc
}).ToList();
}
// 生成 C# 代码
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;
result.Report.TransformationLog = context.Logs;
}
context.Logs.Add(new TransformationLog
{
Timestamp = DateTime.UtcNow,
Operation = "Conversion",
Details = "Java to C# conversion completed",
Level = LogLevel.Info
});
result.Warnings = context.Issues
.Select(i => new ConversionWarning
{
Code = $"WARN_{i.Type}",
Message = i.Description,
Suggestion = i.Suggestion
}).ToList();
}
catch (Exception ex)
{
result.ErrorMessage = ex.Message;
result.Success = false;
}
return await Task.FromResult(result);
}
private string ConvertDocumentation(string javaDocContent)
{
// JavaDoc 到 XML Doc 转换
var content = javaDocContent
.Replace("/**", "///")
.Replace("*/", "")
.Replace("*", "///")
.Replace("@param ", "")
.Replace("@throws ", "