From 82c34675ef608de0ff83aff97da3e1e5fd53ee86 Mon Sep 17 00:00:00 2001
From: martintmk <103487740+martintmk@users.noreply.github.com>
Date: Mon, 27 Mar 2023 08:56:44 +0200
Subject: [PATCH] Move the LegacyFolder outside of Polly.Core (#1083)
* Introduce LegacySupport folder
* Cleanup
---
eng/Common.targets | 5 +
.../CallerArgumentExpressionAttribute.cs | 31 +++
src/LegacySupport/IsExternalInit.cs | 12 ++
src/LegacySupport/NullableAttributes.cs | 179 ++++++++++++++++++
.../Builder/ResilienceStrategyBuilder.cs | 13 +-
.../CallerArgumentExpressionAttribute.cs | 13 --
.../LegacySupport/MaybeNullWhenAttribute.cs | 13 --
src/Polly.Core/Polly.Core.csproj | 1 +
src/Polly.sln | 1 +
9 files changed, 230 insertions(+), 38 deletions(-)
create mode 100644 src/LegacySupport/CallerArgumentExpressionAttribute.cs
create mode 100644 src/LegacySupport/IsExternalInit.cs
create mode 100644 src/LegacySupport/NullableAttributes.cs
delete mode 100644 src/Polly.Core/LegacySupport/CallerArgumentExpressionAttribute.cs
delete mode 100644 src/Polly.Core/LegacySupport/MaybeNullWhenAttribute.cs
diff --git a/eng/Common.targets b/eng/Common.targets
index 7dcd2358ab6..e4b94f0dba5 100644
--- a/eng/Common.targets
+++ b/eng/Common.targets
@@ -12,4 +12,9 @@
+
+
+
+
+
diff --git a/src/LegacySupport/CallerArgumentExpressionAttribute.cs b/src/LegacySupport/CallerArgumentExpressionAttribute.cs
new file mode 100644
index 00000000000..53f89061dac
--- /dev/null
+++ b/src/LegacySupport/CallerArgumentExpressionAttribute.cs
@@ -0,0 +1,31 @@
+// Copyright (c) Microsoft Corporation. All Rights Reserved.
+
+#pragma warning disable IDE0079
+#pragma warning disable SA1101
+#pragma warning disable SA1512
+
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics.CodeAnalysis;
+
+namespace System.Runtime.CompilerServices;
+
+///
+/// Tags parameter that should be filled with specific caller name.
+///
+[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
+[ExcludeFromCodeCoverage]
+internal sealed class CallerArgumentExpressionAttribute : Attribute
+{
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// Function parameter to take the name from.
+ public CallerArgumentExpressionAttribute(string parameterName) => ParameterName = parameterName;
+
+ ///
+ /// Gets name of the function parameter that name should be taken from.
+ ///
+ public string ParameterName { get; }
+}
diff --git a/src/LegacySupport/IsExternalInit.cs b/src/LegacySupport/IsExternalInit.cs
new file mode 100644
index 00000000000..67a4d5efc3b
--- /dev/null
+++ b/src/LegacySupport/IsExternalInit.cs
@@ -0,0 +1,12 @@
+// Copyright (c) Microsoft Corporation. All Rights Reserved.
+
+#pragma warning disable IDE0079
+#pragma warning disable S3903
+
+/* This enables support for C# 9/10 records on older frameworks */
+
+namespace System.Runtime.CompilerServices;
+
+internal static class IsExternalInit
+{
+}
diff --git a/src/LegacySupport/NullableAttributes.cs b/src/LegacySupport/NullableAttributes.cs
new file mode 100644
index 00000000000..922b09d60f2
--- /dev/null
+++ b/src/LegacySupport/NullableAttributes.cs
@@ -0,0 +1,179 @@
+// Copyright (c) Microsoft Corporation. All Rights Reserved.
+
+#pragma warning disable IDE0079
+#pragma warning disable IDE0079
+#pragma warning disable SA1101
+#pragma warning disable SA1116
+#pragma warning disable SA1117
+#pragma warning disable SA1402
+#pragma warning disable SA1512
+#pragma warning disable SA1623
+#pragma warning disable SA1642
+#pragma warning disable SA1623
+#pragma warning disable SA1642
+#pragma warning disable SA1649
+#pragma warning disable S3903
+#pragma warning disable IDE0021 // Use block body for constructors
+#pragma warning disable CA1019
+
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace System.Diagnostics.CodeAnalysis;
+
+#if !NETCOREAPP3_1_OR_GREATER
+/// Specifies that null is allowed as an input even if the corresponding type disallows it.
+[AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false)]
+[ExcludeFromCodeCoverage]
+internal sealed class AllowNullAttribute : Attribute
+{
+}
+
+/// Specifies that null is disallowed as an input even if the corresponding type allows it.
+[AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false)]
+[ExcludeFromCodeCoverage]
+internal sealed class DisallowNullAttribute : Attribute
+{
+}
+
+/// Specifies that an output may be null even if the corresponding type disallows it.
+[AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false)]
+[ExcludeFromCodeCoverage]
+internal sealed class MaybeNullAttribute : Attribute
+{
+}
+
+/// Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns.
+[AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false)]
+[ExcludeFromCodeCoverage]
+internal sealed class NotNullAttribute : Attribute
+{
+}
+
+/// Specifies that when a method returns , the parameter may be null even if the corresponding type disallows it.
+[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
+[ExcludeFromCodeCoverage]
+internal sealed class MaybeNullWhenAttribute : Attribute
+{
+ /// Initializes the attribute with the specified return value condition.
+ ///
+ /// The return value condition. If the method returns this value, the associated parameter may be null.
+ ///
+ public MaybeNullWhenAttribute(bool returnValue) => ReturnValue = returnValue;
+
+ /// Gets the return value condition.
+ public bool ReturnValue { get; }
+}
+
+/// Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it.
+[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
+[ExcludeFromCodeCoverage]
+internal sealed class NotNullWhenAttribute : Attribute
+{
+ /// Initializes the attribute with the specified return value condition.
+ ///
+ /// The return value condition. If the method returns this value, the associated parameter will not be null.
+ ///
+ public NotNullWhenAttribute(bool returnValue) => ReturnValue = returnValue;
+
+ /// Gets the return value condition.
+ public bool ReturnValue { get; }
+}
+
+/// Specifies that the output will be non-null if the named parameter is non-null.
+[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, AllowMultiple = true, Inherited = false)]
+[ExcludeFromCodeCoverage]
+internal sealed class NotNullIfNotNullAttribute : Attribute
+{
+ /// Initializes the attribute with the associated parameter name.
+ ///
+ /// The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
+ ///
+ public NotNullIfNotNullAttribute(string parameterName) => ParameterName = parameterName;
+
+ /// Gets the associated parameter name.
+ public string ParameterName { get; }
+}
+
+/// Applied to a method that will never return under any circumstance.
+[AttributeUsage(AttributeTargets.Method, Inherited = false)]
+[ExcludeFromCodeCoverage]
+internal sealed class DoesNotReturnAttribute : Attribute
+{
+}
+
+/// Specifies that the method will not return if the associated Boolean parameter is passed the specified value.
+[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
+[ExcludeFromCodeCoverage]
+internal sealed class DoesNotReturnIfAttribute : Attribute
+{
+ /// Initializes the attribute with the specified parameter value.
+ ///
+ /// The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
+ /// the associated parameter matches this value.
+ ///
+ public DoesNotReturnIfAttribute(bool parameterValue) => ParameterValue = parameterValue;
+
+ /// Gets the condition parameter value.
+ public bool ParameterValue { get; }
+}
+#endif
+
+/// Specifies that the method or property will ensure that the listed field and property members have not-null values.
+[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
+[ExcludeFromCodeCoverage]
+internal sealed class MemberNotNullAttribute : Attribute
+{
+ /// Initializes the attribute with a field or property member.
+ ///
+ /// The field or property member that is promised to be not-null.
+ ///
+ public MemberNotNullAttribute(string member) => Members = new[] { member };
+
+ /// Initializes the attribute with the list of field and property members.
+ ///
+ /// The list of field and property members that are promised to be not-null.
+ ///
+ public MemberNotNullAttribute(params string[] members) => Members = members;
+
+ /// Gets field or property member names.
+ public string[] Members { get; }
+}
+
+/// Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.
+[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
+[ExcludeFromCodeCoverage]
+internal sealed class MemberNotNullWhenAttribute : Attribute
+{
+ /// Initializes the attribute with the specified return value condition and a field or property member.
+ ///
+ /// The return value condition. If the method returns this value, the associated parameter will not be null.
+ ///
+ ///
+ /// The field or property member that is promised to be not-null.
+ ///
+ public MemberNotNullWhenAttribute(bool returnValue, string member)
+ {
+ ReturnValue = returnValue;
+ Members = new[] { member };
+ }
+
+ /// Initializes the attribute with the specified return value condition and list of field and property members.
+ ///
+ /// The return value condition. If the method returns this value, the associated parameter will not be null.
+ ///
+ ///
+ /// The list of field and property members that are promised to be not-null.
+ ///
+ public MemberNotNullWhenAttribute(bool returnValue, params string[] members)
+ {
+ ReturnValue = returnValue;
+ Members = members;
+ }
+
+ /// Gets the return value condition.
+ public bool ReturnValue { get; }
+
+ /// Gets field or property member names.
+ public string[] Members { get; }
+}
diff --git a/src/Polly.Core/Builder/ResilienceStrategyBuilder.cs b/src/Polly.Core/Builder/ResilienceStrategyBuilder.cs
index 8875f7dedfd..a10040e40e6 100644
--- a/src/Polly.Core/Builder/ResilienceStrategyBuilder.cs
+++ b/src/Polly.Core/Builder/ResilienceStrategyBuilder.cs
@@ -111,16 +111,5 @@ private ResilienceStrategy CreateResilienceStrategy(Entry entry)
return entry.Factory(context);
}
- private sealed class Entry
- {
- public Entry(Func factory, ResilienceStrategyOptions properties)
- {
- Factory = factory;
- Properties = properties;
- }
-
- public Func Factory { get; }
-
- public ResilienceStrategyOptions Properties { get; }
- }
+ private sealed record Entry(Func Factory, ResilienceStrategyOptions Properties);
}
diff --git a/src/Polly.Core/LegacySupport/CallerArgumentExpressionAttribute.cs b/src/Polly.Core/LegacySupport/CallerArgumentExpressionAttribute.cs
deleted file mode 100644
index 7318fb03a04..00000000000
--- a/src/Polly.Core/LegacySupport/CallerArgumentExpressionAttribute.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-#if NETFRAMEWORK || NETSTANDARD
-
-namespace System.Runtime.CompilerServices;
-
-[AttributeUsage(AttributeTargets.Parameter)]
-internal sealed class CallerArgumentExpressionAttribute : Attribute
-{
- public CallerArgumentExpressionAttribute(string parameterName) => ParameterName = parameterName;
-
- public string ParameterName { get; }
-}
-
-#endif
diff --git a/src/Polly.Core/LegacySupport/MaybeNullWhenAttribute.cs b/src/Polly.Core/LegacySupport/MaybeNullWhenAttribute.cs
deleted file mode 100644
index a9e284732de..00000000000
--- a/src/Polly.Core/LegacySupport/MaybeNullWhenAttribute.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-#if NETFRAMEWORK || NETSTANDARD
-
-namespace System.Diagnostics.CodeAnalysis;
-
-[AttributeUsage(AttributeTargets.Parameter)]
-internal sealed class MaybeNullWhenAttribute : Attribute
-{
- public MaybeNullWhenAttribute(bool returnValue) => ReturnValue = returnValue;
-
- public bool ReturnValue { get; }
-}
-
-#endif
diff --git a/src/Polly.Core/Polly.Core.csproj b/src/Polly.Core/Polly.Core.csproj
index 10998df47c1..6c649319ef2 100644
--- a/src/Polly.Core/Polly.Core.csproj
+++ b/src/Polly.Core/Polly.Core.csproj
@@ -10,6 +10,7 @@
true
true
100
+ true
diff --git a/src/Polly.sln b/src/Polly.sln
index f872d6128b5..3551a409021 100644
--- a/src/Polly.sln
+++ b/src/Polly.sln
@@ -30,6 +30,7 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "eng", "eng", "{04E3C7C5-31F7-4CD6-8BEC-C1032527D231}"
ProjectSection(SolutionItems) = preProject
..\eng\Analyzers.targets = ..\eng\Analyzers.targets
+ ..\eng\Common.targets = ..\eng\Common.targets
..\eng\Library.targets = ..\eng\Library.targets
..\eng\Test.targets = ..\eng\Test.targets
EndProjectSection