string GetDocumentation(XmlDocumentationProvider docProvider, IMemberRef mr) {
			var sb = new StringBuilder();
			var doc = docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(mr, sb));
			if (doc != null)
				return doc;
			var method = mr as IMethod;
			if (method == null)
				return null;
			string name = method.Name;
			if (name.StartsWith("set_") || name.StartsWith("get_")) {
				var md = Resolve(method) as MethodDef;
				if (md == null)
					return null;
				mr = md.DeclaringType.Properties.FirstOrDefault(p => p.GetMethod == md || p.SetMethod == md);
				return docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(mr, sb));
			}
			else if (name.StartsWith("add_")) {
				var md = Resolve(method) as MethodDef;
				if (md == null)
					return null;
				mr = md.DeclaringType.Events.FirstOrDefault(p => p.AddMethod == md);
				return docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(mr, sb));
			}
			else if (name.StartsWith("remove_")) {
				var md = Resolve(method) as MethodDef;
				if (md == null)
					return null;
				mr = md.DeclaringType.Events.FirstOrDefault(p => p.RemoveMethod == md);
				return docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(mr, sb));
			}
			return null;
		}
        string?GetDocumentation(XmlDocumentationProvider docProvider, IMemberRef mr)
        {
            var sb  = new StringBuilder();
            var doc = docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(mr, sb));

            if (doc is not null)
            {
                return(doc);
            }
            var method = mr as IMethod;

            if (method is null)
            {
                return(null);
            }
            string name = method.Name;

            if (name.StartsWith("set_") || name.StartsWith("get_"))
            {
                var md = Resolve(method) as MethodDef;
                if (md is null)
                {
                    return(null);
                }
                var mr2 = md.DeclaringType.Properties.FirstOrDefault(p => p.GetMethod == md || p.SetMethod == md);
                return(docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(mr2, sb)));
            }
            else if (name.StartsWith("add_"))
            {
                var md = Resolve(method) as MethodDef;
                if (md is null)
                {
                    return(null);
                }
                var mr2 = md.DeclaringType.Events.FirstOrDefault(p => p.AddMethod == md);
                return(docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(mr2, sb)));
            }
            else if (name.StartsWith("remove_"))
            {
                var md = Resolve(method) as MethodDef;
                if (md is null)
                {
                    return(null);
                }
                var mr2 = md.DeclaringType.Events.FirstOrDefault(p => p.RemoveMethod == md);
                return(docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(mr2, sb)));
            }
            return(null);
        }
        public void GetDocumentationForAction(HttpActionDescriptor actionDescriptor, string expectedString)
        {
            XmlDocumentationProvider provider = new XmlDocumentationProvider("WebApiHelpPage.Test.XML");
            string documentationString        = provider.GetDocumentation(actionDescriptor);

            Assert.Equal(expectedString, documentationString);
        }
Example #4
0
            public ApiDescription(System.Web.Http.Description.ApiDescription desc, XmlDocumentationProvider xmlDocProvider)
                : this()
            {
                this.Name          = desc.ActionDescriptor.ActionName;
                this.RelativePath  = desc.RelativePath;
                this.HttpMethod    = desc.HttpMethod.Method;
                this.Controller    = desc.ActionDescriptor.ControllerDescriptor.ControllerName;
                this.Documentation = xmlDocProvider.GetDocumentation(desc.ActionDescriptor);
                this.ReturnType    = xmlDocProvider.GetResponseDocumentation(desc.ActionDescriptor);

                string permissionCref = null;

                this.PermissionDescription = xmlDocProvider.GetPermissionDocumentation(desc.ActionDescriptor, out permissionCref);
                this.PermissionCref        = permissionCref;

                foreach (var paramDesc in desc.ParameterDescriptions)
                {
                    if (paramDesc.Source == ApiParameterSource.FromBody)
                    {
                        this.BodyType = paramDesc.ParameterDescriptor.ParameterType.ToString();
                    }
                    else
                    {
                        this.Parameters.Add(new ApiParameter(paramDesc, xmlDocProvider));
                    }
                }
            }
