using System.Text; using System.Text.RegularExpressions; using CodePlay.Core.Interfaces; using CodePlay.Core.Models; namespace CodePlay.Core.Pipeline.Converters; /// /// 继承转换器 - class Derived : Base → class Derived extends Base /// public class InheritanceConverter : ILineConverter { public int Priority => 40; public string Convert(string line, ConversionContext context) { // 只处理类声明行 if (!line.Contains("class ") || !line.Contains(":")) return line; var match = Regex.Match(line, @"((?:public|private|protected|internal|abstract|sealed|static)\s+)?\s*(class\s+(\w+)(?:\s*<[^>]*>)?)\s*:\s*([^{]+)"); if (!match.Success) return line; var modifiers = match.Groups[1].Value.Trim(); var classDecl = match.Groups[2].Value.Trim(); var className = match.Groups[3].Value; var parents = match.Groups[4].Value.Trim(); // 移除可能的大括号 var braceIdx = parents.IndexOf('{'); if (braceIdx >= 0) parents = parents.Substring(0, braceIdx).TrimEnd(); var parts = parents.Split(',') .Select(p => p.Trim()) .Where(p => !string.IsNullOrEmpty(p)) .ToList(); // 第一个没有 I 前缀的是基类 var baseClass = parts.FirstOrDefault(p => !p.StartsWith("I")) ?? ""; var interfaces = parts.Where(p => p.StartsWith("I")).ToList(); // 如果所有部分都有 I 前缀,则全部作为接口(Java 中所有类隐式继承 Object) if (string.IsNullOrEmpty(baseClass) && parts.Count > 0) { baseClass = ""; // 没有基类 interfaces = parts.ToList(); // 全部作为接口 } // 如果有基类且还有其他部分,其余部分作为接口 else if (!string.IsNullOrEmpty(baseClass) && parts.Count > 1) { var nonBaseInterfaces = parts.Where(p => p != baseClass).ToList(); foreach (var iface in nonBaseInterfaces) { if (!interfaces.Contains(iface)) interfaces.Add(iface); } } var sb = new StringBuilder(); sb.Append($"{modifiers} {classDecl}"); if (!string.IsNullOrEmpty(baseClass)) { sb.Append($" extends {baseClass}"); } if (interfaces.Count > 0) { sb.Append($" implements {string.Join(", ", interfaces)}"); } return sb.ToString(); } }