Skip to content

Commit 5fb8b28

Browse files
authored
Remove dead code from PackageSpecReferenceDependencyProvider, and use PackageSpec's TargetFrameworkInformation in GetReferenceNearestTargetFrameworkTask (#7065)
1 parent 1e80048 commit 5fb8b28

3 files changed

Lines changed: 61 additions & 97 deletions

File tree

src/NuGet.Core/NuGet.Build.Tasks/GetReferenceNearestTargetFrameworkTask.cs

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@
1010
using Microsoft.Build.Utilities;
1111
using NuGet.Common;
1212
using NuGet.Frameworks;
13-
14-
#if NETFRAMEWORK || NETSTANDARD
13+
#if NETFRAMEWORK
1514
using System.Linq;
1615
#endif
16+
using NuGet.ProjectModel;
1717

1818
namespace NuGet.Build.Tasks
1919
{
20-
public class GetReferenceNearestTargetFrameworkTask : Microsoft.Build.Utilities.Task
20+
public class GetReferenceNearestTargetFrameworkTask : Task
2121
{
2222
private const string NEAREST_TARGET_FRAMEWORK = "NearestTargetFramework";
2323
private const string TARGET_FRAMEWORKS = "TargetFrameworks";
@@ -41,6 +41,7 @@ public class GetReferenceNearestTargetFrameworkTask : Microsoft.Build.Utilities.
4141
/// </summary>
4242
public string CurrentProjectTargetPlatform { get; set; }
4343

44+
4445
/// <summary>
4546
/// Optional list of target frameworks to be used as Fallback target frameworks.
4647
/// </summary>
@@ -140,27 +141,32 @@ private ITaskItem AssignNearestFrameworkForSingleReference(
140141
var useTargetMonikers = referencedProjectTargetFrameworkMonikers.Length > 0;
141142
for (int i = 0; i < referencedProjectFrameworks.Length; i++)
142143
{
143-
144-
targetFrameworkInformations.Add(new TargetFrameworkInformation(
145-
referencedProjectFrameworks[i],
146-
useTargetMonikers ? referencedProjectTargetFrameworkMonikers[i] : null,
147-
useTargetMonikers ? referencedProjectTargetPlatformMonikers[i] : null));
144+
targetFrameworkInformations.Add(new TargetFrameworkInformation()
145+
{
146+
TargetAlias = referencedProjectFrameworks[i],
147+
FrameworkName = GetNuGetFramework(
148+
referencedProjectFrameworks[i],
149+
useTargetMonikers ? referencedProjectTargetFrameworkMonikers[i] : null,
150+
useTargetMonikers ? referencedProjectTargetPlatformMonikers[i] : null)
151+
});
148152
}
149153

150-
// try project framework
151-
var nearestNuGetFramework = NuGetFrameworkUtility.GetNearest(targetFrameworkInformations, projectNuGetFramework, GetNuGetFramework);
152-
if (nearestNuGetFramework != null)
154+
var packageSpec = new PackageSpec(targetFrameworkInformations);
155+
156+
var nearestNuGetFramework = packageSpec.GetTargetFramework(projectNuGetFramework);
157+
158+
if (nearestNuGetFramework.FrameworkName != null)
153159
{
154-
itemWithProperties.SetMetadata(NEAREST_TARGET_FRAMEWORK, nearestNuGetFramework._targetFrameworkAlias);
160+
itemWithProperties.SetMetadata(NEAREST_TARGET_FRAMEWORK, nearestNuGetFramework.TargetAlias);
155161
return itemWithProperties;
156162
}
157163

158164
// try project fallback frameworks
159165
foreach (var currentProjectTargetFramework in fallbackNuGetFrameworks)
160166
{
161-
nearestNuGetFramework = NuGetFrameworkUtility.GetNearest(targetFrameworkInformations, currentProjectTargetFramework, GetNuGetFramework);
167+
nearestNuGetFramework = packageSpec.GetTargetFramework(currentProjectTargetFramework);
162168

163-
if (nearestNuGetFramework != null)
169+
if (nearestNuGetFramework.FrameworkName != null)
164170
{
165171
var message = string.Format(CultureInfo.CurrentCulture,
166172
Strings.ImportsFallbackWarning,
@@ -175,7 +181,7 @@ private ITaskItem AssignNearestFrameworkForSingleReference(
175181
// log NU1702 for ATF on project reference
176182
logger.Log(warning);
177183

178-
itemWithProperties.SetMetadata(NEAREST_TARGET_FRAMEWORK, nearestNuGetFramework._targetFrameworkAlias);
184+
itemWithProperties.SetMetadata(NEAREST_TARGET_FRAMEWORK, nearestNuGetFramework.TargetAlias);
179185
return itemWithProperties;
180186
}
181187
}
@@ -222,34 +228,19 @@ private static bool TryParseFramework(string targetFrameworkMoniker, string targ
222228
return true;
223229
}
224230

225-
private static NuGetFramework GetNuGetFramework(TargetFrameworkInformation targetFrameworkInformation)
231+
private static NuGetFramework GetNuGetFramework(string targetAlias, string targetFrameworkMoniker, string targetPlatformMoniker)
226232
{
227233
// Legacy path, process targetFrameworks if empty
228-
if (string.IsNullOrEmpty(targetFrameworkInformation._targetFrameworkMoniker))
234+
if (string.IsNullOrEmpty(targetFrameworkMoniker))
229235
{
230-
return NuGetFramework.Parse(targetFrameworkInformation._targetFrameworkAlias);
236+
return NuGetFramework.Parse(targetAlias);
231237
}
232238

233239
// TargetFrameworkMoniker is always expected to be set. TargetPlatformMoniker will have a `None` value when empty, for frameworks like net5.0.
234-
return NuGetFramework.ParseComponents(targetFrameworkInformation._targetFrameworkMoniker,
235-
targetFrameworkInformation._targetPlatformMoniker.Equals("None", StringComparison.OrdinalIgnoreCase) ?
240+
return NuGetFramework.ParseComponents(targetFrameworkMoniker,
241+
targetPlatformMoniker.Equals("None", StringComparison.OrdinalIgnoreCase) ?
236242
string.Empty :
237-
targetFrameworkInformation._targetPlatformMoniker);
238-
}
239-
240-
private class TargetFrameworkInformation
241-
{
242-
internal readonly string _targetFrameworkAlias;
243-
internal readonly string _targetFrameworkMoniker;
244-
internal readonly string _targetPlatformMoniker;
245-
246-
public TargetFrameworkInformation(string targetFrameworkAlias, string targetFrameworkMoniker, string targetPlatformMoniker)
247-
{
248-
_targetFrameworkAlias = targetFrameworkAlias;
249-
_targetFrameworkMoniker = targetFrameworkMoniker;
250-
_targetPlatformMoniker = targetPlatformMoniker;
251-
}
243+
targetPlatformMoniker);
252244
}
253245
}
254-
255246
}

src/NuGet.Core/NuGet.ProjectModel/GlobalSuppressions.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'void PackagesLockFileFormat.Write(TextWriter textWriter, PackagesLockFile lockFile)', validate parameter 'lockFile' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.ProjectModel.PackagesLockFileFormat.Write(System.IO.TextWriter,NuGet.ProjectModel.PackagesLockFile)")]
2222
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'string PackagesLockFileUtilities.GetNuGetLockFilePath(PackageSpec project)', validate parameter 'project' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.ProjectModel.PackagesLockFileUtilities.GetNuGetLockFilePath(NuGet.ProjectModel.PackageSpec)~System.String")]
2323
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'TargetFrameworkInformation PackageSpecExtensions.GetTargetFramework(PackageSpec project, NuGetFramework targetFramework)', validate parameter 'project' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.ProjectModel.PackageSpecExtensions.GetTargetFramework(NuGet.ProjectModel.PackageSpec,NuGet.Frameworks.NuGetFramework)~NuGet.ProjectModel.TargetFrameworkInformation")]
24-
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'Library PackageSpecReferenceDependencyProvider.GetLibrary(LibraryRange libraryRange, NuGetFramework targetFramework)', validate parameter 'libraryRange' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.ProjectModel.PackageSpecReferenceDependencyProvider.GetLibrary(NuGet.LibraryModel.LibraryRange,NuGet.Frameworks.NuGetFramework)~NuGet.LibraryModel.Library")]
2524
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'NuGetVersion PackageSpecUtility.SpecifySnapshot(string version, string snapshotValue)', validate parameter 'version' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.ProjectModel.PackageSpecUtility.SpecifySnapshot(System.String,System.String)~NuGet.Versioning.NuGetVersion")]
2625
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'int LockFileDependencyComparerWithoutContentHash.GetHashCode(LockFileDependency obj)', validate parameter 'obj' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.ProjectModel.ProjectLockFile.LockFileDependencyComparerWithoutContentHash.GetHashCode(NuGet.ProjectModel.LockFileDependency)~System.Int32")]
2726
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'void ProjectRestoreMetadata.FillClone(ProjectRestoreMetadata clone)', validate parameter 'clone' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.ProjectModel.ProjectRestoreMetadata.FillClone(NuGet.ProjectModel.ProjectRestoreMetadata)")]
@@ -70,6 +69,5 @@
7069
[assembly: SuppressMessage("Usage", "CA2227:Collection properties should be read only", Justification = "<Pending>", Scope = "member", Target = "~P:NuGet.ProjectModel.LockFile.CentralTransitiveDependencyGroups")]
7170
[assembly: SuppressMessage("Usage", "CA2227:Collection properties should be read only", Justification = "IReadOnlySet<T> is only available in .NET 5+, so we need to use a HashSet<T> here.", Scope = "member", Target = "~P:NuGet.ProjectModel.RestoreAuditProperties.SuppressedAdvisories")]
7271
[assembly: SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.ProjectModel.LockFileFormat.Utf8JsonRead(System.IO.Stream,NuGet.Common.ILogger,System.String,NuGet.ProjectModel.LockFileReadFlags)~NuGet.ProjectModel.LockFile")]
73-
[assembly: SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.ProjectModel.PackageSpecReferenceDependencyProvider.AddLibraryProperties(NuGet.LibraryModel.Library,NuGet.ProjectModel.PackageSpec,NuGet.Frameworks.NuGetFramework)")]
7472
[assembly: SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.ProjectModel.ProjectRestoreMetadata.GetSources(System.Collections.Generic.IList{NuGet.Configuration.PackageSource})~System.Collections.Generic.HashSet{System.String}")]
7573
[assembly: SuppressMessage("Style", "IDE0051:Remove unused private members", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.ProjectModel.AssetsLogMessage.#ctor(NuGet.Common.LogLevel,NuGet.Common.NuGetLogCode,System.String,System.String,System.String,System.String,System.Collections.Generic.IReadOnlyList{System.String},System.Int32,System.Int32,System.Int32,System.Int32)")]

src/NuGet.Core/NuGet.ProjectModel/PackageSpecReferenceDependencyProvider.cs

Lines changed: 34 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,13 @@ public bool SupportsType(LibraryDependencyTarget libraryType)
9696

9797
public Library GetLibrary(LibraryRange libraryRange, NuGetFramework targetFramework)
9898
{
99-
var name = libraryRange.Name;
99+
if (libraryRange == null) throw new ArgumentNullException(nameof(libraryRange));
100+
if (targetFramework == null) throw new ArgumentNullException(nameof(targetFramework));
100101

101102
PackageSpec packageSpec = null;
102103

103104
// This must exist in the external references
104-
if (_externalProjectsByUniqueName.TryGetValue(name, out ExternalProjectReference externalReference))
105+
if (_externalProjectsByUniqueName.TryGetValue(libraryRange.Name, out ExternalProjectReference externalReference))
105106
{
106107
packageSpec = externalReference.PackageSpec;
107108
}
@@ -116,30 +117,17 @@ public Library GetLibrary(LibraryRange libraryRange, NuGetFramework targetFramew
116117

117118
var projectStyle = packageSpec?.RestoreMetadata?.ProjectStyle ?? ProjectStyle.Unknown;
118119

119-
// Read references from external project
120-
if (projectStyle == ProjectStyle.PackageReference)
120+
if (projectStyle == ProjectStyle.PackageReference ||
121+
projectStyle == ProjectStyle.DotnetCliTool)
121122
{
122-
// NETCore
123123
dependencies = GetDependenciesFromSpecRestoreMetadata(packageSpec, targetFramework);
124124
}
125125
else
126126
{
127-
// UWP
128-
dependencies = GetDependenciesFromExternalReference(externalReference, packageSpec, targetFramework);
127+
dependencies = GetDependenciesFromExternalReference(externalReference);
129128
}
130129

131-
// Remove duplicate dependencies. A reference can exist both in csproj and project.json
132-
// dependencies is already ordered by importance here
133-
var uniqueDependencies = new List<LibraryDependency>(dependencies.Count);
134-
var projectNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
135-
136-
foreach (var project in dependencies)
137-
{
138-
if (projectNames.Add(project.Name))
139-
{
140-
uniqueDependencies.Add(project);
141-
}
142-
}
130+
List<LibraryDependency> uniqueDependencies = DeduplicateDependencies(dependencies);
143131

144132
Library library = new Library
145133
{
@@ -169,9 +157,31 @@ public Library GetLibrary(LibraryRange libraryRange, NuGetFramework targetFramew
169157
}
170158

171159
return library;
160+
161+
static List<LibraryDependency> DeduplicateDependencies(List<LibraryDependency> dependencies)
162+
{
163+
if (dependencies.Count == 0)
164+
{
165+
return dependencies;
166+
}
167+
// Remove duplicate dependencies.
168+
// dependencies is already ordered by importance here
169+
var uniqueDependencies = new List<LibraryDependency>(dependencies.Count);
170+
var projectNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
171+
172+
foreach (var project in dependencies)
173+
{
174+
if (projectNames.Add(project.Name))
175+
{
176+
uniqueDependencies.Add(project);
177+
}
178+
}
179+
180+
return uniqueDependencies;
181+
}
172182
}
173183

174-
private void AddLibraryProperties(Library library, PackageSpec packageSpec, NuGetFramework targetFramework)
184+
private static void AddLibraryProperties(Library library, PackageSpec packageSpec, NuGetFramework targetFramework)
175185
{
176186
var projectStyle = packageSpec.RestoreMetadata?.ProjectStyle ?? ProjectStyle.Unknown;
177187

@@ -287,16 +297,8 @@ private List<LibraryDependency> GetDependenciesFromSpecRestoreMetadata(PackageSp
287297
return dependencies;
288298
}
289299

290-
/// <summary>
291-
/// UWP Project.json
292-
/// </summary>
293-
private List<LibraryDependency> GetDependenciesFromExternalReference(
294-
ExternalProjectReference externalReference,
295-
PackageSpec packageSpec,
296-
NuGetFramework targetFramework)
300+
private List<LibraryDependency> GetDependenciesFromExternalReference(ExternalProjectReference externalReference)
297301
{
298-
var dependencies = GetSpecDependencies(packageSpec, targetFramework);
299-
300302
if (externalReference != null)
301303
{
302304
var childReferences = GetChildReferences(externalReference);
@@ -308,27 +310,7 @@ private List<LibraryDependency> GetDependenciesFromExternalReference(
308310
childReferenceNames,
309311
StringComparer.OrdinalIgnoreCase);
310312

311-
// Set all dependencies from project.json to external if an external match was passed in
312-
// This is viral and keeps p2ps from looking into directories when we are going down
313-
// a path already resolved by msbuild.
314-
for (int i = 0; i < dependencies.Count; i++)
315-
{
316-
var d = dependencies[i];
317-
if (IsProject(d) && filteredExternalDependencies.Contains(d.Name))
318-
{
319-
var libraryRange = new LibraryRange(d.LibraryRange) { TypeConstraint = LibraryDependencyTarget.ExternalProject };
320-
321-
// Do not push the dependency changes here upwards, as the original package
322-
// spec should not be modified.
323-
dependencies[i] = new LibraryDependency(d) { LibraryRange = libraryRange };
324-
}
325-
}
326-
327-
// Add dependencies passed in externally
328-
// These are usually msbuild references which have less metadata, they have
329-
// the lowest priority.
330-
// Note: Only add in dependencies that are in the filtered list to avoid getting the wrong TxM
331-
dependencies.AddRange(childReferences
313+
return [.. childReferences
332314
.Where(reference => filteredExternalDependencies.Contains(reference.ProjectName))
333315
.Select(reference => new LibraryDependency()
334316
{
@@ -338,10 +320,10 @@ private List<LibraryDependency> GetDependenciesFromExternalReference(
338320
VersionRange = VersionRange.Parse("1.0.0"),
339321
TypeConstraint = LibraryDependencyTarget.ExternalProject
340322
}
341-
}));
323+
})];
342324
}
343325

344-
return dependencies;
326+
return [];
345327
}
346328

347329
internal List<LibraryDependency> GetSpecDependencies(
@@ -415,13 +397,6 @@ static bool IsDependencyPruned(LibraryDependency dependency, IReadOnlyDictionary
415397
}
416398
}
417399

418-
private bool IsProject(LibraryDependency dependency)
419-
{
420-
var type = dependency.LibraryRange.TypeConstraint;
421-
422-
return SupportsType(type);
423-
}
424-
425400
private List<ExternalProjectReference> GetChildReferences(ExternalProjectReference parent)
426401
{
427402
var children = new List<ExternalProjectReference>(parent.ExternalProjectReferences.Count);

0 commit comments

Comments
 (0)