Skip to content

Commit c1172a2

Browse files
committed
Use already calculated NuGet matching
1 parent 9a0ecc8 commit c1172a2

File tree

4 files changed

+36
-43
lines changed

4 files changed

+36
-43
lines changed

src/ApiCompat/Microsoft.DotNet.ApiCompat.Shared/ValidatePackage.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ public static void Run(Func<ISuppressionEngine, ISuppressableLog> logFactory,
6969
enableStrictMode: enableStrictModeForBaselineValidation,
7070
enqueueApiCompatWorkItems: runApiCompat,
7171
executeApiCompatWorkItems: false,
72-
// Use the current package assembly references if baseline package assembly references aren't provided.
73-
baselinePackage: Package.Create(baselinePackagePath, baselinePackageAssemblyReferences ?? packageAssemblyReferences)));
72+
baselinePackage: Package.Create(baselinePackagePath, baselinePackageAssemblyReferences)));
7473
}
7574

7675
if (runApiCompat)

src/ApiCompat/Microsoft.DotNet.ApiCompatibility/Runner/ApiCompatRunner.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@ public void ExecuteWorkItems()
4646

4747
foreach (ApiCompatRunnerWorkItem workItem in _workItems)
4848
{
49-
IReadOnlyList<ElementContainer<IAssemblySymbol>> leftContainerList = CreateAssemblySymbols(workItem.Left, out bool resolvedExternallyProvidedAssemblyReferences);
49+
IReadOnlyList<ElementContainer<IAssemblySymbol>> leftContainerList = CreateAssemblySymbols(workItem.Left, workItem.Options, out bool resolvedExternallyProvidedAssemblyReferences);
5050
bool runWithReferences = resolvedExternallyProvidedAssemblyReferences;
5151

5252
List<IEnumerable<ElementContainer<IAssemblySymbol>>> rightContainersList = new(workItem.Right.Count);
5353
foreach (IReadOnlyList<MetadataInformation> right in workItem.Right)
5454
{
55-
IReadOnlyList<ElementContainer<IAssemblySymbol>> rightContainers = CreateAssemblySymbols(right.ToImmutableArray(), out resolvedExternallyProvidedAssemblyReferences);
55+
IReadOnlyList<ElementContainer<IAssemblySymbol>> rightContainers = CreateAssemblySymbols(right.ToImmutableArray(), workItem.Options, out resolvedExternallyProvidedAssemblyReferences);
5656
rightContainersList.Add(rightContainers);
5757
runWithReferences &= resolvedExternallyProvidedAssemblyReferences;
5858
}
@@ -112,6 +112,7 @@ public void ExecuteWorkItems()
112112
}
113113