Example #5
0
        public void XmlDocForType()
        {
            var provider = new XmlDocumentationProvider(logFactory.CreateLogger <XmlDocumentationProvider>());
            var xmlDoc   = provider.GetDocumentation(typeof(XmlDocumentationProviderTests));

            Console.WriteLine(xmlDoc);
            Assert.AreEqual("Test class\nSecond line documentation", xmlDoc);
        }
Example #6
0
 private object GenerateTooltip(ReferenceSegment segment)
 {
     if (segment.Reference is Mono.Cecil.Cil.OpCode)
     {
         Mono.Cecil.Cil.OpCode code           = (Mono.Cecil.Cil.OpCode)segment.Reference;
         string encodedName                   = code.Code.ToString();
         string opCodeHex                     = code.Size > 1 ? string.Format("0x{0:x2}{1:x2}", code.Op1, code.Op2) : string.Format("0x{0:x2}", code.Op2);
         XmlDocumentationProvider docProvider = XmlDocLoader.MscorlibDocumentation;
         if (docProvider != null)
         {
             string documentation = docProvider.GetDocumentation("F:System.Reflection.Emit.OpCodes." + encodedName);
             if (documentation != null)
             {
                 XmlDocRenderer renderer = new XmlDocRenderer();
                 renderer.AppendText(string.Format("{0} ({1}) - ", code.Name, opCodeHex));
                 renderer.AddXmlDocumentation(documentation);
                 return(renderer.CreateTextBlock());
             }
         }
         return(string.Format("{0} ({1})", code.Name, opCodeHex));
     }
     else if (segment.Reference is MemberReference)
     {
         MemberReference mr = (MemberReference)segment.Reference;
         // if possible, resolve the reference
         if (mr is TypeReference)
         {
             mr = ((TypeReference)mr).Resolve() ?? mr;
         }
         else if (mr is MethodReference)
         {
             mr = ((MethodReference)mr).Resolve() ?? mr;
         }
         XmlDocRenderer renderer = new XmlDocRenderer();
         renderer.AppendText(MainWindow.Instance.CurrentLanguage.GetTooltip(mr));
         try {
             XmlDocumentationProvider docProvider = XmlDocLoader.LoadDocumentation(mr.Module);
             if (docProvider != null)
             {
                 string documentation = docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(mr));
                 if (documentation != null)
                 {
                     renderer.AppendText(Environment.NewLine);
                     renderer.AddXmlDocumentation(documentation);
                 }
             }
         } catch (XmlException) {
             // ignore
         }
         return(renderer.CreateTextBlock());
     }
     return(null);
 }
