diff --git a/CodePlay.Core/Services/ConversionService.cs b/CodePlay.Core/Services/ConversionService.cs
index 64ebc39..1eea0da 100644
--- a/CodePlay.Core/Services/ConversionService.cs
+++ b/CodePlay.Core/Services/ConversionService.cs
@@ -3,6 +3,7 @@ using CodePlay.Core.Models;
using CodePlay.Core.Common;
using CodePlay.Core.Parsers;
using CodePlay.Core.Converters;
+using CodePlay.Core.Validators;
namespace CodePlay.Core.Services;
@@ -12,12 +13,16 @@ namespace CodePlay.Core.Services;
public class ConversionService
{
private readonly Dictionary<(LanguageType, LanguageType), IConverter> _converters = new();
+ private readonly ValidationPipeline _validationPipeline;
public ConversionService()
{
// 注册转换器
RegisterConverter(LanguageType.CSharp, LanguageType.Java, new CSharpToJavaConverter());
RegisterConverter(LanguageType.Java, LanguageType.CSharp, new JavaToCSharpConverter());
+
+ // 初始化验证流水线
+ _validationPipeline = new ValidationPipeline();
}
private void RegisterConverter(LanguageType source, LanguageType target, IConverter converter)
@@ -59,6 +64,24 @@ public class ConversionService
// 执行转换
var result = await converter.ConvertAsync(syntaxTree, request.TargetLanguage, request.Options, cancellationToken);
+ // 执行验证(仅当目标语言是 C# 时)
+ if (result.Success && request.TargetLanguage == LanguageType.CSharp && request.ValidationRounds > 0)
+ {
+ var validationSummary = await _validationPipeline.ValidateAsync(
+ result.TransformedCode,
+ request.TargetLanguage,
+ request.ValidationRounds,
+ cancellationToken);
+
+ result.ValidationSummary = validationSummary;
+
+ if (!validationSummary.Passed)
+ {
+ result.Success = false;
+ result.ErrorMessage = $"Validation failed after {validationSummary.RoundsExecuted} rounds";
+ }
+ }
+
return result;
}
catch (Exception ex)
diff --git a/CodePlay.Core/Validators/AutoFixEngine.cs b/CodePlay.Core/Validators/AutoFixEngine.cs
new file mode 100644
index 0000000..2462a78
--- /dev/null
+++ b/CodePlay.Core/Validators/AutoFixEngine.cs
@@ -0,0 +1,199 @@
+using System.Text;
+using CodePlay.Core.Interfaces;
+using CodePlay.Core.Models;
+using CodePlay.Core.Common;
+
+namespace CodePlay.Core.Validators;
+
+///
+/// 自动修复引擎
+///
+public class AutoFixEngine
+{
+ ///
+ /// 尝试修复编译错误
+ ///
+ public Task FixAsync(string code, List errors, int round, CancellationToken cancellationToken = default)
+ {
+ var result = new FixResult
+ {
+ CanFix = false,
+ RemainingErrors = new List()
+ };
+
+ if (errors == null || errors.Count == 0)
+ {
+ result.CanFix = true;
+ result.FixedCode = code;
+ result.FixDescription = "No errors to fix";
+ return Task.FromResult(result);
+ }
+
+ switch (round)
+ {
+ case 1:
+ result = FixRound1(code, errors);
+ break;
+ case 2:
+ result = FixRound2(code, errors);
+ break;
+ case 3:
+ result = FixRound3(code, errors);
+ break;
+ default:
+ result.RemainingErrors = errors;
+ break;
+ }
+
+ return Task.FromResult(result);
+ }
+
+ ///
+ /// 第 1 轮:修复导入/using 语句
+ ///
+ private FixResult FixRound1(string code, List errors)
+ {
+ var result = new FixResult
+ {
+ CanFix = false,
+ RemainingErrors = new List(),
+ FixDescription = string.Empty
+ };
+
+ var needsSystemUsing = false;
+ var needsCollectionsUsing = false;
+ var needsLinqUsing = false;
+
+ foreach (var error in errors)
+ {
+ if (error.ErrorId == "CS0246" || error.ErrorId == "CS0103")
+ {
+ if (error.Message.Contains("Console"))
+ {
+ needsSystemUsing = true;
+ }
+ else if (error.Message.Contains("List") || error.Message.Contains("Dictionary"))
+ {
+ needsCollectionsUsing = true;
+ }
+ else if (error.Message.Contains("LINQ") || error.Message.Contains("var"))
+ {
+ needsLinqUsing = true;
+ }
+ else
+ {
+ result.RemainingErrors.Add(error);
+ }
+ }
+ else
+ {
+ result.RemainingErrors.Add(error);
+ }
+ }
+
+ var fixedCode = code;
+ var fixDescription = new StringBuilder();
+
+ if (needsSystemUsing && !code.Contains("using System;"))
+ {
+ fixedCode = fixedCode.Insert(0, "using System;\n");
+ fixDescription.Append("Added using System; ");
+ }
+
+ if (needsCollectionsUsing && !code.Contains("using System.Collections.Generic;"))
+ {
+ fixedCode = fixedCode.Insert(0, "using System.Collections.Generic;\n");
+ fixDescription.Append("Added using System.Collections.Generic;");
+ }
+
+ if (needsLinqUsing && !code.Contains("using System.Linq;"))
+ {
+ fixedCode = fixedCode.Insert(0, "using System.Linq;\n");
+ fixDescription.Append("Added using System.Linq;");
+ }
+
+ if (fixDescription.Length > 0)
+ {
+ result.CanFix = true;
+ result.FixedCode = fixedCode;
+ result.FixDescription = fixDescription.ToString().Trim();
+ }
+
+ return result;
+ }
+
+ ///
+ /// 第 2 轮:修复类型映射
+ ///
+ private FixResult FixRound2(string code, List errors)
+ {
+ var result = new FixResult
+ {
+ CanFix = false,
+ RemainingErrors = new List(),
+ FixDescription = string.Empty
+ };
+
+ var fixedCode = code;
+ var hasFixes = false;
+ var fixDescription = new StringBuilder();
+
+ foreach (var error in errors)
+ {
+ if (error.ErrorId == "CS0246")
+ {
+ if (error.Message.Contains("String"))
+ {
+ fixedCode = fixedCode.Replace("String", "string");
+ hasFixes = true;
+ fixDescription.Append("Mapped String to string; ");
+ }
+ else if (error.Message.Contains("ArrayList"))
+ {
+ fixedCode = fixedCode.Replace("ArrayList", "List