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); }
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)); } } }
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); }
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); }
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)); }
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); }
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); }
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); }
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); }
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; } } }