Exemple #1
0
        static XElement BuildMembers(MemberTypeSection section, TypeDom type)
        {
            switch (section)
            {
            case MemberTypeSection.NestedTypes:
                return(BuildNestedTypes(type.NestedTypes));

            case MemberTypeSection.Constructors:
                return(BuildMembers(Strings.Constructors, type.Constructors));

            case MemberTypeSection.Properties:
                return(BuildMembers(Strings.Properties, type.Properties));

            case MemberTypeSection.Methods:
                return(BuildMembers(Strings.Methods, type.Methods));

            case MemberTypeSection.ExtentionMethods:
                return(BuildMembers(Strings.ExtentionMethods, type.ExtentionMethods, true));

            case MemberTypeSection.Operators:
                return(BuildMembers(Strings.Operators, type.Operators));

            case MemberTypeSection.Fields:
                return(BuildMembers(Strings.Fields, type.Fields));

            case MemberTypeSection.Events:
                return(BuildMembers(Strings.Events, type.Events));

            default: throw new Exception();
            }
        }
Exemple #2
0
        static XElement InheritanceSection(TypeDom type)
        {
            if (type.Type.IsValueType || type.Type.IsEnum || type.Type.IsInterface || type.Type.IsSubclassOf(typeof(Delegate)))
            {
                return(x("div"));
            }

            var space        = string.Empty;
            var content      = new XElement("div");
            var baseTypes    = type.BaseTypes;
            var derivedTypes = type.DerivedTypes;

            if (baseTypes.Length == 0 && derivedTypes.Length == 0)
            {
                return(null);
            }

            foreach (var baseType in baseTypes)
            {
                content.Add(space, BuildTypeUrl(baseType), x("br"));
                space += Nbsp + Nbsp;
            }

            content.Add(x("b", space + type.GetDisplayName(true)), x("br"));
            space += Nbsp + Nbsp;

            foreach (var derivedType in derivedTypes)
            {
                content.Add(space, BuildTypeUrl(derivedType), x("br"));
            }

            return(Section(Names[Strings.InheritanceHierarchy], content, a("class", "doc_inheritance")));
        }
		public static void Merge(TypeDom[] allTypes)
		{
			//словарь типов, в значении список первый элемент которого TypeDom того же типа, следующие элементы - базовые классы
			//по мере обработки словаря эти базовые классы если присутствуют в списке, то должны отсутствовать в словаре.
			//Т.е. во всех списках словаря, конкретный TypeDom присутствует в одном экземпляре.
			Dictionary<Type,List<TypeDom>> dict = allTypes.ToDictionary(_ => _.Type, t => new List<TypeDom> {t});

			foreach (var typeDom in allTypes)
			{
				List<TypeDom> curEntry; // = dict[typeDom.Type];
				if(!dict.TryGetValue(typeDom.Type, out curEntry))
					continue;

				foreach (Type baseType in TypeUtils.GetBaseTypes(typeDom.Type))
				{
					//Извлечение и удаление из словаря, и добавление извлеченного списка к curEntry
					List<TypeDom> baseEntry;
					if (dict.TryGetValue(baseType, out baseEntry))
					{
						dict.Remove(baseType);
						curEntry.AddRange(baseEntry);
					}
				}
			}
			foreach (List<TypeDom> lst in dict.Values)
			{
				if (1 < lst.Count)
					MergeBaseToDerived(lst.AsEnumerable().Reverse());
			}
		}
		public static void Populate(TypeDom[] allTypes)
		{
			ILookup<Type, MethodDom> extentionsLookup = GetExtentionMethods(allTypes)
				.ToLookup(_ => _.FirtParameterType);
			foreach (var typeDom in allTypes)
				typeDom.ExtentionMethods = 
					GetExtentionMethods(typeDom.Type, extentionsLookup)
					.OrderBy(_ => _.FirtParameterType.FullName ?? _.FirtParameterType.Name) //Для generic параметра FullName может быть null
					.ToArray();
		}
