Beispiel #1
0
        public static TypeDoc Parse(XElement element)
        {
            var ret = new TypeDoc
            {
                FullName = element.Attribute("name").Value.Substring(2),
                DocInfo  = element
            };

            return(ret);
        }
Beispiel #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="asm"></param>
        /// <param name="findOptions"> Опции указывающие какие типы и члены собирать</param>
        /// <param name="unboundTypes">Массив типов из XML документации, которые не смогли привязаться к данным из Reflection</param>
        /// <param name="unboundMembers">Массив members из XML документации, которые не смогли привязаться к данным из Reflection</param>
        public void MergeWithReflection(Assembly asm, FindOptions findOptions, out TypeDoc[] unboundTypes, out MemberDoc[] unboundMembers)
        {
            var docTypes = Types.ToDictionary(_ => _.FullName);

            foreach (var type in asm.GetTypes())
            {
                if (!type.IsVisible && !findOptions.InternalClasses)
                {
                    continue;
                }

                string  name = type.FullName.Replace('+', '.');                //Для nested классов type.FullName дает Class1+Class2, а по XML Class1.Class2  - невозможно отличить nested класс от namespace
                TypeDoc docT;
                if (docTypes.TryGetValue(name, out docT))
                {
                    if (docT.ReflectionType != null)
                    {
                        throw new Exception("multiple types on single node");
                    }
                    docT.ReflectionType = type;
                }
                else if (findOptions.UndocumentedClasses)
                {
                    docT = new TypeDoc {
                        FullName = name, ReflectionType = type
                    };

                    if (!docT.FullName.Contains("XamlGeneratedNamespace"))
                    {
                        docTypes.Add(docT.FullName, docT);
                    }
                }
            }

            if (findOptions.UndocumentedClasses)
            {
                Types = docTypes.Select(_ => _.Value).ToArray();
            }

            unboundTypes = Types.Where(_ => _.ReflectionType == null).ToArray();
            if (unboundTypes.Length > 0)
            {
                Types = Types.Where(_ => _.ReflectionType != null).ToArray();
            }

            var unbound = new List <MemberDoc>();

            foreach (var type in Types)
            {
                unbound.AddRange(type.MergeMembersWithReflection(!findOptions.UndocumentedMembers, findOptions.PrivateMembers));
            }
            unboundMembers = unbound.ToArray();
        }
Beispiel #3
0
        //Если попадаются members у которых включающий их класс не был объявлен в XML документации, то создается класс, но у него не будет заполнено RawNode
        static TypeDoc[] ParseMembers(XElement members)
        {
            Dictionary <string, TypeDoc> types = members
                                                 .XPathSelectElements("member[starts-with(@name,\"T:\")]")
                                                 .Select(TypeDoc.Parse)
                                                 .Where(t => !t.FullName.Contains("XamlGeneratedNamespace"))
                                                 .ToDictionary(_ => _.FullName);

            foreach (var node in members.XPathSelectElements("member[not(starts-with(@name,\"T:\"))]"))
            {
                var member = MemberDoc.ParseMember(node);
                if (member != null)
                {
                    TypeDoc type;
                    if (types.TryGetValue(member.Name.FullClassName, out type))
                    {
                        type.Members.Add(member);
                    }
                    else
                    {
                        type = new TypeDoc {
                            FullName = member.Name.FullClassName
                        };
                        type.Members.Add(member);

                        if (!type.FullName.Contains("XamlGeneratedNamespace"))
                        {
                            types.Add(type.FullName, type);
                        }
                    }
                }
                else
                {
                    //ToDo: сделать обработку типов(редкие,неиспользуемые) 'N'-namespace, '!' - error
                }
            }

            return(types
                   .Select(_ => _.Value)
                   .ToArray());
        }