Example #1
0
        /// <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();
            }
        }
Example #2
0
        /// <summary>
        /// 获取成员类型。
        /// </summary>
        /// <param name="reader">源代码读取实例。</param>
        /// <returns>返回元素类型。</returns>
        public static CodeType?GetMemberType(this SourceReader reader)
        {
            if (reader.IsNext('{')) //“{”或者“ {”为属性
            {
                reader.Offset();    //移除{
                return(CodeType.Property);
            }

            if (reader.IsNext('[')) //“[”或者“ [”为属性
            {
                reader.Offset();    //移除[
                return(CodeType.Index);
            }

            if (reader.IsNext('=')) //“=”或者“ =”为字段,“=>”为只读属性
            {
                reader.Offset();    //移除=
                if (reader.IsNext('>'))
                {
                    return(CodeType.Property);
                }
                return(CodeType.Field);
            }

            if (reader.IsNext('(')) //“(”或者“ (”为方法
            {
                reader.Offset();    //移除(
                return(CodeType.Method);
            }
            //其他修饰符号
            return(null);
        }
Example #3
0
        /// <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));
        }
Example #4
0
        /// <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();
            }
        }
Example #5
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();           //{}或者=>;
                    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();
            }
        }
Example #6
0
        /// <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);
        }
Example #7
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();
            }
        }
Example #8
0
        /// <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);
        }
Example #9
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();
            }
        }
Example #10
0
 /// <summary>
 /// 读取当前代码块。
 /// </summary>
 /// <param name="reader">字符串读取实例。</param>
 public override void Init(SourceReader reader)
 {
     reader.EscapeWhiteSpace();
     Value = reader.ReadQuoteUntil(';');
     reader.Offset();
 }
Example #11
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(); //移除;
            }
        }