From 37b9702c965948d980ee4a1a6125c75d5e75a103 Mon Sep 17 00:00:00 2001 From: Gan Keyu Date: Fri, 22 Sep 2023 14:11:58 +0800 Subject: [PATCH 1/7] remove capturing lambda --- .../src/DependencyContextExtensions.cs | 12 ++-- .../src/DependencyContextJsonReader.cs | 15 +++- .../src/EnumerableHelpers.cs | 69 +++++++++++++++++++ 3 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 src/libraries/Microsoft.Extensions.DependencyModel/src/EnumerableHelpers.cs diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs index a40f12ecbebec..099df4a3ed4f2 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs @@ -17,14 +17,14 @@ public static IEnumerable GetDefaultNativeAssets(this DependencyContext { ThrowHelper.ThrowIfNull(self); - return self.RuntimeLibraries.SelectMany(library => library.GetDefaultNativeAssets(self)); + return EnumerableHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultNativeAssets(context), self); } public static IEnumerable GetDefaultNativeRuntimeFileAssets(this DependencyContext self) { ThrowHelper.ThrowIfNull(self); - return self.RuntimeLibraries.SelectMany(library => library.GetDefaultNativeRuntimeFileAssets(self)); + return EnumerableHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultNativeRuntimeFileAssets(context), self); } public static IEnumerable GetRuntimeNativeAssets(this DependencyContext self, string runtimeIdentifier) @@ -32,7 +32,7 @@ public static IEnumerable GetRuntimeNativeAssets(this DependencyContext ThrowHelper.ThrowIfNull(self); ThrowHelper.ThrowIfNull(runtimeIdentifier); - return self.RuntimeLibraries.SelectMany(library => library.GetRuntimeNativeAssets(self, runtimeIdentifier)); + return EnumerableHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeNativeAssets(context, id), self, runtimeIdentifier); } public static IEnumerable GetRuntimeNativeRuntimeFileAssets(this DependencyContext self, string runtimeIdentifier) @@ -40,7 +40,7 @@ public static IEnumerable GetRuntimeNativeRuntimeFileAssets(this De ThrowHelper.ThrowIfNull(self); ThrowHelper.ThrowIfNull(runtimeIdentifier); - return self.RuntimeLibraries.SelectMany(library => library.GetRuntimeNativeRuntimeFileAssets(self, runtimeIdentifier)); + return EnumerableHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeNativeRuntimeFileAssets(context, id), self, runtimeIdentifier); } public static IEnumerable GetDefaultNativeAssets(this RuntimeLibrary self, DependencyContext context) @@ -79,7 +79,7 @@ public static IEnumerable GetDefaultAssemblyNames(this DependencyC { ThrowHelper.ThrowIfNull(self); - return self.RuntimeLibraries.SelectMany(library => library.GetDefaultAssemblyNames(self)); + return EnumerableHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultAssemblyNames(context), self); } public static IEnumerable GetRuntimeAssemblyNames(this DependencyContext self, string runtimeIdentifier) @@ -87,7 +87,7 @@ public static IEnumerable GetRuntimeAssemblyNames(this DependencyC ThrowHelper.ThrowIfNull(self); ThrowHelper.ThrowIfNull(runtimeIdentifier); - return self.RuntimeLibraries.SelectMany(library => library.GetRuntimeAssemblyNames(self, runtimeIdentifier)); + return EnumerableHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeAssemblyNames(context, id), self, runtimeIdentifier); } public static IEnumerable GetDefaultAssemblyNames(this RuntimeLibrary self, DependencyContext context) diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs index a6e80f8921801..27f50e99459e1 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs @@ -741,9 +741,18 @@ private IEnumerable CreateLibraries(IEnumerable? librari { return Enumerable.Empty(); } - return libraries - .Select(property => CreateLibrary(property, runtime, libraryStubs)) - .Where(library => library != null)!; + + return CreateLibrariesNotNull(libraries, runtime, libraryStubs); + } + + private IEnumerable CreateLibrariesNotNull(IEnumerable libraries, bool runtime, Dictionary? libraryStubs) + { + foreach (var library in libraries) + { + Library? property = CreateLibrary(property, runtime, libraryStubs); + if (property is not null) + yield return property; + } } private Library? CreateLibrary(TargetLibrary targetLibrary, bool runtime, Dictionary? libraryStubs) diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/EnumerableHelpers.cs b/src/libraries/Microsoft.Extensions.DependencyModel/src/EnumerableHelpers.cs new file mode 100644 index 0000000000000..b4056d5587707 --- /dev/null +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/EnumerableHelpers.cs @@ -0,0 +1,69 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Microsoft.Extensions.DependencyModel +{ + internal static class EnumerableHelpers + { + public static IEnumerable SelectMany(IEnumerable src, + Func> func, TParam1 param1 = default) + { + if (src is TSource[] srcArray) + { + return SelectManyArray(srcArray, func, param1); + } + + foreach (var elem in src) + { + foreach (var subElem in func(elem, param1)) + { + yield return subElem; + } + } + } + + private static IEnumerable SelectManyArray(TSource[] src, + Func> func, TParam1 param1 = default) + { + foreach (var elem in src) + { + foreach (var subElem in func(elem, param1)) + { + yield return subElem; + } + } + } + public static IEnumerable SelectMany(IEnumerable src, + Func> func, TParam1 param1 = default, TParam2 param2 = default) + { + if (src is TSource[] srcArray) + { + return SelectManyArray(srcArray, func, param1, param2); + } + + foreach (var elem in src) + { + foreach (var subElem in func(elem, param1, param2)) + { + yield return subElem; + } + } + } + + private static IEnumerable SelectManyArray(TSource[] src, + Func> func, TParam1 param1 = default, TParam2 param2 = default) + { + foreach (var elem in src) + { + foreach (var subElem in func(elem, param1, param2)) + { + yield return subElem; + } + } + } + } +} From b0f43f66edcde72042543f8f7434eef542dd00cc Mon Sep 17 00:00:00 2001 From: Gan Keyu Date: Fri, 22 Sep 2023 14:19:17 +0800 Subject: [PATCH 2/7] fix typo --- .../src/DependencyContextJsonReader.cs | 2 +- .../src/EnumerableHelpers.cs | 24 +++++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs index 27f50e99459e1..1d8cc928572c5 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs @@ -749,7 +749,7 @@ private IEnumerable CreateLibrariesNotNull(IEnumerable l { foreach (var library in libraries) { - Library? property = CreateLibrary(property, runtime, libraryStubs); + Library? property = CreateLibrary(library, runtime, libraryStubs); if (property is not null) yield return property; } diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/EnumerableHelpers.cs b/src/libraries/Microsoft.Extensions.DependencyModel/src/EnumerableHelpers.cs index b4056d5587707..052bf40ecdde2 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/src/EnumerableHelpers.cs +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/EnumerableHelpers.cs @@ -10,13 +10,19 @@ namespace Microsoft.Extensions.DependencyModel internal static class EnumerableHelpers { public static IEnumerable SelectMany(IEnumerable src, - Func> func, TParam1 param1 = default) + Func> func, TParam1 param1) { if (src is TSource[] srcArray) { return SelectManyArray(srcArray, func, param1); } + return SelectManyNonArray(src, func, param1); + } + + private static IEnumerable SelectManyArray(TSource[] src, + Func> func, TParam1 param1) + { foreach (var elem in src) { foreach (var subElem in func(elem, param1)) @@ -25,9 +31,8 @@ public static IEnumerable SelectMany(IEnumer } } } - - private static IEnumerable SelectManyArray(TSource[] src, - Func> func, TParam1 param1 = default) + private static IEnumerable SelectManyNonArray(IEnumerable src, + Func> func, TParam1 param1) { foreach (var elem in src) { @@ -38,13 +43,19 @@ private static IEnumerable SelectManyArray(T } } public static IEnumerable SelectMany(IEnumerable src, - Func> func, TParam1 param1 = default, TParam2 param2 = default) + Func> func, TParam1 param1, TParam2 param2) { if (src is TSource[] srcArray) { return SelectManyArray(srcArray, func, param1, param2); } + return SelectManyNonArray(src, func, param1, param2); + } + + private static IEnumerable SelectManyNonArray(IEnumerable src, + Func> func, TParam1 param1, TParam2 param2) + { foreach (var elem in src) { foreach (var subElem in func(elem, param1, param2)) @@ -53,9 +64,8 @@ public static IEnumerable SelectMany SelectManyArray(TSource[] src, - Func> func, TParam1 param1 = default, TParam2 param2 = default) + Func> func, TParam1 param1, TParam2 param2) { foreach (var elem in src) { From 96792a36cb26772f4cc7da8d9086eae055718507 Mon Sep 17 00:00:00 2001 From: Gan Keyu Date: Fri, 22 Sep 2023 20:11:27 +0800 Subject: [PATCH 3/7] fix code style --- .../src/DependencyContextJsonReader.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs index 1d8cc928572c5..d857366865bdc 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs @@ -747,11 +747,11 @@ private IEnumerable CreateLibraries(IEnumerable? librari private IEnumerable CreateLibrariesNotNull(IEnumerable libraries, bool runtime, Dictionary? libraryStubs) { - foreach (var library in libraries) + foreach (TargetLibrary library in libraries) { - Library? property = CreateLibrary(library, runtime, libraryStubs); - if (property is not null) - yield return property; + Library? createdLibrary = CreateLibrary(library, runtime, libraryStubs); + if (createdLibrary is not null) + yield return createdLibrary; } } From ae56eb4df438017dbbf0439c379cc225069c9b52 Mon Sep 17 00:00:00 2001 From: Gan Keyu Date: Sat, 23 Sep 2023 18:39:21 +0800 Subject: [PATCH 4/7] Optimize capturing lambdas in the Dependency framework `DependencyContextExtensions` and `DependencyContextJsonReader` originally use lambdas capturing local variables, resulting in unnecessary allocations. The PR replaces them with helper functions with static lambdas. Fix #87911 --- .../src/DependencyContextExtensions.cs | 12 ++++++------ .../src/Microsoft.Extensions.DependencyModel.csproj | 2 ++ .../System/Linq/SelectManyWithParameterHelpers.cs} | 5 ++--- 3 files changed, 10 insertions(+), 9 deletions(-) rename src/libraries/{Microsoft.Extensions.DependencyModel/src/EnumerableHelpers.cs => System.Linq/src/System/Linq/SelectManyWithParameterHelpers.cs} (96%) diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs index 099df4a3ed4f2..92b351288687e 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs @@ -17,14 +17,14 @@ public static IEnumerable GetDefaultNativeAssets(this DependencyContext { ThrowHelper.ThrowIfNull(self); - return EnumerableHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultNativeAssets(context), self); + return SelectManyWithParameterHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultNativeAssets(context), self); } public static IEnumerable GetDefaultNativeRuntimeFileAssets(this DependencyContext self) { ThrowHelper.ThrowIfNull(self); - return EnumerableHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultNativeRuntimeFileAssets(context), self); + return SelectManyWithParameterHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultNativeRuntimeFileAssets(context), self); } public static IEnumerable GetRuntimeNativeAssets(this DependencyContext self, string runtimeIdentifier) @@ -32,7 +32,7 @@ public static IEnumerable GetRuntimeNativeAssets(this DependencyContext ThrowHelper.ThrowIfNull(self); ThrowHelper.ThrowIfNull(runtimeIdentifier); - return EnumerableHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeNativeAssets(context, id), self, runtimeIdentifier); + return SelectManyWithParameterHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeNativeAssets(context, id), self, runtimeIdentifier); } public static IEnumerable GetRuntimeNativeRuntimeFileAssets(this DependencyContext self, string runtimeIdentifier) @@ -40,7 +40,7 @@ public static IEnumerable GetRuntimeNativeRuntimeFileAssets(this De ThrowHelper.ThrowIfNull(self); ThrowHelper.ThrowIfNull(runtimeIdentifier); - return EnumerableHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeNativeRuntimeFileAssets(context, id), self, runtimeIdentifier); + return SelectManyWithParameterHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeNativeRuntimeFileAssets(context, id), self, runtimeIdentifier); } public static IEnumerable GetDefaultNativeAssets(this RuntimeLibrary self, DependencyContext context) @@ -79,7 +79,7 @@ public static IEnumerable GetDefaultAssemblyNames(this DependencyC { ThrowHelper.ThrowIfNull(self); - return EnumerableHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultAssemblyNames(context), self); + return SelectManyWithParameterHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultAssemblyNames(context), self); } public static IEnumerable GetRuntimeAssemblyNames(this DependencyContext self, string runtimeIdentifier) @@ -87,7 +87,7 @@ public static IEnumerable GetRuntimeAssemblyNames(this DependencyC ThrowHelper.ThrowIfNull(self); ThrowHelper.ThrowIfNull(runtimeIdentifier); - return EnumerableHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeAssemblyNames(context, id), self, runtimeIdentifier); + return SelectManyWithParameterHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeAssemblyNames(context, id), self, runtimeIdentifier); } public static IEnumerable GetDefaultAssemblyNames(this RuntimeLibrary self, DependencyContext context) diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/Microsoft.Extensions.DependencyModel.csproj b/src/libraries/Microsoft.Extensions.DependencyModel/src/Microsoft.Extensions.DependencyModel.csproj index 6cd3d26b2b6f6..0008e7067705b 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/src/Microsoft.Extensions.DependencyModel.csproj +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/Microsoft.Extensions.DependencyModel.csproj @@ -13,6 +13,8 @@ By default, the dependency manifest contains information about the application's + diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/EnumerableHelpers.cs b/src/libraries/System.Linq/src/System/Linq/SelectManyWithParameterHelpers.cs similarity index 96% rename from src/libraries/Microsoft.Extensions.DependencyModel/src/EnumerableHelpers.cs rename to src/libraries/System.Linq/src/System/Linq/SelectManyWithParameterHelpers.cs index 052bf40ecdde2..78b87401a52ca 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/src/EnumerableHelpers.cs +++ b/src/libraries/System.Linq/src/System/Linq/SelectManyWithParameterHelpers.cs @@ -3,11 +3,10 @@ using System; using System.Collections.Generic; -using System.Linq; -namespace Microsoft.Extensions.DependencyModel +namespace System.Linq { - internal static class EnumerableHelpers + internal static class SelectManyWithParameterHelpers { public static IEnumerable SelectMany(IEnumerable src, Func> func, TParam1 param1) From 90812a78de2fa685d7f3e98d573232b3881fc690 Mon Sep 17 00:00:00 2001 From: Gan Keyu Date: Tue, 28 Nov 2023 21:53:54 +0800 Subject: [PATCH 5/7] move the helper file into the library NS. --- .../Microsoft.Extensions.DependencyModel.sln | 38 +++++---- .../src/DependencyContextExtensions.cs | 12 +-- .../src/LinqHelpers.cs | 38 +++++++++ ...icrosoft.Extensions.DependencyModel.csproj | 2 - .../Linq/SelectManyWithParameterHelpers.cs | 78 ------------------- 5 files changed, 67 insertions(+), 101 deletions(-) create mode 100644 src/libraries/Microsoft.Extensions.DependencyModel/src/LinqHelpers.cs delete mode 100644 src/libraries/System.Linq/src/System/Linq/SelectManyWithParameterHelpers.cs diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/Microsoft.Extensions.DependencyModel.sln b/src/libraries/Microsoft.Extensions.DependencyModel/Microsoft.Extensions.DependencyModel.sln index 7faec76ce42e0..385b3f401da45 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/Microsoft.Extensions.DependencyModel.sln +++ b/src/libraries/Microsoft.Extensions.DependencyModel/Microsoft.Extensions.DependencyModel.sln @@ -1,4 +1,8 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34112.27 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestUtilities", "..\Common\tests\TestUtilities\TestUtilities.csproj", "{E5B6A94F-615E-4DAF-8110-E5A776BB8296}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bcl.AsyncInterfaces", "..\Microsoft.Bcl.AsyncInterfaces\ref\Microsoft.Bcl.AsyncInterfaces.csproj", "{696D69C9-C5F6-405E-A8B5-5375D08BBADC}" @@ -59,11 +63,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{5725D7DF-DC3 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{55D04C80-4A8F-40AC-967D-3FA77C814D7B}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "tools\gen", "{9C13782D-F7D7-4F02-A39D-D7BD992EB257}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{9C13782D-F7D7-4F02-A39D-D7BD992EB257}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "tools\src", "{D9691871-5357-4B81-9B4E-A94394515042}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D9691871-5357-4B81-9B4E-A94394515042}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "tools\ref", "{C5220846-E0E3-4326-B2C1-C3535910E354}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{C5220846-E0E3-4326-B2C1-C3535910E354}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{FDECE2E5-8E54-4DF7-95D4-35BB8D8432AA}" EndProject @@ -183,36 +187,40 @@ Global EndGlobalSection GlobalSection(NestedProjects) = preSolution {E5B6A94F-615E-4DAF-8110-E5A776BB8296} = {155C3F40-F63D-49DF-87D3-A3EEA27036E8} - {F5E89C81-2D78-4F86-ABD2-7D983F46EB58} = {155C3F40-F63D-49DF-87D3-A3EEA27036E8} - {5351C410-530D-4724-A8E6-430831E7332B} = {155C3F40-F63D-49DF-87D3-A3EEA27036E8} {696D69C9-C5F6-405E-A8B5-5375D08BBADC} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} + {2AED2951-7724-4EFC-8E16-6DF877C6B4A6} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} {6D9C22DB-C4E3-483E-AF78-C1DCE6ED8DD6} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} + {5C580568-6072-4F27-B5C6-FA04556E3B98} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} + {F5E89C81-2D78-4F86-ABD2-7D983F46EB58} = {155C3F40-F63D-49DF-87D3-A3EEA27036E8} + {5351C410-530D-4724-A8E6-430831E7332B} = {155C3F40-F63D-49DF-87D3-A3EEA27036E8} {C8C58A2A-B254-4A74-8C7B-9B0CA0A9E67A} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} {CC0E8CC8-88F5-4D72-9B3F-0281DD58461A} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} {7323E18C-BF40-4236-9AEF-273A94F3DB03} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} - {536A305D-DC57-4E7F-B21B-B8DE916A63C3} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} - {50F89560-1449-44E4-844E-72815256534B} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} - {8E212A9D-391B-4EFA-943D-7D104A9D3D7E} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} - {2AED2951-7724-4EFC-8E16-6DF877C6B4A6} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} - {5C580568-6072-4F27-B5C6-FA04556E3B98} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} - {7902A0CA-E94D-4C96-A112-455A1E5E2390} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} - {FA7201FE-097D-4197-BDEC-329986814D8D} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} {FA796FCD-5901-407B-BF40-166169718A0F} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} {7B4B86A8-EF62-45F0-A431-05F4C11A2E0D} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} {6F992337-EAEE-4F7A-BF3B-DDC526F054F7} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} + {536A305D-DC57-4E7F-B21B-B8DE916A63C3} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} + {50F89560-1449-44E4-844E-72815256534B} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} + {7902A0CA-E94D-4C96-A112-455A1E5E2390} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} {240E7B1C-6D7D-4932-9598-815C2EA420AF} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} {B4C5A0BE-3E21-4464-875C-E6EBED176EE3} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} {30DEAC25-AFDB-4E91-90A4-7B94E1809C59} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} + {8E212A9D-391B-4EFA-943D-7D104A9D3D7E} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} + {FA7201FE-097D-4197-BDEC-329986814D8D} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} {69691ED6-ECDB-4AFB-87FA-BED4F8489746} = {9C13782D-F7D7-4F02-A39D-D7BD992EB257} {0CA9C0FD-7D04-4EB8-9567-06171C795552} = {9C13782D-F7D7-4F02-A39D-D7BD992EB257} - {9C13782D-F7D7-4F02-A39D-D7BD992EB257} = {FDECE2E5-8E54-4DF7-95D4-35BB8D8432AA} {B9F77365-105E-4FED-B0CE-83568C16B46C} = {D9691871-5357-4B81-9B4E-A94394515042} {718E999B-18AE-4A65-A010-BFF0B8E3FB39} = {D9691871-5357-4B81-9B4E-A94394515042} - {D9691871-5357-4B81-9B4E-A94394515042} = {FDECE2E5-8E54-4DF7-95D4-35BB8D8432AA} {417E717C-B67C-4CCF-BD8B-5662016DC17E} = {C5220846-E0E3-4326-B2C1-C3535910E354} + {9C13782D-F7D7-4F02-A39D-D7BD992EB257} = {FDECE2E5-8E54-4DF7-95D4-35BB8D8432AA} + {D9691871-5357-4B81-9B4E-A94394515042} = {FDECE2E5-8E54-4DF7-95D4-35BB8D8432AA} {C5220846-E0E3-4326-B2C1-C3535910E354} = {FDECE2E5-8E54-4DF7-95D4-35BB8D8432AA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {810D114A-26F4-4151-9EFE-29A7F1BF62AA} EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + ..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{0ca9c0fd-7d04-4eb8-9567-06171c795552}*SharedItemsImports = 5 + ..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{718e999b-18ae-4a65-a010-bff0b8e3fb39}*SharedItemsImports = 5 + EndGlobalSection EndGlobal diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs index 92b351288687e..a14da142caf37 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs @@ -17,14 +17,14 @@ public static IEnumerable GetDefaultNativeAssets(this DependencyContext { ThrowHelper.ThrowIfNull(self); - return SelectManyWithParameterHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultNativeAssets(context), self); + return LinqHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultNativeAssets(context), self); } public static IEnumerable GetDefaultNativeRuntimeFileAssets(this DependencyContext self) { ThrowHelper.ThrowIfNull(self); - return SelectManyWithParameterHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultNativeRuntimeFileAssets(context), self); + return LinqHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultNativeRuntimeFileAssets(context), self); } public static IEnumerable GetRuntimeNativeAssets(this DependencyContext self, string runtimeIdentifier) @@ -32,7 +32,7 @@ public static IEnumerable GetRuntimeNativeAssets(this DependencyContext ThrowHelper.ThrowIfNull(self); ThrowHelper.ThrowIfNull(runtimeIdentifier); - return SelectManyWithParameterHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeNativeAssets(context, id), self, runtimeIdentifier); + return LinqHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeNativeAssets(context, id), self, runtimeIdentifier); } public static IEnumerable GetRuntimeNativeRuntimeFileAssets(this DependencyContext self, string runtimeIdentifier) @@ -40,7 +40,7 @@ public static IEnumerable GetRuntimeNativeRuntimeFileAssets(this De ThrowHelper.ThrowIfNull(self); ThrowHelper.ThrowIfNull(runtimeIdentifier); - return SelectManyWithParameterHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeNativeRuntimeFileAssets(context, id), self, runtimeIdentifier); + return LinqHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeNativeRuntimeFileAssets(context, id), self, runtimeIdentifier); } public static IEnumerable GetDefaultNativeAssets(this RuntimeLibrary self, DependencyContext context) @@ -79,7 +79,7 @@ public static IEnumerable GetDefaultAssemblyNames(this DependencyC { ThrowHelper.ThrowIfNull(self); - return SelectManyWithParameterHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultAssemblyNames(context), self); + return LinqHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultAssemblyNames(context), self); } public static IEnumerable GetRuntimeAssemblyNames(this DependencyContext self, string runtimeIdentifier) @@ -87,7 +87,7 @@ public static IEnumerable GetRuntimeAssemblyNames(this DependencyC ThrowHelper.ThrowIfNull(self); ThrowHelper.ThrowIfNull(runtimeIdentifier); - return SelectManyWithParameterHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeAssemblyNames(context, id), self, runtimeIdentifier); + return LinqHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeAssemblyNames(context, id), self, runtimeIdentifier); } public static IEnumerable GetDefaultAssemblyNames(this RuntimeLibrary self, DependencyContext context) diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/LinqHelpers.cs b/src/libraries/Microsoft.Extensions.DependencyModel/src/LinqHelpers.cs new file mode 100644 index 0000000000000..292b5c1888154 --- /dev/null +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/LinqHelpers.cs @@ -0,0 +1,38 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.Extensions.DependencyModel +{ + internal static class LinqHelpers + { + public static IEnumerable SelectMany(IEnumerable src, + Func> func, TParam1 param1) + { + foreach (TSource? elem in src) + { + foreach (TResult? subElem in func(elem, param1)) + { + yield return subElem; + } + } + } + + public static IEnumerable SelectMany(IEnumerable src, + Func> func, TParam1 param1, TParam2 param2) + { + foreach (TSource? elem in src) + { + foreach (TResult? subElem in func(elem, param1, param2)) + { + yield return subElem; + } + } + } + } +} diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/Microsoft.Extensions.DependencyModel.csproj b/src/libraries/Microsoft.Extensions.DependencyModel/src/Microsoft.Extensions.DependencyModel.csproj index 0008e7067705b..6cd3d26b2b6f6 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/src/Microsoft.Extensions.DependencyModel.csproj +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/Microsoft.Extensions.DependencyModel.csproj @@ -13,8 +13,6 @@ By default, the dependency manifest contains information about the application's - diff --git a/src/libraries/System.Linq/src/System/Linq/SelectManyWithParameterHelpers.cs b/src/libraries/System.Linq/src/System/Linq/SelectManyWithParameterHelpers.cs deleted file mode 100644 index 78b87401a52ca..0000000000000 --- a/src/libraries/System.Linq/src/System/Linq/SelectManyWithParameterHelpers.cs +++ /dev/null @@ -1,78 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; - -namespace System.Linq -{ - internal static class SelectManyWithParameterHelpers - { - public static IEnumerable SelectMany(IEnumerable src, - Func> func, TParam1 param1) - { - if (src is TSource[] srcArray) - { - return SelectManyArray(srcArray, func, param1); - } - - return SelectManyNonArray(src, func, param1); - } - - private static IEnumerable SelectManyArray(TSource[] src, - Func> func, TParam1 param1) - { - foreach (var elem in src) - { - foreach (var subElem in func(elem, param1)) - { - yield return subElem; - } - } - } - private static IEnumerable SelectManyNonArray(IEnumerable src, - Func> func, TParam1 param1) - { - foreach (var elem in src) - { - foreach (var subElem in func(elem, param1)) - { - yield return subElem; - } - } - } - public static IEnumerable SelectMany(IEnumerable src, - Func> func, TParam1 param1, TParam2 param2) - { - if (src is TSource[] srcArray) - { - return SelectManyArray(srcArray, func, param1, param2); - } - - return SelectManyNonArray(src, func, param1, param2); - } - - private static IEnumerable SelectManyNonArray(IEnumerable src, - Func> func, TParam1 param1, TParam2 param2) - { - foreach (var elem in src) - { - foreach (var subElem in func(elem, param1, param2)) - { - yield return subElem; - } - } - } - private static IEnumerable SelectManyArray(TSource[] src, - Func> func, TParam1 param1, TParam2 param2) - { - foreach (var elem in src) - { - foreach (var subElem in func(elem, param1, param2)) - { - yield return subElem; - } - } - } - } -} From 5c548e4db695bfd3866d61d8f8ace67c85c81ad3 Mon Sep 17 00:00:00 2001 From: Gan Keyu Date: Tue, 28 Nov 2023 21:56:14 +0800 Subject: [PATCH 6/7] revert sln file --- .../Microsoft.Extensions.DependencyModel.sln | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/Microsoft.Extensions.DependencyModel.sln b/src/libraries/Microsoft.Extensions.DependencyModel/Microsoft.Extensions.DependencyModel.sln index 385b3f401da45..7faec76ce42e0 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/Microsoft.Extensions.DependencyModel.sln +++ b/src/libraries/Microsoft.Extensions.DependencyModel/Microsoft.Extensions.DependencyModel.sln @@ -1,8 +1,4 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.8.34112.27 -MinimumVisualStudioVersion = 10.0.40219.1 +Microsoft Visual Studio Solution File, Format Version 12.00 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestUtilities", "..\Common\tests\TestUtilities\TestUtilities.csproj", "{E5B6A94F-615E-4DAF-8110-E5A776BB8296}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bcl.AsyncInterfaces", "..\Microsoft.Bcl.AsyncInterfaces\ref\Microsoft.Bcl.AsyncInterfaces.csproj", "{696D69C9-C5F6-405E-A8B5-5375D08BBADC}" @@ -63,11 +59,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{5725D7DF-DC3 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{55D04C80-4A8F-40AC-967D-3FA77C814D7B}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{9C13782D-F7D7-4F02-A39D-D7BD992EB257}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "tools\gen", "{9C13782D-F7D7-4F02-A39D-D7BD992EB257}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D9691871-5357-4B81-9B4E-A94394515042}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "tools\src", "{D9691871-5357-4B81-9B4E-A94394515042}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{C5220846-E0E3-4326-B2C1-C3535910E354}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "tools\ref", "{C5220846-E0E3-4326-B2C1-C3535910E354}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{FDECE2E5-8E54-4DF7-95D4-35BB8D8432AA}" EndProject @@ -187,40 +183,36 @@ Global EndGlobalSection GlobalSection(NestedProjects) = preSolution {E5B6A94F-615E-4DAF-8110-E5A776BB8296} = {155C3F40-F63D-49DF-87D3-A3EEA27036E8} - {696D69C9-C5F6-405E-A8B5-5375D08BBADC} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} - {2AED2951-7724-4EFC-8E16-6DF877C6B4A6} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} - {6D9C22DB-C4E3-483E-AF78-C1DCE6ED8DD6} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} - {5C580568-6072-4F27-B5C6-FA04556E3B98} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} {F5E89C81-2D78-4F86-ABD2-7D983F46EB58} = {155C3F40-F63D-49DF-87D3-A3EEA27036E8} {5351C410-530D-4724-A8E6-430831E7332B} = {155C3F40-F63D-49DF-87D3-A3EEA27036E8} + {696D69C9-C5F6-405E-A8B5-5375D08BBADC} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} + {6D9C22DB-C4E3-483E-AF78-C1DCE6ED8DD6} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} {C8C58A2A-B254-4A74-8C7B-9B0CA0A9E67A} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} {CC0E8CC8-88F5-4D72-9B3F-0281DD58461A} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} {7323E18C-BF40-4236-9AEF-273A94F3DB03} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} - {FA796FCD-5901-407B-BF40-166169718A0F} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} - {7B4B86A8-EF62-45F0-A431-05F4C11A2E0D} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} - {6F992337-EAEE-4F7A-BF3B-DDC526F054F7} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} {536A305D-DC57-4E7F-B21B-B8DE916A63C3} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} {50F89560-1449-44E4-844E-72815256534B} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} + {8E212A9D-391B-4EFA-943D-7D104A9D3D7E} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} + {2AED2951-7724-4EFC-8E16-6DF877C6B4A6} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} + {5C580568-6072-4F27-B5C6-FA04556E3B98} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} {7902A0CA-E94D-4C96-A112-455A1E5E2390} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} + {FA7201FE-097D-4197-BDEC-329986814D8D} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} + {FA796FCD-5901-407B-BF40-166169718A0F} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} + {7B4B86A8-EF62-45F0-A431-05F4C11A2E0D} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} + {6F992337-EAEE-4F7A-BF3B-DDC526F054F7} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} {240E7B1C-6D7D-4932-9598-815C2EA420AF} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} {B4C5A0BE-3E21-4464-875C-E6EBED176EE3} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} {30DEAC25-AFDB-4E91-90A4-7B94E1809C59} = {55D04C80-4A8F-40AC-967D-3FA77C814D7B} - {8E212A9D-391B-4EFA-943D-7D104A9D3D7E} = {50BA55F5-BD05-4C05-910F-2BFD20BD3465} - {FA7201FE-097D-4197-BDEC-329986814D8D} = {5725D7DF-DC33-47D2-90C9-D8736C579E77} {69691ED6-ECDB-4AFB-87FA-BED4F8489746} = {9C13782D-F7D7-4F02-A39D-D7BD992EB257} {0CA9C0FD-7D04-4EB8-9567-06171C795552} = {9C13782D-F7D7-4F02-A39D-D7BD992EB257} + {9C13782D-F7D7-4F02-A39D-D7BD992EB257} = {FDECE2E5-8E54-4DF7-95D4-35BB8D8432AA} {B9F77365-105E-4FED-B0CE-83568C16B46C} = {D9691871-5357-4B81-9B4E-A94394515042} {718E999B-18AE-4A65-A010-BFF0B8E3FB39} = {D9691871-5357-4B81-9B4E-A94394515042} - {417E717C-B67C-4CCF-BD8B-5662016DC17E} = {C5220846-E0E3-4326-B2C1-C3535910E354} - {9C13782D-F7D7-4F02-A39D-D7BD992EB257} = {FDECE2E5-8E54-4DF7-95D4-35BB8D8432AA} {D9691871-5357-4B81-9B4E-A94394515042} = {FDECE2E5-8E54-4DF7-95D4-35BB8D8432AA} + {417E717C-B67C-4CCF-BD8B-5662016DC17E} = {C5220846-E0E3-4326-B2C1-C3535910E354} {C5220846-E0E3-4326-B2C1-C3535910E354} = {FDECE2E5-8E54-4DF7-95D4-35BB8D8432AA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {810D114A-26F4-4151-9EFE-29A7F1BF62AA} EndGlobalSection - GlobalSection(SharedMSBuildProjectFiles) = preSolution - ..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{0ca9c0fd-7d04-4eb8-9567-06171c795552}*SharedItemsImports = 5 - ..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{718e999b-18ae-4a65-a010-bff0b8e3fb39}*SharedItemsImports = 5 - EndGlobalSection EndGlobal From bcf4bddd254ac1ec4042a3ed886b21fe9844d223 Mon Sep 17 00:00:00 2001 From: Gan Keyu Date: Tue, 28 Nov 2023 23:43:25 +0800 Subject: [PATCH 7/7] make CreateLibrariesNotNull local function --- .../src/DependencyContextJsonReader.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs index d857366865bdc..c0ff80a6e5a8c 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs @@ -743,15 +743,15 @@ private IEnumerable CreateLibraries(IEnumerable? librari } return CreateLibrariesNotNull(libraries, runtime, libraryStubs); - } - private IEnumerable CreateLibrariesNotNull(IEnumerable libraries, bool runtime, Dictionary? libraryStubs) - { - foreach (TargetLibrary library in libraries) + IEnumerable CreateLibrariesNotNull(IEnumerable libraries, bool runtime, Dictionary? libraryStubs) { - Library? createdLibrary = CreateLibrary(library, runtime, libraryStubs); - if (createdLibrary is not null) - yield return createdLibrary; + foreach (TargetLibrary library in libraries) + { + Library? createdLibrary = CreateLibrary(library, runtime, libraryStubs); + if (createdLibrary is not null) + yield return createdLibrary; + } } }