using CodePlay.Core.Models; using CodePlay.Core.Common; namespace CodePlay.Core.Services; public class TodoGenerator { private static readonly List CSharpPatterns = new() { new PatternInfo("linq", @"\.(Where|Select|OrderBy|FirstOrDefault|Any|All|Count|ToList)\s*\(", "LINQ 查询", "Java 没有 LINQ", "Stream API"), new PatternInfo("async_await", @"async\s+[\w<>]+\s+\w+\s*\([^)]*\)", "async/await 异步方法", "Java 使用 CompletableFuture", "CompletableFuture"), new PatternInfo("attributes", @"\[(?:Obsolete|Serializable|DataContract|DllImport)\b", "C# 特性", "Java 使用注解", "@Annotation"), new PatternInfo("delegate", @"\b(?:Action|Func|EventHandler)\b", "委托类型", "Java 使用函数式接口", "Function/Consumer"), new PatternInfo("event", @"\bevent\s+", "C# 事件", "Java 使用观察者模式", "PropertyChangeListener"), new PatternInfo("dynamic", @"\bdynamic\b", "dynamic 类型", "Java 使用 Object", "Object/反射"), new PatternInfo("pattern_match", @"\bis\s+(?:not\s+)?null", "模式匹配", "Java 16+ 支持", "instanceof"), new PatternInfo("nullable", @"\?\s+", "可空引用", "Java 使用 Optional", "Optional"), new PatternInfo("using_stmt", @"using\s*\([^)]+\)\s*\{", "using 语句", "Java try-with-resources", "try-with-resources"), new PatternInfo("yield", @"\byield\s+return", "yield return", "Java 使用 Iterator", "Iterator"), new PatternInfo("record", @"\brecord\s+\w+", "C# record", "Java 16+ record", "Java record"), new PatternInfo("init_only", @"\binit\s*;", "init-only", "Java 使用 final", "final 字段"), new PatternInfo("var", @"\bvar\s+\w+\s*=", "var 推断", "Java 10+ var", "var (Java 10+)") }; private static readonly List JavaPatterns = new() { new PatternInfo("stream", @"\.(stream|filter|map|collect|reduce)\s*\(", "Stream API", "C# 使用 LINQ", "LINQ"), new PatternInfo("lambda", @"->\s*\{", "Lambda 表达式", "C# 使用 =>", "=> lambda"), new PatternInfo("optional", @"Optional<", "Optional 类型", "C# 使用可空", "Nullable"), new PatternInfo("annotation", @"@(?:Override|Deprecated|FunctionalInterface)\b", "Java 注解", "C# 使用特性", "[Attribute]"), new PatternInfo("wildcard", @"\?\s+(?:extends|super)", "泛型通配符", "C# in/out", "in/out"), new PatternInfo("diamond", @"<>\s*;", "菱形操作符", "C# var 推断", "var"), new PatternInfo("method_ref", @"::\s*\w+", "方法引用", "C# 组方法", "组方法") }; public List GenerateTodos(string sourceCode, LanguageType sourceLanguage, LanguageType targetLanguage) { var todos = new List(); var patterns = sourceLanguage == LanguageType.CSharp ? CSharpPatterns : JavaPatterns; foreach (var pattern in patterns) { var matches = System.Text.RegularExpressions.Regex.Matches(sourceCode, pattern.Pattern); foreach (System.Text.RegularExpressions.Match match in matches) { todos.Add(new TodoItem { Description = pattern.Name, LineNumber = GetLineNumber(sourceCode, match.Index), OriginalSyntax = match.Value.Trim(), WhyNotDirect = pattern.Reason, RecommendedAlternative = pattern.Alternative }); } } return todos.GroupBy(t => new { t.Description, t.LineNumber }) .Select(g => g.First()) .OrderBy(t => t.LineNumber) .ToList(); } public string GenerateTodoComment(TodoItem todo) { return $"// TODO: {todo.Description} - {todo.WhyNotDirect}"; } public ConversionSuggestion Analyze(string sourceCode, LanguageType sourceLanguage, LanguageType targetLanguage) { var todos = GenerateTodos(sourceCode, sourceLanguage, targetLanguage); return new ConversionSuggestion { TotalIssues = todos.Count, ConfidenceScore = Math.Max(0, 100 - todos.Count * 5), TodoItems = todos }; } private int GetLineNumber(string sourceCode, int index) { return sourceCode.Substring(0, index).Count(c => c == '\n') + 1; } } public class PatternInfo { public string Key { get; set; } = ""; public string Pattern { get; set; } = ""; public string Name { get; set; } = ""; public string Reason { get; set; } = ""; public string Alternative { get; set; } = ""; public PatternInfo(string key, string pattern, string name, string reason, string alternative) { Key = key; Pattern = pattern; Name = name; Reason = reason; Alternative = alternative; } } public class ConversionSuggestion { public int TotalIssues { get; set; } public int ConfidenceScore { get; set; } public List TodoItems { get; set; } = new(); }