Exemple #1
0
        private static void Copy(MetadataItem dest, string srcName, ResolverContext context)
        {
            MetadataItem src = null;

            // An explicit <inheritdoc/> (i.e. cref) overrides the default behavior
            if (!string.IsNullOrEmpty(dest.InheritDoc) && context.Members.TryGetValue(dest.InheritDoc, out src))
            {
                srcName = dest.InheritDoc;
            }

            if (string.IsNullOrEmpty(srcName))
            {
                return;
            }

            if (src == null && !context.Members.TryGetValue(srcName, out src))
            {
                // Try to resolve any templated references before giving up
                if (!context.References.TryGetValue(srcName, out var referenceItem) || referenceItem.Definition == null ||
                    !context.Members.TryGetValue(referenceItem.Definition, out src))
                {
                    Logger.LogWarning($"Could not resolve base documentation for '{dest.Name}'",
                                      file: dest.Source.Path,
                                      line: dest.Source.StartLine != 0 ? dest.Source.StartLine.ToString() : null);
                    return;
                }
            }

            Copy(dest, src, context);
        }
        private static void Copy(MetadataItem dest, string srcName, ResolverContext context)
        {
            MetadataItem src = null;

            // An explicit <inheritdoc/> (i.e. cref) overrides the default behavior
            if (!string.IsNullOrEmpty(dest.InheritDoc) && context.Members.TryGetValue(dest.InheritDoc, out src))
            {
                srcName = dest.InheritDoc;
            }

            if (string.IsNullOrEmpty(srcName))
            {
                return;
            }

            if (src == null && !context.Members.TryGetValue(srcName, out src))
            {
                // Try to resolve any templated references before giving up
                if (!context.References.TryGetValue(srcName, out var referenceItem) || !context.Members.TryGetValue(referenceItem.Definition, out src))
                {
                    return;
                }
            }

            Copy(dest, src, context);
        }
Exemple #3
0
 public static void ExecutePipeline(MetadataModel yaml, ResolverContext context)
 {
     foreach (var pipeline in pipelines)
     {
         pipeline.Run(yaml, context);
     }
 }
 public static void ExecutePipeline(MetadataModel yaml, ResolverContext context)
 {
     foreach (var pipeline in pipelines)
     {
         pipeline.Run(yaml, context);
     }
 }
Exemple #5
0
        /// <summary>
        /// TODO: input Namespace list instead; 
        /// TODO: Save to ...yml.map
        /// </summary>
        /// <param name="allMembers"></param>
        /// <returns></returns>
        public static MetadataModel ResolveMetadata(
            Dictionary<string, MetadataItem> allMembers,
            Dictionary<string, ReferenceItem> allReferences,
            string apiFolder,
            bool preserveRawInlineComments,
            IEnumerable<string> externalReferencePackages)
        {
            MetadataModel viewModel = new MetadataModel();
            viewModel.TocYamlViewModel = new MetadataItem()
            {
                Type = MemberType.Toc,
                Items = allMembers.Where(s => s.Value.Type == MemberType.Namespace).Select(s => s.Value).ToList(),
            };
            viewModel.Members = new List<MetadataItem>();
            ResolverContext context = new ResolverContext
            {
                ApiFolder = apiFolder,
                References = allReferences,
                PreserveRawInlineComments = preserveRawInlineComments,
            };

            ExecutePipeline(viewModel, context);

            return viewModel;
        }
        /// <summary>
        /// TODO: input Namespace list instead;
        /// TODO: Save to ...yml.map
        /// </summary>
        /// <param name="allMembers"></param>
        /// <returns></returns>
        public static MetadataModel ResolveMetadata(
            Dictionary <string, MetadataItem> allMembers,
            Dictionary <string, ReferenceItem> allReferences,
            string apiFolder,
            bool preserveRawInlineComments,
            IEnumerable <string> externalReferencePackages)
        {
            MetadataModel viewModel = new MetadataModel();

            viewModel.TocYamlViewModel = new MetadataItem()
            {
                Type  = MemberType.Toc,
                Items = allMembers.Where(s => s.Value.Type == MemberType.Namespace).Select(s => s.Value).ToList(),
            };
            viewModel.Members = new List <MetadataItem>();
            ResolverContext context = new ResolverContext
            {
                ApiFolder  = apiFolder,
                References = allReferences,
                PreserveRawInlineComments = preserveRawInlineComments,
            };

            ExecutePipeline(viewModel, context);

            return(viewModel);
        }