Example #7
0
            bool TryGetDocumentation(IEntity entity, out XElement documentation)
            {
                documentation = ConvertToDocumentation(_documentationProvider.GetDocumentation(entity));

                while (documentation.HasInheritDoc(out XElement inheritDoc))
                {
                    string referenceName = inheritDoc.GetReferenceName();

                    documentation = ConvertToDocumentation(
                        referenceName is null
                        ? (entity switch
                    {
                        ITypeDefinition type => type
                        .GetBaseTypeDefinitions()
                        .Select(t => _documentationProvider.GetDocumentation(t)),
                        _ => entity
                        .DeclaringTypeDefinition
                        .GetBaseTypeDefinitions()
                        .Select(t => _documentationProvider.GetDocumentation(entity.GetIdString().Replace(
                                                                                 entity.DeclaringTypeDefinition.GetIdString().Substring(2),
                                                                                 t.GetIdString().Substring(2))))
                    }).FirstOrDefault(d => d != null)
                        : _documentationProvider.GetDocumentation(referenceName));
                }
 protected override string GetDocumentationForSymbol(string documentationMemberID, CultureInfo preferredCulture, CancellationToken cancellationToken)
 {
     if (!hasLoaded)
     {
         lock (this) {
             if (!hasLoaded)
             {
                 try {
                     xmlDocumentationProvider = XmlDocLoader.LoadDocumentation(this, filename);
                 }
                 catch (ArgumentException) {
                 }
             }
             hasLoaded = true;
         }
     }
     return(xmlDocumentationProvider?.GetDocumentation(documentationMemberID));
 }
Example #9
0
 object GenerateTooltip(ReferenceSegment segment)
 {
     if (segment.Reference is ICSharpCode.Decompiler.Disassembler.OpCodeInfo code)
     {
         XmlDocumentationProvider docProvider = XmlDocLoader.MscorlibDocumentation;
         if (docProvider != null)
         {
             string documentation = docProvider.GetDocumentation("F:System.Reflection.Emit.OpCodes." + code.EncodedName);
             if (documentation != null)
             {
                 XmlDocRenderer renderer = new XmlDocRenderer();
                 renderer.AppendText($"{code.Name} (0x{code.Code:x}) - ");
                 renderer.AddXmlDocumentation(documentation);
                 return(renderer.CreateTextBlock());
             }
         }
         return($"{code.Name} (0x{code.Code:x})");
     }
     else if (segment.Reference is IEntity entity)
     {
         return(CreateTextBlockForEntity(entity));
     }
     else if (segment.Reference is ValueTuple <PEFile, System.Reflection.Metadata.EntityHandle> unresolvedEntity)
     {
         var typeSystem = new DecompilerTypeSystem(unresolvedEntity.Item1, unresolvedEntity.Item1.GetAssemblyResolver(), TypeSystemOptions.Default | TypeSystemOptions.Uncached);
         try {
             IEntity resolved = typeSystem.MainModule.ResolveEntity(unresolvedEntity.Item2);
             if (resolved == null)
             {
                 return(null);
             }
             return(CreateTextBlockForEntity(resolved));
         } catch (BadImageFormatException) {
             return(null);
         }
     }
     return(null);
 }
Example #10
0
 object GenerateTooltip(ReferenceSegment segment)
 {
     if (segment.Reference is ICSharpCode.Decompiler.Disassembler.OpCodeInfo code)
     {
         XmlDocumentationProvider docProvider = XmlDocLoader.MscorlibDocumentation;
         DocumentationUIBuilder   renderer    = new DocumentationUIBuilder(new CSharpAmbience(), MainWindow.Instance.CurrentLanguage.SyntaxHighlighting);
         renderer.AddSignatureBlock($"{code.Name} (0x{code.Code:x})");
         if (docProvider != null)
         {
             string documentation = docProvider.GetDocumentation("F:System.Reflection.Emit.OpCodes." + code.EncodedName);
             if (documentation != null)
             {
                 renderer.AddXmlDocumentation(documentation, null, null);
             }
         }
         return(new FlowDocumentTooltip(renderer.CreateDocument()));
     }
     else if (segment.Reference is IEntity entity)
     {
         return(new FlowDocumentTooltip(CreateTooltipForEntity(entity)));
     }
     else if (segment.Reference is ValueTuple <PEFile, System.Reflection.Metadata.EntityHandle> unresolvedEntity)
     {
         var typeSystem = new DecompilerTypeSystem(unresolvedEntity.Item1, unresolvedEntity.Item1.GetAssemblyResolver(), TypeSystemOptions.Default | TypeSystemOptions.Uncached);
         try {
             IEntity resolved = typeSystem.MainModule.ResolveEntity(unresolvedEntity.Item2);
             if (resolved == null)
             {
                 return(null);
             }
             return(new FlowDocumentTooltip(CreateTooltipForEntity(resolved)));
         } catch (BadImageFormatException) {
             return(null);
         }
     }
     return(null);
 }
Example #11
0
        void TextViewMouseHover(object sender, MouseEventArgs e)
        {
            TextViewPosition?position = textEditor.TextArea.TextView.GetPosition(e.GetPosition(textEditor.TextArea.TextView) + textEditor.TextArea.TextView.ScrollOffset);

            if (position == null)
            {
                return;
            }
            int offset = textEditor.Document.GetOffset(position.Value.Location);

            if (referenceElementGenerator.References == null)
            {
                return;
            }
            ReferenceSegment seg = referenceElementGenerator.References.FindSegmentsContaining(offset).FirstOrDefault();

            if (seg == null)
            {
                return;
            }
            object content = GenerateTooltip(seg);

            if (tooltip != null)
            {
                tooltip.IsOpen = false;
            }
            if (content != null)
            {
                tooltip = new ToolTip()
                {
                    Content = content, IsOpen = true
                }
            }
            ;
        }

        object GenerateTooltip(ReferenceSegment segment)
        {
            if (segment.Reference is Mono.Cecil.Cil.OpCode)
            {
                Mono.Cecil.Cil.OpCode code           = (Mono.Cecil.Cil.OpCode)segment.Reference;
                string encodedName                   = code.Code.ToString();
                string opCodeHex                     = code.Size > 1 ? string.Format("0x{0:x2}{1:x2}", code.Op1, code.Op2) : string.Format("0x{0:x2}", code.Op2);
                XmlDocumentationProvider docProvider = XmlDocLoader.MscorlibDocumentation;
                if (docProvider != null)
                {
                    string documentation = docProvider.GetDocumentation("F:System.Reflection.Emit.OpCodes." + encodedName);
                    if (documentation != null)
                    {
                        XmlDocRenderer renderer = new XmlDocRenderer();
                        renderer.AppendText(string.Format("{0} ({1}) - ", code.Name, opCodeHex));
                        renderer.AddXmlDocumentation(documentation);
                        return(renderer.CreateTextBlock());
                    }
                }
                return(string.Format("{0} ({1})", code.Name, opCodeHex));
            }
            else if (segment.Reference is MemberReference)
            {
                MemberReference mr = (MemberReference)segment.Reference;
                // if possible, resolve the reference
                if (mr is TypeReference)
                {
                    mr = ((TypeReference)mr).Resolve() ?? mr;
                }
                else if (mr is MethodReference)
                {
                    mr = ((MethodReference)mr).Resolve() ?? mr;
                }
                XmlDocRenderer renderer = new XmlDocRenderer();
                renderer.AppendText(MainWindow.Instance.CurrentLanguage.GetTooltip(mr));
                try {
                    XmlDocumentationProvider docProvider = XmlDocLoader.LoadDocumentation(mr.Module);
                    if (docProvider != null)
                    {
                        string documentation = docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(mr));
                        if (documentation != null)
                        {
                            renderer.AppendText(Environment.NewLine);
                            renderer.AddXmlDocumentation(documentation);
                        }
                    }
                } catch (XmlException) {
                    // ignore
                }
                return(renderer.CreateTextBlock());
            }
            return(null);
        }
