示例#1
0
文件: Builder.cs 项目: ETLang/Gluon
        public Event Resolve(EventInfo e)
        {
            if (e == null)
            {
                return(null);
            }

            Event ret;

            if (_eventMap.TryGetValue(e, out ret))
            {
                return(ret);
            }

            ret          = new Event();
            _eventMap[e] = ret;

            ret.Name        = e.Name;
            ret.Access      = AccessOf(e);
            ret.Nature      = NatureOf(e);
            ret.HandlerType = (Delegate)Resolve(e.EventHandlerType);
            ret.XmlDoc      = XmlDocReader.XMLFromMember(e);

            var m = e.EventHandlerType.GetMethod("Invoke");

            ret.Return      = Resolve(m.ReturnParameter);
            ret.Return.Name = "___ret";
            foreach (var arg in m.GetParameters())
            {
                ret.Parameters.Add(Resolve(arg));
            }

            return(ret);
        }
示例#2
0
文件: Builder.cs 项目: ETLang/Gluon
        public Constructor ResolveAsConstructor(MethodInfo method)
        {
            if (method == null)
            {
                return(null);
            }

            Constructor ret;

            if (_constructorMap.TryGetValue(method, out ret))
            {
                return(ret);
            }

            ret = new Constructor();
            _constructorMap[method] = ret;

            ret.Name   = method.DeclaringType.Name;
            ret.Access = AccessOf(method);
            ret.Nature = MemberNature.Instance;
            ret.XmlDoc = XmlDocReader.XMLFromMember(method);

            foreach (var arg in method.GetParameters())
            {
                ret.Parameters.Add(Resolve(arg));
            }

            foreach (var arg in ret.Parameters)
            {
                arg.XmlDoc = ret.XmlDoc?.ChildNodes.OfType <XmlElement>().FirstOrDefault(xml => xml.LocalName == "typeparam" && xml.Attributes["name"].InnerText == arg.Name);
            }

            return(ret);
        }
示例#3
0
文件: Builder.cs 项目: ETLang/Gluon
        public void Merge(Enum ast, System.Type type)
        {
            var names  = System.Enum.GetNames(type);
            var values = System.Enum.GetValues(type).Cast <int>().ToArray();

            for (int i = 0; i < names.Length; i++)
            {
                XmlElement xml = XmlDocReader.XMLFromMember(type.GetMember(names[i]).FirstOrDefault());
                ast.Entries.Add(new Enum.Entry(names[i], values[i], xml));
            }

            ast.UnderlyingType = Resolve(System.Enum.GetUnderlyingType(type));
        }
示例#4
0
文件: Builder.cs 项目: ETLang/Gluon
        public Field Resolve(FieldInfo field)
        {
            if (field == null)
            {
                return(null);
            }

            var ret = new Field();

            ret.Name    = field.Name;
            ret.Type    = Resolve(field.FieldType);
            ret.IsArray = U.Deref(field.FieldType).IsArray;
            ret.Access  = AccessOf(field);
            ret.XmlDoc  = XmlDocReader.XMLFromMember(field);

            return(ret);
        }
示例#5
0
文件: Builder.cs 项目: ETLang/Gluon
        public Method Resolve(MethodInfo method)
        {
            if (method == null)
            {
                return(null);
            }

            Method ret;

            if (_methodMap.TryGetValue(method, out ret))
            {
                return(ret);
            }

            ret = new Method();
            _methodMap[method] = ret;

            ret.Name          = method.Name;
            ret.IsConst       = (method.GetCustomAttribute <ConstAttribute>() != null);
            ret.Access        = AccessOf(method);
            ret.Nature        = NatureOf(method);
            ret.XmlDoc        = XmlDocReader.XMLFromMember(method);
            ret.Return        = Resolve(method.ReturnParameter);
            ret.Return.XmlDoc = ret.XmlDoc?["returns"];

            ret.Return.Context = VariableContext.Return;
            ret.Return.Name    = "___ret";

            foreach (var arg in method.GetParameters())
            {
                ret.Parameters.Add(Resolve(arg));
            }

            foreach (var arg in ret.Parameters)
            {
                arg.XmlDoc = ret.XmlDoc?.ChildNodes.OfType <XmlElement>().FirstOrDefault(xml => xml.LocalName == "typeparam" && xml.Attributes["name"].InnerText == arg.Name);
            }

            return(ret);
        }
示例#6
0
文件: Builder.cs 项目: ETLang/Gluon
        public Property Resolve(PropertyInfo prop)
        {
            if (prop == null)
            {
                return(null);
            }

            if (prop.CanWrite && !prop.CanRead)
            {
                Errors.WriteOnlyProperty(prop);
                return(null);
            }

            Property ret;

            if (_propertyMap.TryGetValue(prop, out ret))
            {
                return(ret);
            }

            ret = new Property();
            _propertyMap[prop] = ret;

            ret.IsFactory   = (prop.GetCustomAttribute <FactoryAttribute>() != null || prop.GetMethod.GetCustomAttribute <FactoryAttribute>() != null);
            ret.ConstGetter = !ret.IsFactory && (prop.GetMethod.GetCustomAttribute <UnconstAttribute>() == null);
            ret.IsBacked    = (prop.GetCustomAttribute <BackedAttribute>() != null);
            ret.Name        = prop.Name;
            ret.IsArray     = U.Deref(prop.PropertyType).IsArray;
            ret.XmlDoc      = XmlDocReader.XMLFromMember(prop);
            ret.Type        = Resolve(prop.PropertyType);
            ret.Access      = AccessOf(prop);
            ret.Nature      = NatureOf(prop);
            ret.IsReadOnly  = !prop.CanWrite;

            return(ret);
        }