From 85c83b8e6fd78a050e3e4e6e40114773300f550b Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Mon, 9 Jul 2018 07:59:36 +0200 Subject: [PATCH] Fix #1052: Use IDocumentationProvider in the CSharpDecompiler API --- .../CSharp/CSharpDecompiler.cs | 19 +++++++++++++++++-- .../AddXmlDocumentationTransform.cs | 14 ++++++-------- ICSharpCode.Decompiler/DecompileRun.cs | 2 ++ .../Documentation/XmlDocumentationProvider.cs | 8 ++++++++ 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs b/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs index a3dfe539f..6ccf8a334 100644 --- a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs +++ b/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs @@ -344,6 +344,11 @@ namespace ICSharpCode.Decompiler.CSharp return typeSystemAstBuilder; } + IDocumentationProvider CreateDefaultDocumentationProvider() + { + return XmlDocLoader.LoadDocumentation(typeSystem.ModuleDefinition); + } + void RunTransforms(AstNode rootNode, DecompileRun decompileRun, ITypeResolveContext decompilationContext) { var typeSystemAstBuilder = CreateAstBuilder(decompilationContext); @@ -369,6 +374,7 @@ namespace ICSharpCode.Decompiler.CSharp { var decompilationContext = new SimpleTypeResolveContext(typeSystem.MainAssembly); var decompileRun = new DecompileRun(settings) { + DocumentationProvider = DocumentationProvider ?? CreateDefaultDocumentationProvider(), CancellationToken = CancellationToken }; syntaxTree = new SyntaxTree(); @@ -433,6 +439,7 @@ namespace ICSharpCode.Decompiler.CSharp { var decompilationContext = new SimpleTypeResolveContext(typeSystem.MainAssembly); var decompileRun = new DecompileRun(settings) { + DocumentationProvider = DocumentationProvider ?? CreateDefaultDocumentationProvider(), CancellationToken = CancellationToken }; syntaxTree = new SyntaxTree(); @@ -446,7 +453,10 @@ namespace ICSharpCode.Decompiler.CSharp public ILTransformContext CreateILTransformContext(ILFunction function) { - var decompileRun = new DecompileRun(settings) { CancellationToken = CancellationToken }; + var decompileRun = new DecompileRun(settings) { + DocumentationProvider = DocumentationProvider ?? CreateDefaultDocumentationProvider(), + CancellationToken = CancellationToken + }; RequiredNamespaceCollector.CollectNamespaces(function.Method, typeSystem, decompileRun.Namespaces); return new ILTransformContext(function, typeSystem, DebugInfoProvider, settings) { CancellationToken = CancellationToken, @@ -474,6 +484,7 @@ namespace ICSharpCode.Decompiler.CSharp throw new ArgumentNullException(nameof(types)); var decompilationContext = new SimpleTypeResolveContext(typeSystem.MainAssembly); var decompileRun = new DecompileRun(settings) { + DocumentationProvider = DocumentationProvider ?? CreateDefaultDocumentationProvider(), CancellationToken = CancellationToken }; syntaxTree = new SyntaxTree(); @@ -509,6 +520,7 @@ namespace ICSharpCode.Decompiler.CSharp throw new InvalidOperationException($"Could not find type definition {fullTypeName} in type system."); var decompilationContext = new SimpleTypeResolveContext(typeSystem.MainAssembly); var decompileRun = new DecompileRun(settings) { + DocumentationProvider = DocumentationProvider ?? CreateDefaultDocumentationProvider(), CancellationToken = CancellationToken }; syntaxTree = new SyntaxTree(); @@ -546,7 +558,10 @@ namespace ICSharpCode.Decompiler.CSharp throw new ArgumentNullException(nameof(definitions)); ITypeDefinition parentTypeDef = null; syntaxTree = new SyntaxTree(); - var decompileRun = new DecompileRun(settings) { CancellationToken = CancellationToken }; + var decompileRun = new DecompileRun(settings) { + DocumentationProvider = DocumentationProvider ?? CreateDefaultDocumentationProvider(), + CancellationToken = CancellationToken + }; foreach (var entity in definitions) { if (entity.IsNil) throw new ArgumentException("definitions contains null element"); diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/AddXmlDocumentationTransform.cs b/ICSharpCode.Decompiler/CSharp/Transforms/AddXmlDocumentationTransform.cs index 07a7b822a..490dcdc33 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/AddXmlDocumentationTransform.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/AddXmlDocumentationTransform.cs @@ -34,18 +34,16 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms { public void Run(AstNode rootNode, TransformContext context) { - if (!context.Settings.ShowXmlDocumentation) + if (!context.Settings.ShowXmlDocumentation || context.DecompileRun.DocumentationProvider == null) return; try { - var xmldoc = XmlDocLoader.LoadDocumentation(context.TypeSystem.ModuleDefinition); - if (xmldoc == null) - return; - foreach (var entity in rootNode.DescendantsAndSelf.OfType()) { - if (!(entity.GetSymbol() is IEntity symbolicEntity)) + var provider = context.DecompileRun.DocumentationProvider; + foreach (var entityDecl in rootNode.DescendantsAndSelf.OfType()) { + if (!(entityDecl.GetSymbol() is IEntity entity)) continue; - string doc = xmldoc.GetDocumentation(XmlDocKeyProvider.GetKey(symbolicEntity)); + string doc = provider.GetDocumentation(entity); if (doc != null) { - InsertXmlDocumentation(entity, new StringReader(doc)); + InsertXmlDocumentation(entityDecl, new StringReader(doc)); } } } catch (XmlException ex) { diff --git a/ICSharpCode.Decompiler/DecompileRun.cs b/ICSharpCode.Decompiler/DecompileRun.cs index 17edd43a1..59318d09c 100644 --- a/ICSharpCode.Decompiler/DecompileRun.cs +++ b/ICSharpCode.Decompiler/DecompileRun.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Text; using System.Threading; using ICSharpCode.Decompiler.CSharp.Syntax; +using ICSharpCode.Decompiler.Documentation; using ICSharpCode.Decompiler.TypeSystem; namespace ICSharpCode.Decompiler @@ -13,6 +14,7 @@ namespace ICSharpCode.Decompiler public HashSet Namespaces { get; private set; } = new HashSet(); public CancellationToken CancellationToken { get; set; } public DecompilerSettings Settings { get; } + public IDocumentationProvider DocumentationProvider { get; set; } Lazy usingScope => new Lazy(() => CreateUsingScope(Namespaces)); public CSharp.TypeSystem.UsingScope UsingScope => usingScope.Value; diff --git a/ICSharpCode.Decompiler/Documentation/XmlDocumentationProvider.cs b/ICSharpCode.Decompiler/Documentation/XmlDocumentationProvider.cs index f590fc6c5..22bb8446c 100644 --- a/ICSharpCode.Decompiler/Documentation/XmlDocumentationProvider.cs +++ b/ICSharpCode.Decompiler/Documentation/XmlDocumentationProvider.cs @@ -27,8 +27,16 @@ using ICSharpCode.Decompiler.TypeSystem; namespace ICSharpCode.Decompiler.Documentation { + /// + /// Provides XML documentation for type and member definitions in source code. + /// public interface IDocumentationProvider { + /// + /// Returns the XML documentation for the given . + /// May return null, if no documentation is present for the entity. + /// + /// is null. string GetDocumentation(IEntity entity); }