Exemple #7
0
 public void Run(MetadataModel yaml, ResolverContext context)
 {
     if (yaml.Members != null && yaml.Members.Count > 0)
     {
         UpdateDerivedClassMapping(yaml.Members, context.References);
         AppendDerivedClass(yaml.Members);
     }
 }
Exemple #8
0
 public void Run(MetadataModel yaml, ResolverContext context)
 {
     if (yaml.Members != null && yaml.Members.Count > 0)
     {
         UpdateDerivedClassMapping(yaml.Members, context.References);
         AppendDerivedClass(yaml.Members);
     }
 }
        static void Copy(MetadataItem dest, MetadataItem src, ResolverContext context)
        {
            if (src.IsInheritDoc)
            {
                InheritDoc(src, context);
            }

            dest.CopyInheritedData(src);
        }
        private static void Copy(MetadataItem dest, string srcName, ResolverContext context)
        {
            if (string.IsNullOrEmpty(srcName) || !context.Members.TryGetValue(srcName, out MetadataItem src))
            {
                return;
            }

            Copy(dest, src, context);
        }
Exemple #11
0
 public void Run(MetadataModel yaml, ResolverContext context)
 {
     TreeIterator.Preorder(yaml.TocYamlViewModel, null,
                           s => s.IsInvalid ? null : s.Items,
                           (current, parent) =>
     {
         current.Parent = parent;
         return(true);
     });
 }
Exemple #12
0
 public void Run(MetadataModel yaml, ResolverContext context)
 {
     TreeIterator.Preorder(yaml.TocYamlViewModel, null,
         s => s.IsInvalid ? null : s.Items,
         (current, parent) =>
         {
             current.Parent = parent;
             return true;
         });
 }
Exemple #13
0
        private static void Copy(MetadataItem dest, MetadataItem src, ResolverContext context)
        {
            if (src.InheritDoc != null)
            {
                InheritDoc(src, context);
                src.InheritDoc = null;
            }

            dest.CopyInheritedData(src);
            dest.InheritDoc = null;
        }
Exemple #14
0
 private void AddIndirectReference(ResolverContext context, MetadataItem page, List <ReferenceItem> addedReferences)
 {
     while (addedReferences.Count > 0)
     {
         var addingReferences = new List <ReferenceItem>();
         foreach (var r in addedReferences)
         {
             foreach (var key in GetReferenceKeys(r))
             {
                 TryAddReference(context, page, addingReferences, key);
             }
         }
         addedReferences = addingReferences;
     }
 }
Exemple #15
0
 private void AddIndirectReference(ResolverContext context, MetadataItem page, List<ReferenceItem> addedReferences)
 {
     while (addedReferences.Count > 0)
     {
         var addingReferences = new List<ReferenceItem>();
         foreach (var r in addedReferences)
         {
             foreach (var key in GetReferenceKeys(r))
             {
                 TryAddReference(context, page, addingReferences, key);
             }
         }
         addedReferences = addingReferences;
     }
 }
Exemple #16
0
 public void Run(MetadataModel yaml, ResolverContext context)
 {
     TreeIterator.Preorder(
         yaml.TocYamlViewModel,
         null,
         s => s.IsInvalid ? null : s.Items,
         (current, parent) =>
     {
         if (current.InheritDoc != null)
         {
             InheritDoc(current, context);
             current.InheritDoc = null;
         }
         return(true);
     });
 }
Exemple #17
0
 private static void TryAddReference(ResolverContext context, MetadataItem page, List <ReferenceItem> addingReferences, string key)
 {
     if (!page.References.ContainsKey(key))
     {
         if (context.References.TryGetValue(key, out ReferenceItem item))
         {
             var reference = context.References[key].Clone();
             page.References.Add(key, reference);
             addingReferences.Add(reference);
         }
         else
         {
             Debug.Fail($"Reference not found: {key}");
         }
     }
 }
Exemple #18
0
        /// <summary>
        /// The yaml layout should be 
        /// namespace -- class level -- method level
        /// </summary>
        /// <param name="allMembers"></param>
        /// <returns></returns>
        public void Run(MetadataModel yaml, ResolverContext context)
        {
            StringBuilder message = new StringBuilder();
            foreach (var member in yaml.TocYamlViewModel.Items)
            {
                var result = CheckNamespaces(member);
                if (!string.IsNullOrEmpty(result))
                {
                    message.AppendLine(result);
                }
            }

            if (message.Length > 0)
            {
                Logger.LogWarning(message.ToString());
            }
        }