Example #12
0
        void TextViewMouseHover(object sender, MouseEventArgs e)
        {
            TextViewPosition?position = GetPositionFromMousePosition();

            if (position == null)
            {
                return;
            }
            int offset = textEditor.Document.GetOffset(position.Value.Location);

            if (referenceElementGenerator.References == null)
            {
                return;
            }
            ReferenceSegment seg = referenceElementGenerator.References.FindSegmentsContaining(offset).FirstOrDefault();

            if (seg == null)
            {
                return;
            }
            object content = GenerateTooltip(seg);

            if (tooltip != null)
            {
                tooltip.IsOpen = false;
            }
            if (content != null)
            {
                tooltip = new ToolTip()
                {
                    Content = content, IsOpen = true
                }
            }
            ;
        }

        object GenerateTooltip(ReferenceSegment segment)
        {
            if (segment.Reference is ICSharpCode.Decompiler.Disassembler.OpCodeInfo code)
            {
                XmlDocumentationProvider docProvider = XmlDocLoader.MscorlibDocumentation;
                if (docProvider != null)
                {
                    string documentation = docProvider.GetDocumentation("F:System.Reflection.Emit.OpCodes." + code.EncodedName);
                    if (documentation != null)
                    {
                        XmlDocRenderer renderer = new XmlDocRenderer();
                        renderer.AppendText($"{code.Name} (0x{code.Code:x}) - ");
                        renderer.AddXmlDocumentation(documentation);
                        return(renderer.CreateTextBlock());
                    }
                }
                return($"{code.Name} (0x{code.Code:x})");
            }
            else if (segment.Reference is IEntity entity)
            {
                return(CreateTextBlockForEntity(entity));
            }
            else if (segment.Reference is ValueTuple <PEFile, System.Reflection.Metadata.EntityHandle> unresolvedEntity)
            {
                var typeSystem = new DecompilerTypeSystem(unresolvedEntity.Item1, unresolvedEntity.Item1.GetAssemblyResolver(), TypeSystemOptions.Default | TypeSystemOptions.Uncached);
                try {
                    IEntity resolved = typeSystem.MainModule.ResolveEntity(unresolvedEntity.Item2);
                    if (resolved == null)
                    {
                        return(null);
                    }
                    return(CreateTextBlockForEntity(resolved));
                } catch (BadImageFormatException) {
                    return(null);
                }
            }
            return(null);
        }
            bool TryGetDocumentation(IEntity entity, out XElement documentation)
            {
                documentation = ConvertToDocumentation(_documentationProvider.GetDocumentation(entity));

                return(documentation != null);
            }
