Пример #1
0
        /// <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;
            }
        }
Пример #2
0
        /// <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();
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        /// <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();
            }
        }
Пример #5
0
 /// <summary>
 /// 读取当前代码块。
 /// </summary>
 /// <param name="reader">字符串读取实例。</param>
 public override void Init(SourceReader reader)
 {
     reader.EscapeWhiteSpace();
     Value = reader.ReadQuoteUntil(';');
     reader.Offset();
 }
Пример #6
0
        /// <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(); //移除;
            }
        }
Пример #7
0
 /// <summary>
 /// 读取特性。
 /// </summary>
 /// <param name="reader">源代码读取器。</param>
 protected void ReadAttribute(SourceReader reader)
 {
     AddElement(new AttributeElement(reader.ReadQuoteBlock('[', ']'), this));
 }
Пример #8
0
 /// <summary>
 /// 读取当前代码块。
 /// </summary>
 /// <param name="reader">字符串读取实例。</param>
 public abstract void Init(SourceReader reader);
Пример #9
0
 /// <summary>
 /// 代码解析。
 /// </summary>
 /// <param name="reader">源码读取器。</param>
 protected abstract void Initialized(SourceReader reader);
Пример #10
0
 /// <summary>
 /// 读取成员声明。
 /// </summary>
 /// <param name="reader">源代码读取器。</param>
 /// <returns>返回当前声明字符串。</returns>
 public static string ReadMemberDeclaration(this SourceReader reader) =>
 reader.ReadDeclaration('{', '=', '(');
Пример #11
0
 /// <summary>
 /// 读取参数声明。
 /// </summary>
 /// <param name="reader">源代码读取器。</param>
 /// <param name="end">结束字符。</param>
 /// <returns>返回当前声明字符串。</returns>
 public static string ReadParameterDeclaration(this SourceReader reader, char end) =>
 reader.ReadDeclaration('=', ',', end);
Пример #12
0
 /// <summary>
 /// 读取类型名称。
 /// </summary>
 /// <param name="reader">当前读取器。</param>
 /// <returns>返回类型名称。</returns>
 public static string ReadTypeName(this SourceReader reader) => reader.ReadDeclaration('{', ':');