/// <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> 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(); //移除; } }
/// <summary> /// 读取特性。 /// </summary> /// <param name="reader">源代码读取器。</param> protected void ReadAttribute(SourceReader reader) { AddElement(new AttributeElement(reader.ReadQuoteBlock('[', ']'), this)); }