Skip to content

Commit 7d095d6

Browse files
Herrmelyufeih
andauthored
fix: Use provided references for search of dependencies in AssemblyCompilations (#10491)
* Use provided references for search for dependencies in AssemblyCompilation + small code duplication cleanup * Added code to warning * Fixes whitespace --------- Co-authored-by: Yufei Huang <[email protected]>
1 parent 467f441 commit 7d095d6

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed

src/Docfx.Dotnet/CompilationHelper.cs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public static (Compilation, IAssemblySymbol) CreateCompilationFromAssembly(strin
115115
: MetadataImportOptions.Public
116116
),
117117
syntaxTrees: s_assemblyBootstrap,
118-
references: GetReferenceAssemblies(assemblyPath)
118+
references: GetReferenceAssemblies(assemblyPath, references)
119119
.Select(CreateMetadataReference)
120120
.Concat(references ?? [])
121121
.Append(metadataReference));
@@ -164,11 +164,12 @@ private static IEnumerable<MetadataReference> GetDefaultMetadataReferences(strin
164164
}
165165
}
166166

167-
private static IEnumerable<string> GetReferenceAssemblies(string assemblyPath)
167+
private static IEnumerable<string> GetReferenceAssemblies(string assemblyPath, MetadataReference[] references)
168168
{
169169
using var assembly = new PEFile(assemblyPath);
170170
var assemblyResolver = new UniversalAssemblyResolver(assemblyPath, false, assembly.DetectTargetFrameworkId());
171171
var result = new Dictionary<string, string>();
172+
Dictionary<string, string>? referenceFiles = default;
172173

173174
GetReferenceAssembliesCore(assembly);
174175

@@ -179,20 +180,36 @@ void GetReferenceAssembliesCore(PEFile assembly)
179180
var file = assemblyResolver.FindAssemblyFile(reference);
180181
if (file is null)
181182
{
182-
// Skip warning for some weired assembly references: https://github.com/dotnet/docfx/issues/9459
183-
if (reference.Version?.ToString() != "0.0.0.0")
183+
if (referenceFiles == null)
184184
{
185-
Logger.LogWarning($"Unable to resolve assembly reference {reference}", code: "InvalidAssemblyReference");
185+
referenceFiles = new();
186+
foreach (var referenceFile in references.OfType<PortableExecutableReference>())
187+
{
188+
var name = Path.GetFileNameWithoutExtension(referenceFile.FilePath);
189+
if (!string.IsNullOrEmpty(name)
190+
&& !referenceFiles.TryAdd(name, referenceFile.FilePath!))
191+
{
192+
Logger.LogWarning($"Duplicate reference files for '{name}'.", code: "InvalidAssemblyReference");
193+
}
194+
}
186195
}
196+
if (!referenceFiles.TryGetValue(reference.Name, out file))
197+
{
198+
// Skip warning for some weired assembly references: https://github.com/dotnet/docfx/issues/9459
199+
if (reference.Version?.ToString() != "0.0.0.0")
200+
{
201+
Logger.LogWarning($"Unable to resolve assembly reference {reference}", code: "InvalidAssemblyReference");
202+
}
187203

188-
continue;
204+
continue;
205+
}
189206
}
190207

191208
Logger.LogVerbose($"Loaded {reference.Name} from {file}");
192209

193-
using var referenceAssembly = new PEFile(file);
194-
if (result.TryAdd(referenceAssembly.Name, file))
210+
if (result.TryAdd(reference.Name, file))
195211
{
212+
using var referenceAssembly = new PEFile(file);
196213
GetReferenceAssembliesCore(referenceAssembly);
197214
}
198215
}
@@ -201,7 +218,7 @@ void GetReferenceAssembliesCore(PEFile assembly)
201218
return result.Values;
202219
}
203220

204-
private static MetadataReference CreateMetadataReference(string assemblyPath)
221+
internal static MetadataReference CreateMetadataReference(string assemblyPath)
205222
{
206223
var documentation = XmlDocumentationProvider.CreateFromFile(Path.ChangeExtension(assemblyPath, ".xml"));
207224
return MetadataReference.CreateFromFile(assemblyPath, documentation: documentation);

src/Docfx.Dotnet/DotnetApiCatalog.Compile.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,7 @@ await LoadCompilationFromProject(project.AbsolutePath) is { } compilation)
8686
}
8787

8888
var references = config.References ?? [];
89-
var metadataReferences = references.Select(assemblyPath =>
90-
{
91-
var documentation = XmlDocumentationProvider.CreateFromFile(Path.ChangeExtension(assemblyPath, ".xml"));
92-
return MetadataReference.CreateFromFile(assemblyPath, documentation: documentation);
93-
}).ToArray();
89+
var metadataReferences = references.Select(CompilationHelper.CreateMetadataReference).ToArray();
9490

9591
// LoadCompilationFrom C# source files
9692
if (files.TryGetValue(FileType.CSSourceCode, out var csFiles))

0 commit comments

Comments
 (0)