using CodePlay.Core.Interfaces;
using CodePlay.Core.Models;
using System.Text;
using CodePlay.Core.Common;
namespace CodePlay.Core.Converters;
///
/// C# 到 C++ 转换器
///
public class CSharpToCppConverter : IConverter
{
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.CPlusPlus)
{
result.ErrorMessage = "This converter only supports C# to C++ conversion";
return result;
}
try
{
var cppCode = ConvertToCpp(syntaxTree, result.Report, options);
result.Success = true;
result.TransformedCode = cppCode;
result.Report.ClassesConverted = 1;
}
catch (Exception ex)
{
result.Success = false;
result.ErrorMessage = ex.Message;
}
return await Task.FromResult(result);
}
private string ConvertToCpp(Interfaces.SyntaxTree parsed, ConversionReport report, ConversionOptions? options)
{
var sb = new StringBuilder();
sb.AppendLine("#include ");
sb.AppendLine("#include ");
sb.AppendLine("#include ");
sb.AppendLine("#include ");
sb.AppendLine();
ExtractAndConvertClasses(parsed.Root, sb, report);
return sb.ToString();
}
private void ExtractAndConvertClasses(SyntaxNode node, StringBuilder sb, ConversionReport report)
{
if (node.Type == SyntaxNodeType.Class)
{
var className = node.Metadata.TryGetValue("Name", out var name) ? name?.ToString() ?? "Unknown" : "Unknown";
sb.AppendLine($"class {className} {{");
sb.AppendLine("public:");
sb.AppendLine($" {className}() {{}}");
sb.AppendLine("};");
sb.AppendLine();
report.ClassesConverted++;
}
foreach (var child in node.Children)
{
ExtractAndConvertClasses(child, sb, report);
}
}
}