예제 #1
0
 private static void EmptyToNull(ArticleItemYaml yaml)
 {
     if (yaml.Children != null && yaml.Children.Count == 0)
     {
         yaml.Children = null;
     }
     if (yaml.Inheritance != null && yaml.Inheritance.Count == 0)
     {
         yaml.Inheritance = null;
     }
     if (yaml.InheritedMembers != null && yaml.InheritedMembers.Count == 0)
     {
         yaml.InheritedMembers = null;
     }
     if (yaml.Sees != null && yaml.Sees.Count == 0)
     {
         yaml.Sees = null;
     }
     if (yaml.Syntax != null && yaml.Syntax.Parameters != null && yaml.Syntax.Parameters.Count == 0)
     {
         yaml.Syntax.Parameters = null;
     }
     if (yaml.Syntax != null && yaml.Syntax.TypeParameters != null && yaml.Syntax.TypeParameters.Count == 0)
     {
         yaml.Syntax.TypeParameters = null;
     }
     if (yaml.Exceptions != null && yaml.Exceptions.Count == 0)
     {
         yaml.Exceptions = null;
     }
 }
예제 #2
0
        private MemberSDPModel AutoMapArticleItemYamlToMemberSDPModel(ArticleItemYaml articleItemYaml)
        {
            if (articleItemYaml == null)
            {
                return(null);
            }

            var memberSDPModel = new MemberSDPModel();

            memberSDPModel.FullName     = articleItemYaml.FullName.RemoveFromValue("(");
            memberSDPModel.Name         = articleItemYaml.Name;
            memberSDPModel.NameWithType = articleItemYaml.NameWithType.RemoveFromValue("(");
            memberSDPModel.Uid          = articleItemYaml.Uid;
            memberSDPModel.Type         = articleItemYaml.Type.ToString().ToLower();
            memberSDPModel.Package      = articleItemYaml.PackageName;
            memberSDPModel.Members      = new List <Member>();

            var member = TransferMember(articleItemYaml);

            if (member != null)
            {
                memberSDPModel.Members.Add(member);
            }

            return(memberSDPModel);
        }
예제 #3
0
 protected override IEnumerable <string> GetDefaultInheritance(ArticleItemYaml yaml)
 {
     if (yaml.Type == MemberType.Class)
     {
         yield return("System::Object");
     }
 }
예제 #4
0
        protected override void FillLanguageSpecificMetadata(ArticleItemYaml yaml, ArticleContext context, XElement node)
        {
            HierarchyChange curChange    = context.CurrentChange;
            HierarchyChange parentChange = context.ParentChange;

            yaml.PackageName = parentChange?.Uid;
        }
예제 #5
0
        protected void FillSource(ArticleItemYaml yaml, XElement node)
        {
            var location = node.NullableElement("location");

            if (!location.IsNull())
            {
                string headerPath         = location.NullableAttribute("file").NullableValue();
                string headerStartlineStr = location.NullableAttribute("line").NullableValue();
                int    headerStartline    = ParseStartline(headerStartlineStr);
                string bodyPath           = location.NullableAttribute("bodyfile").NullableValue();
                string bodyStartlineStr   = location.NullableAttribute("bodystart").NullableValue();
                int    bodyStartline      = ParseStartline(bodyStartlineStr);
                string path         = bodyPath ?? headerPath;
                int    startLine    = path == bodyPath ? bodyStartline : headerStartline;
                var    info         = GitUtility.GetGitInfo(path);
                string relativePath = GetRelativePath(path, info?.LocalWorkingDirectory);
                yaml.Source = new SourceDetail
                {
                    Remote = new GitDetail {
                        RemoteRepositoryUrl = info?.RemoteRepoUrl, RemoteBranch = info?.RemoteBranch, RelativePath = relativePath
                    },
                    Path      = relativePath,
                    StartLine = startLine,
                };
            }
        }