Exemple #19
0
 private static void TryAddReference(ResolverContext context, MetadataItem page, List<ReferenceItem> addingReferences, string key)
 {
     if (!page.References.ContainsKey(key))
     {
         ReferenceItem item;
         if (context.References.TryGetValue(key, out item))
         {
             var reference = context.References[key].Clone();
             page.References.Add(key, reference);
             addingReferences.Add(reference);
         }
         else
         {
             Debug.Fail(string.Format("Reference not found: {0}", key));
         }
     }
 }
        /// <summary>
        /// The yaml layout should be
        /// namespace -- class level -- method level
        /// </summary>
        /// <param name="allMembers"></param>
        /// <returns></returns>
        public void Run(MetadataModel yaml, ResolverContext context)
        {
            StringBuilder message = new StringBuilder();

            foreach (var member in yaml.TocYamlViewModel.Items)
            {
                var result = CheckNamespaces(member);
                if (!string.IsNullOrEmpty(result))
                {
                    message.AppendLine(result);
                }
            }

            if (message.Length > 0)
            {
                Logger.LogWarning(message.ToString());
            }
        }
Exemple #21
0
        public void Run(MetadataModel yaml, ResolverContext context)
        {
            TreeIterator.Preorder(yaml.TocYamlViewModel, null,
                s =>
                {
                    if (s.IsInvalid || (s.Type != MemberType.Namespace && s.Type != MemberType.Toc)) return null;
                    else return s.Items;
                },
                (member, parent) =>
                {
                    if (member.Type != MemberType.Toc)
                    {
                        yaml.Members.Add(member);
                    }

                    return true;
                });
        }
Exemple #22
0
 public void Run(MetadataModel yaml, ResolverContext context)
 {
     TreeIterator.Preorder(yaml.TocYamlViewModel, null,
         s => s.IsInvalid ? null : s.Items,
         (current, parent) =>
         {
             MetadataItem page;
             var addingReferences = new List<ReferenceItem>();
             var documentReferences = current.References;
             if (current.Type.IsPageLevel())
             {
                 page = current;
                 current.References = new Dictionary<string, ReferenceItem>();
             }
             else
             {
                 page = parent;
                 current.References = null;
             }
             if (documentReferences != null && documentReferences.Count > 0)
             {
                 foreach (var key in documentReferences.Keys)
                 {
                     TryAddReference(context, page, addingReferences, key);
                 }
             }
             foreach (var key in GetReferenceKeys(current))
             {
                 TryAddReference(context, page, addingReferences, key);
             }
             if (current.Type == MemberType.Namespace)
             {
                 foreach (var item in current.Items)
                 {
                     TryAddReference(context, page, addingReferences, item.Name);
                 }
             }
             AddIndirectReference(context, page, addingReferences);
             return true;
         });
 }
Exemple #23
0
 public void Run(MetadataModel yaml, ResolverContext context)
 {
     TreeIterator.Preorder(yaml.TocYamlViewModel, null,
                           s => s.IsInvalid ? null : s.Items,
                           (current, parent) =>
     {
         MetadataItem page;
         var addingReferences   = new List <ReferenceItem>();
         var documentReferences = current.References;
         if (current.Type.IsPageLevel())
         {
             page = current;
             current.References = new Dictionary <string, ReferenceItem>();
         }
         else
         {
             page = parent;
             current.References = null;
         }
         if (documentReferences != null && documentReferences.Count > 0)
         {
             foreach (var key in documentReferences.Keys)
             {
                 TryAddReference(context, page, addingReferences, key);
             }
         }
         foreach (var key in GetReferenceKeys(current))
         {
             TryAddReference(context, page, addingReferences, key);
         }
         if (current.Type == MemberType.Namespace)
         {
             foreach (var item in current.Items)
             {
                 TryAddReference(context, page, addingReferences, item.Name);
             }
         }
         AddIndirectReference(context, page, addingReferences);
         return(true);
     });
 }
