Ejemplo n.º 1
0
        protected void FillInheritance(NameGeneratorContext context, ArticleItemYaml yaml, XElement node)
        {
            if (yaml.Type == MemberType.Interface)
            {
                return;
            }

            var nodeIdHash       = new Dictionary <string, string>();
            var idHash           = new Dictionary <string, List <string> >();
            var inheritanceGraph = node.NullableElement("inheritancegraph");

            foreach (var n in inheritanceGraph.Elements("node"))
            {
                string nodeId = n.NullableAttribute("id").NullableValue();
                string id     = n.NullableElement("link").NullableAttribute("refid").NullableValue() ?? _nameGenerator.GenerateLabel(context, n);
                nodeIdHash.Add(nodeId, id);
                var childNode = n.NullableElement("childnode");
                if (!childNode.IsNull())
                {
                    if (!idHash.ContainsKey(nodeId))
                    {
                        idHash[nodeId] = new List <string>();
                    }
                    idHash[nodeId].Add(childNode.NullableAttribute("refid").NullableValue());
                }
            }

            //yaml.Inheritance = idHash.ToDictionary(pair => nodeIdHash[pair.Key], pair => pair.Value.Select(n => nodeIdHash[n]).ToList());
            // var dict = idHash.ToDictionary(pair => nodeIdHash[pair.Key], pair => pair.Value.Select(n => nodeIdHash[n]).ToList());
            var dict = idHash.GroupBy(pair => Regex.Replace(nodeIdHash[pair.Key], "<.*?>", string.Empty)).ToDictionary(g => g.Key, g => g.SelectMany(p => p.Value).Select(n => nodeIdHash[n]).ToList());

            yaml.Inheritance = new List <string>();
            string start = yaml.Uid;

            while (dict.ContainsKey(start))
            {
                start = dict[start].Single();
                yaml.Inheritance.Add(start);
            }
            var defaultInheritance = GetDefaultInheritance(yaml);

            yaml.Inheritance.AddRange(defaultInheritance);
            yaml.Inheritance.Reverse();
        }
Ejemplo n.º 2
0
        public Task <PageModel> GenerateArticleAsync(BuildContext context, XDocument document)
        {
            PageModel page = new PageModel()
            {
                Items = new List <ArticleItemYaml>()
            };
            ArticleItemYaml mainYaml = new ArticleItemYaml();

            page.Items.Add(mainYaml);

            var             articleContext = new ArticleContext(context);
            HierarchyChange curChange      = articleContext.CurrentChange;
            HierarchyChange parentChange   = articleContext.ParentChange;
            var             nameContext    = new NameGeneratorContext {
                CurrentChange = curChange, ParentChange = parentChange
            };
            var main = document.Root.NullableElement("compounddef");

            mainYaml.Uid = curChange.Uid;
            mainYaml.Id  = _nameGenerator.GenerateId(nameContext, main);
            mainYaml.SupportedLanguages = new string[] { Language };
            mainYaml.FullName           = _nameGenerator.GenerateTypeFullName(nameContext, main, true);
            mainYaml.Name         = _nameGenerator.GenerateTypeName(nameContext, main, true);
            mainYaml.NameWithType = mainYaml.Name;
            mainYaml.FullNameWithoutTypeParameter = _nameGenerator.GenerateTypeFullName(nameContext, main, false);
            mainYaml.NameWithoutTypeParameter     = _nameGenerator.GenerateTypeName(nameContext, main, false);
            mainYaml.Href     = YamlUtility.ParseHrefFromChangeFile(curChange.File);
            mainYaml.Type     = YamlUtility.ParseType(curChange.Type.ToString());
            mainYaml.Parent   = curChange.Parent;
            mainYaml.Children = curChange.Children != null ? new List <string>(curChange.Children.OrderBy(c => c)) : new List <string>();
            FillSummary(mainYaml, main);
            FillRemarks(mainYaml, main);
            FillSource(mainYaml, main);
            FillSees(mainYaml, main);
            FillException(mainYaml, main);
            FillInheritance(nameContext, mainYaml, main);
            FillSyntax(mainYaml, main, isMain: true);
            FillImplementsOrInherits(mainYaml, main);
            FillLanguageSpecificMetadata(mainYaml, articleContext, main);

            var members = new Dictionary <string, ArticleItemYaml>();

            foreach (var section in main.Elements("sectiondef"))
            {
                string kind  = section.NullableAttribute("kind").NullableValue();
                var    tuple = KindMapToType(kind);
                if (tuple.Item1.HasValue && ((tuple.Item2 & AccessLevel.NotAccessible) == AccessLevel.None))
                {
                    foreach (var member in section.Elements("memberdef"))
                    {
                        var memberYaml = new ArticleItemYaml();
                        memberYaml.Uid = member.NullableAttribute("id").NullableValue();
                        memberYaml.Id  = _nameGenerator.GenerateId(nameContext, member);
                        memberYaml.SupportedLanguages = new string[] { Language };
                        memberYaml.FullName           = _nameGenerator.GenerateMemberFullName(nameContext, member);
                        memberYaml.Name         = _nameGenerator.GenerateMemberName(nameContext, member);
                        memberYaml.NameWithType = _nameGenerator.GenerateMemberNameWithType(memberYaml.Name, mainYaml.Name);
                        memberYaml.Href         = mainYaml.Href;
                        memberYaml.Type         = string.IsNullOrEmpty(member.NullableElement("type").NullableValue()) && tuple.Item1.Value == MemberType.Method ? MemberType.Constructor : tuple.Item1.Value;
                        memberYaml.Parent       = mainYaml.Uid;
                        FillSummary(memberYaml, member);
                        FillRemarks(memberYaml, member);
                        FillSource(memberYaml, member);
                        FillSees(memberYaml, member);
                        FillException(memberYaml, member);
                        FillOverridden(memberYaml, member);
                        FillSyntax(memberYaml, member, isMain: false);
                        FillLanguageSpecificMetadata(memberYaml, articleContext, member);
                        FillOverload(memberYaml, member);

                        if (members.ContainsKey(memberYaml.Uid))
                        {
                            ConsoleLogger.WriteLine(
                                new LogEntry
                            {
                                Phase   = "GenerateArticles",
                                Level   = LogLevel.Warning,
                                Message = $"Duplicate items {memberYaml.Uid} found in {curChange.File}.",
                            });
                            continue;
                        }
                        members[memberYaml.Uid] = memberYaml;
                        EmptyToNull(memberYaml);
                    }
                }
            }

            mainYaml.Children.AddRange(from p in members
                                       orderby p.Value.Name.ToLower()
                                       select p.Key);
            page.Items.AddRange(from i in members.Values
                                orderby i.Name.ToLower()
                                select i);

            // after children are filled, fill inherited members
            FillInheritedMembers(mainYaml, main);
            FillReferences(page, document, articleContext);

            EmptyToNull(mainYaml);
            return(Task.FromResult(page));
        }