114114
private IReadOnlyList<ElementContainer<IAssemblySymbol>> CreateAssemblySymbols(IReadOnlyList<MetadataInformation> metadataInformation,
115+
ApiCompatRunnerOptions options,
115116
out bool resolvedExternallyProvidedAssemblyReferences)
116117
{
117118
string[] aggregatedReferences = metadataInformation.Where(m => m.References != null).SelectMany(m => m.References!).Distinct().ToArray();

src/ApiCompat/Microsoft.DotNet.PackageValidation/ApiCompatRunnerExtensions.cs

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System.Collections.Generic;
5+
using System.Diagnostics;
56
using System.IO;
67
using Microsoft.DotNet.ApiCompatibility;
78
using Microsoft.DotNet.ApiCompatibility.Logging;
@@ -25,21 +26,15 @@ public static void QueueApiCompatFromContentItem(this IApiCompatRunner apiCompat
2526
Package leftPackage,
2627
Package? rightPackage = null)
2728
{
29+
Debug.Assert(leftContentItems.Count > 0);
30+
Debug.Assert(rightContentItems.Count > 0);
31+
2832
// Don't enqueue duplicate items (if no right package is supplied and items match)
29-
if (rightPackage == null && ContentItemCollectionEquals(leftContentItems, rightContentItems))
33+
if (rightPackage is null && ContentItemCollectionEquals(leftContentItems, rightContentItems))
3034
{
3135
return;
3236
}
3337

34-
MetadataInformation[] left = new MetadataInformation[leftContentItems.Count];
35-
for (int leftIndex = 0; leftIndex < leftContentItems.Count; leftIndex++)
36-
{
37-
left[leftIndex] = GetMetadataInformation(log,
38-
leftPackage,
39-
leftContentItems[leftIndex],
40-
options.IsBaselineComparison ? Resources.Baseline + " " + leftContentItems[leftIndex].Path : null);
41-
}
42-
4338
MetadataInformation[] right = new MetadataInformation[rightContentItems.Count];
4439
for (int rightIndex = 0; rightIndex < rightContentItems.Count; rightIndex++)
4540
{
@@ -48,30 +43,46 @@ public static void QueueApiCompatFromContentItem(this IApiCompatRunner apiCompat
4843
rightContentItems[rightIndex]);
4944
}
5045

46+
MetadataInformation[] left = new MetadataInformation[leftContentItems.Count];
47+
for (int leftIndex = 0; leftIndex < leftContentItems.Count; leftIndex++)
48+
{
49+
left[leftIndex] = GetMetadataInformation(log,
50+
leftPackage,
51+
leftContentItems[leftIndex],
52+
displayString: options.IsBaselineComparison ? Resources.Baseline + " " + leftContentItems[leftIndex].Path : null,
53+
// Use the assembly references from the right package if the left package doesn't provide them.
54+
assemblyReferences: rightPackage is not null ? right[right.Length > leftIndex ? leftIndex : 0].References : null);
55+
}
56+
5157
apiCompatRunner.EnqueueWorkItem(new ApiCompatRunnerWorkItem(left, options, right));
5258
}
5359

5460
private static MetadataInformation GetMetadataInformation(ISuppressableLog log,
5561
Package package,
5662
ContentItem item,
57-
string? displayString = null)
63+
string? displayString = null,
64+
IEnumerable<string>? assemblyReferences = null)
5865
{
5966
displayString ??= item.Path;
60-
string[]? assemblyReferences = null;
6167

6268
if (item.Properties.TryGetValue("tfm", out object? tfmObj))
6369
{
64-
// Find the nearest set of assembly references for the package item (assembly).
65-
NuGetFramework targetFramework = ((NuGetFramework)tfmObj);
66-
assemblyReferences = package.FindBestAssemblyReferencesForFramework(targetFramework);
70+
string targetFramework = ((NuGetFramework)tfmObj).GetShortFolderName();
6771

68-
if (package.AssemblyReferences != null && assemblyReferences is null)
72+
if (package.AssemblyReferences != null)
6973
{
70-
log.LogWarning(new Suppression(DiagnosticIds.SearchDirectoriesNotFoundForTfm) { Target = displayString },
71-
DiagnosticIds.SearchDirectoriesNotFoundForTfm,
72-
string.Format(Resources.MissingSearchDirectory,
73-
targetFramework.GetShortFolderName(),
74-
displayString));
74+
if (package.AssemblyReferences.TryGetValue(targetFramework, out string[]? assemblyReferencesRaw))
75+
{
76+
assemblyReferences = assemblyReferencesRaw;
77+
}
78+
else
79+
{
80+
log.LogWarning(new Suppression(DiagnosticIds.SearchDirectoriesNotFoundForTfm) { Target = displayString },
81+
DiagnosticIds.SearchDirectoriesNotFoundForTfm,
82+
string.Format(Resources.MissingSearchDirectory,
83+
targetFramework,
84+
displayString));
85+
}
7586
}
7687
}
7788

src/ApiCompat/Microsoft.DotNet.PackageValidation/Package.cs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -224,23 +224,5 @@ public static Package Create(string? packagePath, Dictionary<string, string[]>?
224224
new ReadOnlyCollection<ContentItem>(items) :
225225
null;
226226
}
227-
228-
/// <summary>
229-
/// Finds the best assembly references for a specific framework.
230-
/// </summary>
231-
/// <param name="framework">The framework where the package needs to be installed.</param>
232-
/// <returns>The assembly references for the specified framework.</returns>
233-
public string[]? FindBestAssemblyReferencesForFramework(NuGetFramework framework)
234-
{
235-
if (AssemblyReferences is null)
236-
return null;
237-
238-
string? nearestTfm = NuGetFrameworkUtility.GetNearest(AssemblyReferences.Keys, framework, (key) => NuGetFramework.ParseFolder(key));
239-
240-
if (nearestTfm is null || !AssemblyReferences.TryGetValue(nearestTfm, out string[]? assemblyReferences))
241-
return null;
242-
243-
return assemblyReferences;
244-
}
245227
}
246228
}

0 commit comments

Comments
 (0)