예제 #6
0
 protected void FillSummary(ArticleItemYaml yaml, XElement node)
 {
     yaml.Summary = node.NullableElement("briefdescription").NullableInnerXml() + ParseSummaryFromDetailedDescription(node.NullableElement("detaileddescription"));
     if (yaml.Summary == string.Empty)
     {
         yaml.Summary = null;
     }
 }
예제 #7
0
 protected void FillSyntax(ArticleItemYaml yaml, XElement node, bool isMain)
 {
     yaml.Syntax = new SyntaxDetailViewModel();
     FillTypeParameters(yaml.Syntax, node);
     FillParameters(yaml.Syntax, node);
     FillReturn(yaml.Syntax, node);
     FillDeclaration(yaml.Syntax, node, isMain);
 }
예제 #8
0
        protected void FillInheritedMembers(ArticleItemYaml yaml, XElement node)
        {
            var allMembers = from m in node.NullableElement("listofallmembers").Elements("member")
                             where !YamlUtility.IsFiltered(m.NullableAttribute("prot").NullableValue())
                             select m.NullableAttribute("refid").NullableValue();

            yaml.InheritedMembers = allMembers.Except(yaml.Children).ToList();
            _references.AddRange(yaml.InheritedMembers.Select(i => new ReferenceViewModel {
                Uid = i
            }));
        }
예제 #9
0
        protected void FillSees(ArticleItemYaml yaml, XElement node)
        {
            var sees = node.XPathSelectElements("detaileddescription/para/simplesect[@kind='see']/para/ref");

            yaml.Sees = (from see in sees
                         select new CrefInfo
            {
                Type = see.NullableAttribute("refid").NullableValue(),
                Description = see.NullableInnerXml()
            }).ToList();
        }
예제 #10
0
        protected override IEnumerable <string> GetDefaultInheritance(ArticleItemYaml yaml)
        {
            if (yaml.Type == MemberType.Enum)
            {
                yield return($"java.lang.Enum<{yaml.Name}>");
            }

            if (yaml.Type == MemberType.Class || yaml.Type == MemberType.Enum)
            {
                yield return("java.lang.Object");
            }
        }
예제 #11
0
        protected void FillOverload(ArticleItemYaml yaml, XElement node)
        {
            var kind = node.NullableAttribute("kind").NullableValue();
            var type = KindMapToType(kind).Item1;

            switch (type)
            {
            case MemberType.Method:
            case MemberType.Constructor:
                yaml.Overload = AddOverloadReference(yaml);
                break;
            }
        }
예제 #12
0
        protected void FillRemarks(ArticleItemYaml yaml, XElement node)
        {
            var par = node.XPathSelectElement("detaileddescription/para/simplesect[@kind='par']");

            if (par?.NullableInnerXmlRemoveBr()?.StartsWith("<title>API Note:</title>") != true)
            {
                return;
            }
            yaml.Remarks = WebUtility.HtmlDecode(node.XPathSelectElement("detaileddescription/para/simplesect[@kind='par']/para").NullableInnerXmlRemoveBr());
            if (yaml.Remarks == string.Empty)
            {
                yaml.Remarks = null;
            }
        }
예제 #13
0
 protected void FillImplementsOrInherits(ArticleItemYaml yaml, XElement node)
 {
     foreach (var basenode in node.Elements("basecompoundref"))
     {
         string refId = basenode.NullableAttribute("refid").NullableValue();
         string specializedFullName = YamlUtility.RegularizeName(basenode.NullableValue(), Constants.Dot);
         if (refId != null)
         {
             yaml.ImplementsOrInherits.Add(new SpecializedType {
                 Type = refId, SpecializedFullName = specializedFullName
             });
         }
     }
 }
예제 #14
0
        protected void FillException(ArticleItemYaml yaml, XElement node)
        {
            yaml.Exceptions = new List <CrefInfo>();
            var exceptions = node.XPathSelectElements("detaileddescription/para/parameterlist[@kind='exception']/parameteritem");

            foreach (var ex in exceptions)
            {
                yaml.Exceptions.Add(
                    new CrefInfo()
                {
                    Type        = ParseType(ex.XPathSelectElement("parameternamelist/parametername")),
                    Description = ex.NullableElement("parameterdescription").NullableInnerXml(),
                });
            }
        }