Exemple #5
0
        private static void AddMembers(OfflineDynamicPage parentNode, TypeDom type, MemberDom[] members, MemberTypeSection section)
        {
            if (members == null || members.Length == 0)
            {
                return;
            }

            var sectionItem = new OfflineDynamicPage
            {
                Parent         = parentNode,
                UrlPart        = parentNode.UrlPart + "/" + section.ToString(),
                RussianTitle   = GenerateHtml.GetSectionName(section),
                RussianContent = GenerateHtml.Generate(new TypePartialData {
                    SectionType = section, Type = type
                }),
            };

            if (section == MemberTypeSection.Methods || section == MemberTypeSection.ExtentionMethods)
            {
                GenerateMethods((MethodDom[])members, sectionItem, parentNode.UrlPart);
            }
            else
            {
                foreach (var member in members)
                {
                    //ToDo: Группировка переопределенных методов.
                    var memberItem = new OfflineDynamicPage
                    {
                        Parent         = sectionItem,
                        UrlPart        = parentNode.UrlPart + "/" + member.SimpleName,
                        RussianTitle   = member.ShortSignature,
                        RussianContent = GenerateHtml.Generate(member),
                    };
                    sectionItem.Childs.Add(memberItem);
                }
            }

            parentNode.Childs.Add(sectionItem);
        }
        static string Generate(TypeDom type)
        {
            var doc = GetDoc(out var body);

            body.Add(
                x("h1", type.GetDisplayName(false) + Names[Strings.SuffixDelimeter] + Names[type.TypeKind.ToString()]),
                x("p", XMLUtils.GetTagInnerXml(type.DocInfo, "summary", Navigation, true)),
                InheritanceSection(type),
                NamespaceAssembly(type.Type),
                GenerateSyntax(type),
                BuldParameters(Names[Strings.TypeParameters], type.GenericTypeParameters)
                );

            for (int i = 0; i <= (int)MemberTypeSection.Events; i++)
            {
                body.Add(BuildMembers((MemberTypeSection)i, type));
            }

            body.Add(BuildEnding(type.Assembly, type.DocInfo));

            return(doc.ToString());
        }
Exemple #7
0
 public TypePartialData(TypeDom type, MemberTypeSection sectionType)
 {
     Type        = type;
     SectionType = sectionType;
 }
Exemple #8
0
        private static XElement GenerateSyntax(TypeDom type)
        {
            var parts = new List <XElement>();

            foreach (var attr in type.Type.GetAttributes(false).Where(a1 => a1.GetType() != typeof(ExtensionAttribute)))
            {
                parts.Add(BuildTypeUrl(attr.GetType(), false, true));
                parts.Add(x("br"));
            }

            parts.Add(x("span", type.Type.IsPublic ? "public" : "protected", a("style", "color:Blue;")));

            if (type.Type.IsStatic())
            {
                parts.Add(x("span", "static", a("style", "color:Blue;")));
            }

            parts.Add(x("span", type.TypeKind.ToString().ToLowerInvariant(), a("style", "color:Blue;")));
            parts.Add(x("span", type.Name));

            var interfaces = type.Type.GetInterfaces();

            if (type.TypeKind == TypeDom.TypeKindEnum.Class)
            {
                if (type.Type.BaseType != typeof(object) || interfaces.Length > 0)
                {
                    parts.Add(x("span", " : "));

                    if (type.Type.BaseType != typeof(object))
                    {
                        parts.Add(BuildTypeUrl(type.Type.BaseType, false));

                        if (interfaces.Length > 0)
                        {
                            parts.Add(x("span", ","));
                        }
                    }

                    foreach (var itf in interfaces)
                    {
                        parts.Add(BuildTypeUrl(itf, false));
                        parts.Add(x("span", ","));
                    }

                    if (interfaces.Length > 0)
                    {
                        parts.RemoveAt(parts.Count - 1);
                    }
                }
            }
            else if (type.TypeKind == TypeDom.TypeKindEnum.Enum)
            {
                if (type.Type.GetEnumBaseType() != typeof(int))
                {
                    parts.Add(x("span", " : "));
                    parts.Add(BuildTypeUrl(type.Type.BaseType, false));
                }
            }
            else if (type.TypeKind == TypeDom.TypeKindEnum.Interface || type.TypeKind == TypeDom.TypeKindEnum.Struct)
            {
                if (interfaces.Length > 0)
                {
                    parts.Add(x("span", " : "));

                    foreach (var itf in interfaces)
                    {
                        parts.Add(BuildTypeUrl(itf, false));
                        parts.Add(x("span", ","));
                    }

                    if (interfaces.Length > 0)
                    {
                        parts.RemoveAt(parts.Count - 1);
                    }
                }
            }

            return(x("div", a("class", "doc_syntax"), x("code", parts)));
        }