/// <summary> /// 添加元素实例。 /// </summary> /// <param name="reader">源代码读取实例。</param> /// <param name="name">元素名称。</param> /// <param name="type">类型。</param> /// <param name="declarations">修饰字符串列表。</param> protected override void AddElement(SourceReader reader, string name, CodeType type, List <string> declarations) { switch (type) { case CodeType.Property: { var property = new PropertyElement(name, declarations, this); property.Init(reader); AddElement(property); } break; case CodeType.Field: { var field = new FieldElement(name, declarations, this); field.Init(reader); AddElement(field); } break; case CodeType.Method: { var method = new MethodElement(name, declarations, this); method.Init(reader); AddElement(method); } break; case CodeType.Index: { var index = new IndexElement(name, declarations, this); index.Init(reader); AddElement(index); } break; } }
/// <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(); } }
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.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(); //移除; } }
/// <summary> /// 读取特性。 /// </summary> /// <param name="reader">源代码读取器。</param> protected void ReadAttribute(SourceReader reader) { AddElement(new AttributeElement(reader.ReadQuoteBlock('[', ']'), this)); }
/// <summary> /// 读取当前代码块。 /// </summary> /// <param name="reader">字符串读取实例。</param> public abstract void Init(SourceReader reader);
/// <summary> /// 代码解析。 /// </summary> /// <param name="reader">源码读取器。</param> protected abstract void Initialized(SourceReader reader);
/// <summary> /// 读取成员声明。 /// </summary> /// <param name="reader">源代码读取器。</param> /// <returns>返回当前声明字符串。</returns> public static string ReadMemberDeclaration(this SourceReader reader) => reader.ReadDeclaration('{', '=', '(');
/// <summary> /// 读取参数声明。 /// </summary> /// <param name="reader">源代码读取器。</param> /// <param name="end">结束字符。</param> /// <returns>返回当前声明字符串。</returns> public static string ReadParameterDeclaration(this SourceReader reader, char end) => reader.ReadDeclaration('=', ',', end);
/// <summary> /// 读取类型名称。 /// </summary> /// <param name="reader">当前读取器。</param> /// <returns>返回类型名称。</returns> public static string ReadTypeName(this SourceReader reader) => reader.ReadDeclaration('{', ':');