Example #14
0
        void TextViewMouseHover(object sender, MouseEventArgs e)
        {
            TextViewPosition?position = textEditor.TextArea.TextView.GetPosition(e.GetPosition(textEditor.TextArea.TextView) + textEditor.TextArea.TextView.ScrollOffset);

            if (position == null)
            {
                return;
            }
            int offset           = textEditor.Document.GetOffset(position.Value);
            ReferenceSegment seg = referenceElementGenerator.References.FindSegmentsContaining(offset).FirstOrDefault();

            if (seg == null)
            {
                return;
            }
            object content = GenerateTooltip(seg);

            if (tooltip != null)
            {
                tooltip.IsOpen = false;
            }
            if (content != null)
            {
                tooltip = new ToolTip()
                {
                    Content = content, IsOpen = true
                }
            }
            ;
        }

        object GenerateTooltip(ReferenceSegment segment)
        {
            if (segment.Reference is Mono.Cecil.Cil.OpCode)
            {
                Mono.Cecil.Cil.OpCode code = (Mono.Cecil.Cil.OpCode)segment.Reference;
                string encodedName         = code.Code.ToString();
                string opCodeHex           = code.Size > 1 ? string.Format("0x{0:x2}{1:x2}", code.Op1, code.Op2) : string.Format("0x{0:x2}", code.Op2);
                string documentationFile   = FindDocumentation("mscorlib.xml");
                string text = "";
                if (documentationFile != null)
                {
                    XmlDocumentationProvider provider = new XmlDocumentationProvider(documentationFile);
                    string documentation = provider.GetDocumentation("F:System.Reflection.Emit.OpCodes." + encodedName);
                    if (documentation != null)
                    {
                        text = StripXml(documentation);
                    }
                }
                return(string.Format("{0} ({1}): {2}", code.Name, opCodeHex, text));
            }

            return(null);
        }

        string StripXml(string xmlText)
        {
            try {
                using (XmlTextReader xml = new XmlTextReader(new StringReader(xmlText))) {
                    StringBuilder ret = new StringBuilder();
                    while (xml.Read())
                    {
                        if (xml.NodeType == XmlNodeType.Element)
                        {
                            string elname = xml.Name.ToLowerInvariant();
                            switch (elname)
                            {
                            case "summary":
                                break;

                            case "br":
                            case "para":
                                ret.AppendLine();
                                break;

                            default:
                                xml.Skip();
                                break;
                            }
                        }
                        else if (xml.NodeType == XmlNodeType.Text)
                        {
                            ret.Append(Regex.Replace(xml.Value, @"\s+", " "));
                        }
                    }
                    return(ret.ToString());
                }
            } catch (XmlException) {
                return(null);                // invalid XML docu
            }
        }

        string FindDocumentation(string fileName)
        {
            string        path  = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();
            List <string> names = new List <string>();

            EnumerateCultures(CultureInfo.CurrentCulture, names);
            names.Add("en");
            names.Add("en-US");
            names.Add("en-GB");

            foreach (string name in names)
            {
                string location = Path.Combine(path, name, fileName);
                if (File.Exists(location))
                {
                    return(location);
                }
            }

            path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), @"Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0");

            string loc = Path.Combine(path, fileName);

            if (File.Exists(loc))
            {
                return(loc);
            }

            return(null);
        }

        void EnumerateCultures(CultureInfo info, List <string> names)
        {
            while (info != null)
            {
                names.Add(info.Name);
                info = info.Parent;
                if (info == info.Parent)
                {
                    return;
                }
            }
        }