Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Attempt to move several data structures to be immutable #5930

Merged
merged 6 commits into from
Oct 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
<PackageVersion Include="NuGetValidator" version="2.1.1" />
<PackageVersion Include="SharpZipLib" Version="1.4.2" />
<PackageVersion Include="System.Collections" Version="$(SystemPackagesVersion)" />
<PackageVersion Include="System.Collections.Immutable" Version="8.0.0" />
<PackageVersion Include="System.CommandLine" Version="$(SystemCommandLineVersion)" />
<PackageVersion Include="System.ComponentModel.Composition" Version="$(SystemComponentModelCompositionPackageVersion)" />
<PackageVersion Include="System.Formats.Asn1" Version="$(SystemFormatsAsn1PackageVersion)" />
Expand Down Expand Up @@ -190,6 +191,7 @@
<_allowBuildFromSourcePackage Include="Microsoft.Extensions.FileSystemGlobbing" />
<_allowBuildFromSourcePackage Include="Microsoft.Web.Xdt" />
<_allowBuildFromSourcePackage Include="Newtonsoft.Json" />
<_allowBuildFromSourcePackage Include="System.Collections.Immutable" />
zivkan marked this conversation as resolved.
Show resolved Hide resolved
<_allowBuildFromSourcePackage Include="System.CommandLine" />
<_allowBuildFromSourcePackage Include="System.ComponentModel.Composition" />
<_allowBuildFromSourcePackage Include="System.Formats.Asn1" />
Expand Down
4 changes: 0 additions & 4 deletions build/Shared/IsExternalInit.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

#if !NET5_0_OR_GREATER

using System.Diagnostics;

namespace System.Runtime.CompilerServices;
Expand All @@ -13,5 +11,3 @@ namespace System.Runtime.CompilerServices;
internal static class IsExternalInit
{
}

#endif
40 changes: 40 additions & 0 deletions build/Shared/SharedExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,5 +125,45 @@ public static void AppendInt(this StringBuilder sb, int value)
divisor /= 10;
}
}

public static int SingleIndex<T>(this IList<T> lst, Predicate<T> isMatch)
{
var foundIndex = -1;

for (var index = 0; index < lst.Count; index++)
{
var item = lst[index];
if (isMatch(item))
{
if (foundIndex != -1)
{
throw new InvalidOperationException();
}

foundIndex = index;
}
}

if (foundIndex == -1)
{
throw new InvalidOperationException();
}

return foundIndex;
}