Exemple #24
0
        public void Run(MetadataModel yaml, ResolverContext context)
        {
            TreeIterator.Preorder(
                yaml.TocYamlViewModel,
                null,
                s => s.IsInvalid ? null : s.Items,
                (member, parent) =>
            {
                // get all the possible places where link is possible
                if (member.Syntax != null && member.Syntax.Content != null)
                {
                    SyntaxLanguage[] keys = new SyntaxLanguage[member.Syntax.Content.Count];
                    member.Syntax.Content.Keys.CopyTo(keys, 0);
                    foreach (var key in keys)
                    {
                        member.Syntax.Content[key] = NormalizeLines(member.Syntax.Content[key]);
                    }
                }

                return(true);
            });
        }
Exemple #25
0
        public void Run(MetadataModel yaml, ResolverContext context)
        {
            TreeIterator.Preorder(
                yaml.TocYamlViewModel,
                null,
                s => s.IsInvalid ? null : s.Items,
                (member, parent) =>
                {
                    // get all the possible places where link is possible
                    if (member.Syntax != null && member.Syntax.Content != null)
                    {
                        SyntaxLanguage[] keys = new SyntaxLanguage[member.Syntax.Content.Count];
                        member.Syntax.Content.Keys.CopyTo(keys, 0);
                        foreach(var key in keys)
                        {
                            member.Syntax.Content[key] = NormalizeLines(member.Syntax.Content[key]);
                        }
                    }

                    return true;
                });
        }
Exemple #26
0
        public void Run(MetadataModel yaml, ResolverContext context)
        {
            TreeIterator.Preorder(yaml.TocYamlViewModel, null,
                                  s =>
            {
                if (s.IsInvalid || (s.Type != MemberType.Namespace && s.Type != MemberType.Toc))
                {
                    return(null);
                }
                else
                {
                    return(s.Items);
                }
            },
                                  (member, parent) =>
            {
                if (member.Type != MemberType.Toc)
                {
                    yaml.Members.Add(member);
                }

                return(true);
            });
        }
        static void InheritDoc(MetadataItem dest, ResolverContext context)
        {
            dest.IsInheritDoc = false;

            switch (dest.Type)
            {
            case MemberType.Constructor:
                if (dest.Parent == null || dest.Syntax == null || dest.Syntax.Parameters == null)
                {
                    return;
                }
                Debug.Assert(dest.Parent.Type == MemberType.Class);

                //try to find the base class
                if (dest.Parent.Inheritance?.Count == 0)
                {
                    return;
                }
                MetadataItem baseClass;
                if (!context.Members.TryGetValue(dest.Parent.Inheritance[dest.Parent.Inheritance.Count - 1], out baseClass))
                {
                    return;
                }
                if (baseClass.Items == null)
                {
                    return;
                }

                //look a constructor in the base class which has a matching signature
                foreach (var ctor in baseClass.Items)
                {
                    if (ctor.Type != MemberType.Constructor)
                    {
                        continue;
                    }
                    if (ctor.Syntax == null || ctor.Syntax.Parameters == null)
                    {
                        continue;
                    }
                    if (ctor.Syntax.Parameters.Count != dest.Syntax.Parameters.Count)
                    {
                        continue;
                    }

                    bool parametersMatch = true;
                    for (int ndx = 0; ndx < dest.Syntax.Parameters.Count; ndx++)
                    {
                        var myParam   = dest.Syntax.Parameters[ndx];
                        var baseParam = ctor.Syntax.Parameters[ndx];
                        if (myParam.Name != baseParam.Name)
                        {
                            parametersMatch = false;
                        }
                        if (myParam.Type != baseParam.Type)
                        {
                            parametersMatch = false;
                        }
                    }

                    if (parametersMatch)
                    {
                        Copy(dest, ctor, context);
                        return;
                    }
                }
                break;

            case MemberType.Method:
            case MemberType.Property:
            case MemberType.Event:
                Copy(dest, dest.Overridden, context);
                if (dest.Implements != null)
                {
                    foreach (var item in dest.Implements)
                    {
                        Copy(dest, item, context);
                    }
                }
                break;

            case MemberType.Class:
                if (dest.Inheritance.Count != 0)
                {
                    Copy(dest, dest.Inheritance[dest.Inheritance.Count - 1], context);
                }
                if (dest.Implements != null)
                {
                    foreach (var item in dest.Implements)
                    {
                        Copy(dest, item, context);
                    }
                }
                break;
            }
        }