Move PreserveDependencyAttribute to shared (dotnet/corefxdotnet/coreclr#42174)
authorStephen Toub <stoub@microsoft.com>
Mon, 28 Oct 2019 17:47:23 +0000 (13:47 -0400)
committerJan Kotas <jkotas@microsoft.com>
Wed, 30 Oct 2019 00:13:14 +0000 (17:13 -0700)
We need to use it in corelib, too.

Signed-off-by: dotnet-bot <dotnet-bot@microsoft.com>
Commit migrated from https://github.com/dotnet/coreclr/commit/549ba51466e56dec67056499706213524bfa6c63

src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/PreserveDependencyAttribute.cs [new file with mode: 0644]

diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/PreserveDependencyAttribute.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/PreserveDependencyAttribute.cs
new file mode 100644 (file)
index 0000000..de14ff3
--- /dev/null
@@ -0,0 +1,62 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+#nullable enable
+
+// TODO https://github.com/dotnet/corefx/issues/41201: Design and expose this publicly.
+
+namespace System.Runtime.CompilerServices
+{
+    /// <summary>States a dependency that one member has on another.</summary>
+    /// <remarks>
+    /// This can be used to inform tooling of a dependency that is otherwise not evident purely from
+    /// metadata and IL, for example a member relied on via reflection.
+    /// </remarks>
+    [AttributeUsage(
+        AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Field /* AttributeTargets.Class | AttributeTargets.Struct */, // TODO: https://github.com/mono/linker/issues/797
+        AllowMultiple = true, Inherited = false)]
+    internal sealed class PreserveDependencyAttribute : Attribute
+    {
+        /// <summary>Initializes the attribute.</summary>
+        /// <param name="memberSignature">The signature of the member depended.</param>
+        public PreserveDependencyAttribute(string memberSignature)
+        {
+            MemberSignature = memberSignature;
+        }
+
+        /// <summary>Initializes the attribute.</summary>
+        /// <param name="memberSignature">The signature of the member depended on.</param>
+        /// <param name="typeName">The full name of the type containing <paramref name="memberSignature"/>.</param>
+        public PreserveDependencyAttribute(string memberSignature, string typeName)
+        {
+            MemberSignature = memberSignature;
+            TypeName = typeName;
+        }
+
+        /// <summary>Initializes the attribute.</summary>
+        /// <param name="memberSignature">The signature of the member depended on.</param>
+        /// <param name="typeName">The full name of the type containing <paramref name="memberSignature"/>.</param>
+        /// <param name="assemblyName">The name of the assembly containing <paramref name="typeName"/>.</param>
+        public PreserveDependencyAttribute(string memberSignature, string typeName, string assemblyName)
+        {
+            MemberSignature = memberSignature;
+            TypeName = typeName;
+            AssemblyName = assemblyName;
+        }
+
+        /// <summary>Gets the signature of the member depended on.</summary>
+        public string MemberSignature { get; }
+
+        /// <summary>Gets the full name of the type containing the specified member.</summary>
+        /// <remarks>If no type name is specified, the type of the consumer is assumed.</remarks>
+        public string? TypeName { get; }
+
+        /// <summary>Gets the assembly name of the specified type.</summary>
+        /// <remarks>If no assembly name is specified, the assembly of the consumer is assumed.</remarks>
+        public string? AssemblyName { get; }
+
+        /// <summary>Gets or sets the condition in which the dependency is applicable, e.g. "DEBUG".</summary>
+        public string? Condition { get; set; }
+    }
+}