예제 #15
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();
        }
예제 #16
0
        private string AddOverloadReference(ArticleItemYaml yaml)
        {
            string id      = yaml.Uid;
            var    uidBody = RemoveArgs(id);

            uidBody = GenericMethodPostFix.Replace(uidBody, string.Empty);
            string             uid       = uidBody + "*";
            ReferenceViewModel reference = new ReferenceViewModel()
            {
                Uid          = uid,
                Name         = RemoveArgs(yaml.Name),
                FullName     = RemoveArgs(yaml.FullName),
                NameWithType = RemoveArgs(yaml.NameWithType),
                PackageName  = yaml.PackageName,
            };

            _references.Add(reference);
            return(uid);
        }
예제 #17
0
        protected Member TransferMember(ArticleItemYaml articleItemYaml)
        {
            if (articleItemYaml == null)
            {
                return(null);
            }

            var member = new Member();

            member.FullName       = articleItemYaml.FullName;
            member.Name           = articleItemYaml.Name;
            member.NameWithType   = articleItemYaml.NameWithType;
            member.Overridden     = articleItemYaml.Overridden;
            member.Parameters     = TransferParameters(articleItemYaml.Syntax);
            member.Exceptions     = TransferExceptions(articleItemYaml.Exceptions);
            member.Returns        = TransferReturns(articleItemYaml.Syntax);
            member.Syntax         = TransferSyntax(articleItemYaml.Syntax);
            member.Summary        = articleItemYaml.Summary;
            member.TypeParameters = TransferTypeParameters(articleItemYaml.Syntax);
            member.Uid            = articleItemYaml.Uid;

            return(member);
        }
예제 #18
0
 protected abstract void FillLanguageSpecificMetadata(ArticleItemYaml yaml, ArticleContext context, XElement node);
예제 #19
0
 protected void FillOverridden(ArticleItemYaml yaml, XElement node)
 {
     yaml.Overridden = node.NullableElement("reimplements").NullableAttribute("refid").NullableValue();
 }
예제 #20
0
 public abstract string GenerateInheritImplementString(IReadOnlyDictionary <string, ArticleItemYaml> articleDict, ArticleItemYaml yaml);
예제 #21
0
        public override string GenerateInheritImplementString(IReadOnlyDictionary <string, ArticleItemYaml> articleDict, ArticleItemYaml yaml)
        {
            if (yaml.ImplementsOrInherits == null || yaml.ImplementsOrInherits.Count == 0)
            {
                return(string.Empty);
            }
            List <string> implements = new List <string>();
            List <string> extends    = new List <string>();

            foreach (var ele in yaml.ImplementsOrInherits)
            {
                ArticleItemYaml eleYaml;
                if (articleDict.TryGetValue(ele.Type, out eleYaml))
                {
                    string parent = eleYaml.Parent != null ? articleDict[eleYaml.Parent].FullName : string.Empty;
                    string name   = YamlUtility.ParseNameFromFullName(HierarchyType.Class, parent, ele.SpecializedFullName, Constants.Dot);
                    if (yaml.Type != MemberType.Interface && eleYaml.Type == MemberType.Interface)
                    {
                        implements.Add(name);
                    }
                    else
                    {
                        extends.Add(name);
                    }
                }
            }

            var builder = new StringBuilder();

            if (extends.Count > 0)
            {
                builder.Append($" extends {extends[0]}");
                foreach (var ex in extends.Skip(1))
                {
                    builder.Append($",{ex}");
                }
            }
            if (implements.Count > 0)
            {
                builder.Append($" implements {implements[0]}");
                foreach (var im in implements.Skip(1))
                {
                    builder.Append($",{im}");
                }
            }

            return(builder.ToString());
        }
예제 #22
0
 protected abstract IEnumerable <string> GetDefaultInheritance(ArticleItemYaml yaml);
예제 #23
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));
        }