From 4b9f8003c6a4db50ee47a2ec98c4fc7734e27a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herrmannsd=C3=B6rfer=2C=20Felix?= Date: Thu, 2 Jan 2025 16:31:04 +0100 Subject: [PATCH 1/3] Use provided references for search for dependencies in AssemblyCompilation + small code duplication cleanup --- src/Docfx.Dotnet/CompilationHelper.cs | 35 +++++++++++++++----- src/Docfx.Dotnet/DotnetApiCatalog.Compile.cs | 6 +--- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/Docfx.Dotnet/CompilationHelper.cs b/src/Docfx.Dotnet/CompilationHelper.cs index a8af3d50dd3..b6e00a04908 100644 --- a/src/Docfx.Dotnet/CompilationHelper.cs +++ b/src/Docfx.Dotnet/CompilationHelper.cs @@ -115,7 +115,7 @@ public static (Compilation, IAssemblySymbol) CreateCompilationFromAssembly(strin : MetadataImportOptions.Public ), syntaxTrees: s_assemblyBootstrap, - references: GetReferenceAssemblies(assemblyPath) + references: GetReferenceAssemblies(assemblyPath, references) .Select(CreateMetadataReference) .Concat(references ?? []) .Append(metadataReference)); @@ -164,11 +164,12 @@ private static IEnumerable GetDefaultMetadataReferences(strin } } - private static IEnumerable GetReferenceAssemblies(string assemblyPath) + private static IEnumerable GetReferenceAssemblies(string assemblyPath, MetadataReference[] references) { using var assembly = new PEFile(assemblyPath); var assemblyResolver = new UniversalAssemblyResolver(assemblyPath, false, assembly.DetectTargetFrameworkId()); var result = new Dictionary(); + Dictionary? referenceFiles = default; GetReferenceAssembliesCore(assembly); @@ -179,20 +180,36 @@ void GetReferenceAssembliesCore(PEFile assembly) var file = assemblyResolver.FindAssemblyFile(reference); if (file is null) { - // Skip warning for some weired assembly references: https://github.com/dotnet/docfx/issues/9459 - if (reference.Version?.ToString() != "0.0.0.0") + if(referenceFiles == null) { - Logger.LogWarning($"Unable to resolve assembly reference {reference}", code: "InvalidAssemblyReference"); + referenceFiles = new(); + foreach (var referenceFile in references.OfType()) + { + var name = Path.GetFileNameWithoutExtension(referenceFile.FilePath); + if (!string.IsNullOrEmpty(name) + && !referenceFiles.TryAdd(name, referenceFile.FilePath!)) + { + Logger.LogWarning($"Duplicate reference files for '{name}'."); + } + } } + if(!referenceFiles.TryGetValue(reference.Name, out file)) + { + // Skip warning for some weired assembly references: https://github.com/dotnet/docfx/issues/9459 + if (reference.Version?.ToString() != "0.0.0.0") + { + Logger.LogWarning($"Unable to resolve assembly reference {reference}", code: "InvalidAssemblyReference"); + } - continue; + continue; + } } Logger.LogVerbose($"Loaded {reference.Name} from {file}"); - using var referenceAssembly = new PEFile(file); - if (result.TryAdd(referenceAssembly.Name, file)) + if (result.TryAdd(reference.Name, file)) { + using var referenceAssembly = new PEFile(file); GetReferenceAssembliesCore(referenceAssembly); } } @@ -201,7 +218,7 @@ void GetReferenceAssembliesCore(PEFile assembly) return result.Values; } - private static MetadataReference CreateMetadataReference(string assemblyPath) + internal static MetadataReference CreateMetadataReference(string assemblyPath) { var documentation = XmlDocumentationProvider.CreateFromFile(Path.ChangeExtension(assemblyPath, ".xml")); return MetadataReference.CreateFromFile(assemblyPath, documentation: documentation); diff --git a/src/Docfx.Dotnet/DotnetApiCatalog.Compile.cs b/src/Docfx.Dotnet/DotnetApiCatalog.Compile.cs index e94c3a1a01a..63265ae8007 100644 --- a/src/Docfx.Dotnet/DotnetApiCatalog.Compile.cs +++ b/src/Docfx.Dotnet/DotnetApiCatalog.Compile.cs @@ -86,11 +86,7 @@ await LoadCompilationFromProject(project.AbsolutePath) is { } compilation) } var references = config.References ?? []; - var metadataReferences = references.Select(assemblyPath => - { - var documentation = XmlDocumentationProvider.CreateFromFile(Path.ChangeExtension(assemblyPath, ".xml")); - return MetadataReference.CreateFromFile(assemblyPath, documentation: documentation); - }).ToArray(); + var metadataReferences = references.Select(CompilationHelper.CreateMetadataReference).ToArray(); // LoadCompilationFrom C# source files if (files.TryGetValue(FileType.CSSourceCode, out var csFiles)) From 7e94ee7bbea406c352308551fab22c6da296b873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herrmannsd=C3=B6rfer=2C=20Felix?= Date: Thu, 2 Jan 2025 16:44:15 +0100 Subject: [PATCH 2/3] Added code to warning --- src/Docfx.Dotnet/CompilationHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Docfx.Dotnet/CompilationHelper.cs b/src/Docfx.Dotnet/CompilationHelper.cs index b6e00a04908..fc17a426a13 100644 --- a/src/Docfx.Dotnet/CompilationHelper.cs +++ b/src/Docfx.Dotnet/CompilationHelper.cs @@ -189,7 +189,7 @@ void GetReferenceAssembliesCore(PEFile assembly) if (!string.IsNullOrEmpty(name) && !referenceFiles.TryAdd(name, referenceFile.FilePath!)) { - Logger.LogWarning($"Duplicate reference files for '{name}'."); + Logger.LogWarning($"Duplicate reference files for '{name}'.", code: "InvalidAssemblyReference"); } } } From 2ca591333801b079cfccb225cef89d32e8be51ef Mon Sep 17 00:00:00 2001 From: Herrmel <36636591+Herrmel@users.noreply.github.com> Date: Mon, 27 Jan 2025 09:56:38 +0000 Subject: [PATCH 3/3] Fixes whitespace --- src/Docfx.Dotnet/CompilationHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Docfx.Dotnet/CompilationHelper.cs b/src/Docfx.Dotnet/CompilationHelper.cs index fc17a426a13..69d3463828f 100644 --- a/src/Docfx.Dotnet/CompilationHelper.cs +++ b/src/Docfx.Dotnet/CompilationHelper.cs @@ -180,7 +180,7 @@ void GetReferenceAssembliesCore(PEFile assembly) var file = assemblyResolver.FindAssemblyFile(reference); if (file is null) { - if(referenceFiles == null) + if (referenceFiles == null) { referenceFiles = new(); foreach (var referenceFile in references.OfType()) @@ -193,7 +193,7 @@ void GetReferenceAssembliesCore(PEFile assembly) } } } - if(!referenceFiles.TryGetValue(reference.Name, out file)) + if (!referenceFiles.TryGetValue(reference.Name, out file)) { // Skip warning for some weired assembly references: https://github.com/dotnet/docfx/issues/9459 if (reference.Version?.ToString() != "0.0.0.0")