public static int FirstIndex<T>(this IList<T> lst, Predicate<T> isMatch)
{
for (var index = 0; index < lst.Count; index++)
{
var item = lst[index];
if (isMatch(item))
{
return index;
}
}

throw new InvalidOperationException();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<MergeInclude Include="$(OutputPath)NuGet.Versioning.dll"/>
<MergeInclude Include="$(OutputPath)NuGet.Core.dll"/>
<MergeInclude Include="$(OutputPath)NuGet.MSSigning.Extensions.dll"/>
<MergeInclude Include="$(OutputPath)System.Collections.Immutable.dll"/>
<MergeInclude Include="$(OutputPath)System.Memory.dll"/>
<MergeInclude Include="$(OutputPath)System.Numerics.Vectors.dll"/>
<MergeInclude Include="$(OutputPath)System.Runtime.CompilerServices.Unsafe.dll"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
Expand Down Expand Up @@ -204,9 +205,14 @@ private static string GetReferenceMetadataValue(ProjectReference reference, stri
private static LibraryDependency ToPackageLibraryDependency(PackageReference reference, bool isCpvmEnabled)
{
// Get warning suppressions
IList<NuGetLogCode> noWarn = MSBuildStringUtility.GetNuGetLogCodes(GetReferenceMetadataValue(reference, ProjectItemProperties.NoWarn));
ImmutableArray<NuGetLogCode> noWarn = MSBuildStringUtility.GetNuGetLogCodes(GetReferenceMetadataValue(reference, ProjectItemProperties.NoWarn));

var dependency = new LibraryDependency(noWarn)
(var includeType, var suppressParent) = MSBuildRestoreUtility.GetLibraryDependencyIncludeFlags(
GetReferenceMetadataValue(reference, ProjectItemProperties.IncludeAssets),
GetReferenceMetadataValue(reference, ProjectItemProperties.ExcludeAssets),
GetReferenceMetadataValue(reference, ProjectItemProperties.PrivateAssets));

var dependency = new LibraryDependency()
{
AutoReferenced = MSBuildStringUtility.IsTrue(GetReferenceMetadataValue(reference, ProjectItemProperties.IsImplicitlyDefined)),
GeneratePathProperty = MSBuildStringUtility.IsTrue(GetReferenceMetadataValue(reference, ProjectItemProperties.GeneratePathProperty)),
Expand All @@ -216,14 +222,11 @@ private static LibraryDependency ToPackageLibraryDependency(PackageReference ref
name: reference.Name,
versionRange: ToVersionRange(reference.Version, isCpvmEnabled),
typeConstraint: LibraryDependencyTarget.Package),
NoWarn = noWarn,
IncludeType = includeType,
SuppressParent = suppressParent,
};

MSBuildRestoreUtility.ApplyIncludeFlags(
dependency,
GetReferenceMetadataValue(reference, ProjectItemProperties.IncludeAssets),
GetReferenceMetadataValue(reference, ProjectItemProperties.ExcludeAssets),
GetReferenceMetadataValue(reference, ProjectItemProperties.PrivateAssets));

return dependency;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@

using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using Microsoft;
Expand Down Expand Up @@ -128,7 +130,7 @@ protected override async Task<string> GetAssetsFilePathAsync(bool shouldThrow)
return (new[] { packageSpec }, null);
}

private Dictionary<string, CentralPackageVersion> GetCentralPackageVersions()
private IReadOnlyDictionary<string, CentralPackageVersion> GetCentralPackageVersions()
{
ThreadHelper.ThrowIfNotOnUIThread();

Expand All @@ -142,7 +144,6 @@ private Dictionary<string, CentralPackageVersion> GetCentralPackageVersions()
.ToDictionary(cpv => cpv.Name);
}


private CentralPackageVersion ToCentralPackageVersion(string packageId, string version)
{
if (string.IsNullOrEmpty(packageId))
Expand Down Expand Up @@ -220,7 +221,7 @@ public override async Task<bool> InstallPackageAsync(
BuildIntegratedInstallationContext __,
CancellationToken token)
{
var dependency = new LibraryDependency(noWarn: Array.Empty<NuGetLogCode>())
var dependency = new LibraryDependency()
{
LibraryRange = new LibraryRange(
name: packageId,
Expand Down Expand Up @@ -423,38 +424,44 @@ private async Task<PackageSpec> GetPackageSpecAsync(ISettings settings)
var packageReferences = (await ProjectServices
.ReferencesReader
.GetPackageReferencesAsync(targetFramework, CancellationToken.None))
.ToList();
.ToImmutableArray();

#pragma warning disable CS0618 // Type or member is obsolete
// Need to validate no project systems get this property via DTE, and if so, switch to GetPropertyValue
var packageTargetFallback = MSBuildStringUtility.Split(GetPropertySafe(_vsProjectAdapter.BuildProperties, ProjectBuildProperties.PackageTargetFallback))
.Select(NuGetFramework.Parse)
.ToList();

var assetTargetFallback = MSBuildStringUtility.Split(GetPropertySafe(_vsProjectAdapter.BuildProperties, ProjectBuildProperties.AssetTargetFallback))
var assetTargetFallbackList = MSBuildStringUtility.Split(GetPropertySafe(_vsProjectAdapter.BuildProperties, ProjectBuildProperties.AssetTargetFallback))
.Select(NuGetFramework.Parse)
.ToList();
#pragma warning restore CS0618 // Type or member is obsolete

var projectTfi = new TargetFrameworkInformation
{
FrameworkName = targetFramework,
Dependencies = packageReferences,
};

#pragma warning disable CS0618 // Type or member is obsolete
// Need to validate no project systems get this property via DTE, and if so, switch to GetPropertyValue
bool isCpvmEnabled = MSBuildStringUtility.IsTrue(GetPropertySafe(_vsProjectAdapter.BuildProperties, ProjectBuildProperties.ManagePackageVersionsCentrally));
#pragma warning restore CS0618 // Type or member is obsolete

IReadOnlyDictionary<string, CentralPackageVersion> centralPackageVersions = null;
if (isCpvmEnabled)
{
// Add the central version information and merge the information to the package reference dependencies
projectTfi.CentralPackageVersions.AddRange(GetCentralPackageVersions());
LibraryDependency.ApplyCentralVersionInformation(projectTfi.Dependencies, projectTfi.CentralPackageVersions);
centralPackageVersions = GetCentralPackageVersions();
packageReferences = ApplyCentralVersionInformation(packageReferences, centralPackageVersions);
}

// Apply fallback settings
AssetTargetFallbackUtility.ApplyFramework(projectTfi, packageTargetFallback, assetTargetFallback);
// Get fallback settings
(targetFramework, var imports, var assetTargetFallback, var warn) = AssetTargetFallbackUtility.GetFallbackFrameworkInformation(targetFramework, packageTargetFallback, assetTargetFallbackList);

var projectTfi = new TargetFrameworkInformation
{
AssetTargetFallback = assetTargetFallback,
CentralPackageVersions = centralPackageVersions,
Dependencies = packageReferences,
Imports = imports,
FrameworkName = targetFramework,
Warn = warn,
};

// Build up runtime information.

Expand Down Expand Up @@ -564,6 +571,57 @@ private async Task<PackageSpec> GetPackageSpecAsync(ISettings settings)
};
}

internal static ImmutableArray<LibraryDependency> ApplyCentralVersionInformation(ImmutableArray<LibraryDependency> packageReferences, IReadOnlyDictionary<string, CentralPackageVersion> centralPackageVersions)
{
if (packageReferences.IsDefault)
{
throw new ArgumentNullException(nameof(packageReferences));
}
if (centralPackageVersions == null)
{
throw new ArgumentNullException(nameof(centralPackageVersions));
}
if (centralPackageVersions.Count == 0)
{
return packageReferences;
}

LibraryDependency[] result = new LibraryDependency[packageReferences.Length];
for (int i = 0; i < packageReferences.Length; i++)
{
LibraryDependency d = packageReferences[i];
if (!d.AutoReferenced && d.LibraryRange.VersionRange == null)
{
var libraryRange = d.LibraryRange;
var versionCentrallyManaged = d.VersionCentrallyManaged;

if (d.VersionOverride != null)
{
libraryRange = new LibraryRange(d.LibraryRange) { VersionRange = d.VersionOverride };
}
else
{
if (centralPackageVersions.TryGetValue(d.Name, out CentralPackageVersion centralPackageVersion))
{
libraryRange = new LibraryRange(d.LibraryRange) { VersionRange = centralPackageVersion.VersionRange };
}

versionCentrallyManaged = true;
}

d = new LibraryDependency(d)
{
LibraryRange = libraryRange,
VersionCentrallyManaged = versionCentrallyManaged
};
}

result[i] = d;
}

return ImmutableCollectionsMarshal.AsImmutableArray(result);
}

internal static IEnumerable<RuntimeDescription> GetRuntimeIdentifiers(string unparsedRuntimeIdentifer, string unparsedRuntimeIdentifers)
{
var runtimes = Enumerable.Empty<string>();
Expand Down
Loading