/// <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> /// <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> /// 读取注释。 /// </summary> /// <param name="reader">源代码读取器。</param> protected void ReadComment(SourceReader reader) { if (reader.IsNext("/*")) { AddElement(new CommentElement(reader.ReadUntil("*/"), this)); } else if (reader.IsNext("//")) { AddElement(new CommentElement(reader.ReadLine()?.Trim(), this)); } else { throw new Exception("非法字符串!"); } }
/// <summary> /// 代码解析。 /// </summary> /// <param name="reader">源码读取器。</param> protected override void Initialized(SourceReader reader) { var name = reader.ReadUntil('=', ','); if (reader.Current == '=') { reader.Offset();//移除'=' var value = reader.ReadQuoteUntil(',', '}').Trim(); if (reader.Current == '}') { AddElement(new EnumFieldElement(name, value, this)); return; } } reader.Offset();//移除',' AddElement(new EnumFieldElement(name, null, this)); }
/// <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); }
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(); } }