/// <summary> /// 读取当前代码块。 /// </summary> /// <param name="reader">字符串读取实例。</param> public override void Init(SourceReader reader) { BaseTypes = reader.ReadBaseTypes(); Rules = reader.ReadRules(); reader.Offset();//移除{ reader.EscapeWhiteSpace(); while (reader.CanRead) { switch (reader.Current) { case '/': ReadComment(reader); break; case '[': ReadAttribute(reader); break; case '}': reader.Offset(); return; //结束 default: Initialized(reader); break; } reader.EscapeWhiteSpace(); } }
/// <summary> /// 读取成员声明。 /// </summary> /// <param name="reader">源代码读取器。</param> /// <param name="ends">结束符列表。</param> /// <returns>返回当前声明字符串。</returns> public static string ReadDeclaration(this SourceReader reader, params char[] ends) { ends = ends.Concat(new[] { '<', ' ', '[' }).Distinct().ToArray(); var builder = new StringBuilder(); reader.EscapeWhiteSpace(); builder.Append(reader.ReadUntil(ends)); switch (reader.Current) { case ' ': reader.EscapeWhiteSpace(); if (reader.IsNext('<')) //泛型类型List <string> { builder.Append(reader.ReadQuoteBlock('<', '>')); } else if (reader.IsNext('[')) //数组 { builder.Append(reader.ReadChars(']', new[] { '[', ',', ' ' })); } break; case '<': //泛型类型List<string> builder.Append(reader.ReadQuoteBlock('<', '>')); break; case '[': //数组 builder.Append(reader.ReadChars(']', new[] { '[', ',', ' ' })); break; } reader.EscapeWhiteSpace(); return(builder.ToString().Trim()); }
/// <summary> /// 初始化类<see cref="FileElement"/>。 /// </summary> /// <param name="source">文件代码。</param> public FileElement(string source) { using var reader = new SourceReader(source); reader.EscapeWhiteSpace(); while (reader.CanRead) { switch (reader.Current) { case 'u': //using { var keyword = reader.ReadUntil(); if (keyword == "using") { AddElement(new UsingElement(reader.ReadUntil(';').Trim(), this)); reader.Offset(); break; } throw new Exception($"不支持:{keyword}关键词!"); } case 'n': //namespace { var keyword = reader.ReadUntil(); if (keyword == "namespace") { var @namespace = new NamespaceElement(reader.ReadUntil('{').Trim(), this); @namespace.Init(reader); AddElement(@namespace); break; } throw new Exception($"不支持:{keyword}关键词!"); } case '/': { if (reader.IsNext("/*")) { AddElement(new CommentElement(reader.ReadUntil("*/"), this)); } else if (reader.IsNext("//")) { AddElement(new CommentElement(reader.ReadLine()?.Trim() + "\r\n", this)); } else { throw new Exception("非法字符串!"); } } break; case '[': AddElement(new AttributeElement(reader.ReadQuoteBlock('[', ']'), this)); break; } reader.EscapeWhiteSpace(); } }
/// <summary> /// 读取当前代码块。 /// </summary> /// <param name="reader">字符串读取实例。</param> public override void Init(SourceReader reader) { reader.EscapeWhiteSpace(); var declarations = new List <string>(); string value = null; while (reader.CanRead) { switch (reader.Current) { case ')': reader.Offset(); //{}或者=>; Rules = reader.ReadRules(); if (reader.Current == ';') //接口方法,没有主体 { reader.Offset(); //移除; return; } // 代码块 if (reader.IsNext("=>")) { reader.Offset(2); Lambda = reader.ReadQuoteUntil(';').Trim(); reader.Offset(); //移除; return; } else if (reader.Current == ':') { //构造函数 reader.Offset(); reader.EscapeWhiteSpace(); BaseConstructor = reader.ReadQuoteUntil('{').Trim(); } break; case '{': //结束 Code = reader.ReadQuoteBlock('{', '}'); return; case ',': reader.Offset(); Parameters.Add(new ParameterElement(declarations, value, this)); declarations = new List <string>(); value = null; break; case '=': reader.Offset(); value = reader.ReadQuoteUntil(')', ','); break; default: declarations.Add(reader.ReadParameterDeclaration(')')); break; } reader.EscapeWhiteSpace(); } }
/// <summary> /// 读取基类列表。 /// </summary> /// <param name="reader">当前读取器。</param> /// <returns>返回基类列表。</returns> public static List <string> ReadBaseTypes(this SourceReader reader) { reader.EscapeWhiteSpace(); var baseTypes = new List <string>(); if (reader.Current == ':') { reader.Offset(); reader.EscapeWhiteSpace(); var baseType = reader.ReadDeclaration('{', ','); while (reader.Current == ',') { baseTypes.Add(baseType); reader.Offset();//移除, baseType = reader.ReadDeclaration('{', ','); } baseTypes.Add(baseType); } return(baseTypes); }
private List <string> ReadDeclarations(SourceReader reader, out CodeType?type) { reader.EscapeWhiteSpace(); var declarations = new List <string>(); while (reader.CanRead) { var keyword = reader.ReadUntil(); switch (keyword) { case "class": type = CodeType.Class; return(declarations); case "enum": type = CodeType.Enum; return(declarations); case "interface": type = CodeType.Interface; return(declarations); case "struct": type = CodeType.Struct; return(declarations); default: declarations.Add(keyword); break; } reader.EscapeWhiteSpace(); } type = null; return(declarations); }
/// <summary> /// 读取当前代码块。 /// </summary> /// <param name="reader">字符串读取实例。</param> public override void Init(SourceReader reader) { reader.EscapeWhiteSpace(); var declarations = new List <string>(); string value = null; while (reader.CanRead) { switch (reader.Current) { case ']': reader.Offset(); //{}或者=>; Rule = reader.ReadUntil('{', '=').Trim(); reader.Offset(); //移除{或者= base.Init(reader); return; //结束 case ',': reader.Offset(); Parameters.Add(new ParameterElement(declarations, value, this)); declarations = new List <string>(); value = null; break; case '=': reader.Offset(); value = reader.ReadQuoteUntil(']', ','); break; default: declarations.Add(reader.ReadParameterDeclaration(']')); break; } reader.EscapeWhiteSpace(); } }
/// <summary> /// 读取泛型约束。 /// </summary> /// <param name="reader">当前读取器。</param> /// <returns>返回泛型约束列表。</returns> public static List <string> ReadRules(this SourceReader reader) { reader.EscapeWhiteSpace(); var rules = new List <string>(); while (reader.IsNext("where ")) { var rule = reader.ReadUntil(':') + ":"; reader.Offset(); rule += reader.ReadQuoteUntil("where ", '{', '=').Trim(); while (reader.Current == '=' && !reader.IsNext("=>"))//lambda表达式 { rule += reader.ReadQuoteUntil("where ", '{', '=').Trim(); } rules.Add(rule); } return(rules); }
/// <summary> /// 读取当前代码块。 /// </summary> /// <param name="reader">字符串读取实例。</param> public override void Init(SourceReader reader) { reader.Offset(); //跳过{ reader.EscapeWhiteSpace(); //过滤空格 while (reader.CanRead) { switch (reader.Current) { case '[': ReadAttribute(reader); break; case '/': ReadComment(reader); break; case '}': //结束 reader.Offset(); return; default: { var declarations = ReadDeclarations(reader, out var type); var typeName = reader.ReadTypeName(); switch (type) { case CodeType.Class: { var element = new ClassElement(typeName, declarations, this); element.Init(reader); AddElement(element); } break; case CodeType.Interface: { var element = new InterfaceElement(typeName, declarations, this); element.Init(reader); AddElement(element); } break; case CodeType.Struct: { var element = new StructElement(typeName, declarations, this); element.Init(reader); AddElement(element); } break; case CodeType.Enum: { var element = new EnumElement(typeName, declarations, this); element.Init(reader); AddElement(element); } break; } } break; } reader.EscapeWhiteSpace(); } }
/// <summary> /// 读取当前代码块。 /// </summary> /// <param name="reader">字符串读取实例。</param> public override void Init(SourceReader reader) { reader.EscapeWhiteSpace(); Value = reader.ReadQuoteUntil(';'); reader.Offset(); }
/// <summary> /// 读取当前代码块。 /// </summary> /// <param name="reader">字符串读取实例。</param> public override void Init(SourceReader reader) { //Lambda表达式 reader.EscapeWhiteSpace(); if (reader.IsNext('>')) { reader.Offset(); //移除> Lambda = reader.ReadQuoteUntil(';').Trim(); reader.Offset(); //移除; return; } // 获取 if (reader.IsNext("get")) { reader.Offset(3); reader.EscapeWhiteSpace(); if (reader.IsNext(';')) { GetField = "get;"; reader.Offset(1); } else if (reader.IsNext("=>")) { GetField = $"get{reader.ReadQuoteUntil(';').Trim()};"; reader.Offset(1); } else if (reader.IsNext('{')) { GetField = $"get{reader.ReadQuoteBlock('{', '}').Trim()};"; } } // 设置 reader.EscapeWhiteSpace(); if (reader.IsNext("set")) { reader.Offset(3); reader.EscapeWhiteSpace(); if (reader.IsNext(';')) { SetField = "set;"; reader.Offset(1); } else if (reader.IsNext("=>")) { SetField = $"set{reader.ReadQuoteUntil(';').Trim()};"; reader.Offset(1); } else if (reader.IsNext('{')) { SetField = $"set{reader.ReadQuoteBlock('{', '}').Trim()};"; } } //移除} reader.EscapeWhiteSpace(); reader.Offset(); //默认值 reader.EscapeWhiteSpace(); if (reader.IsNext('=')) { reader.Offset(); //移除= Value = reader.ReadQuoteUntil(';').Trim(); reader.Offset(); //移除; } }