--- /dev/null
+// 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; }
+ }
+}
+++ /dev/null
-<linker>
- <assembly fullname="System.Text.Json">
- <type fullname="System.Text.Json.JsonPropertyInfoNullable`2">
- <!-- Instantiated via reflection -->
- <method name=".ctor" />
- </type>
- <type fullname="System.Text.Json.Serialization.JsonPropertyInfoNotNullableContravariant`4">
- <!-- Instantiated via reflection -->
- <method name=".ctor" />
- </type>
- <type fullname="System.Text.Json.Serialization.Converters.JsonConverterEnum`1">
- <!-- Instantiated via reflection -->
- <method name=".ctor" />
- </type>
- <type fullname="System.Text.Json.Serialization.Converters.JsonKeyValuePairConverter`2">
- <!-- Instantiated via reflection -->
- <method name=".ctor" />
- </type>
- <type fullname="System.Text.Json.ImmutableCollectionCreator">
- <!-- Instantiated via reflection -->
- <method name=".ctor" />
- </type>
- <type fullname="System.Text.Json.ImmutableDictionaryCreator`2">
- <!-- Instantiated via reflection -->
- <method name=".ctor" />
- </type>
- <type fullname="System.Text.Json.ImmutableEnumerableCreator`2">
- <!-- Instantiated via reflection -->
- <method name=".ctor" />
- </type>
- </assembly>
-</linker>
<Compile Include="System\Text\Json\Writer\Utf8JsonWriter.WriteValues.SignedNumber.cs" />
<Compile Include="System\Text\Json\Writer\Utf8JsonWriter.WriteValues.String.cs" />
<Compile Include="System\Text\Json\Writer\Utf8JsonWriter.WriteValues.UnsignedNumber.cs" />
+ <Compile Include="$(CommonPath)\System\Runtime\CompilerServices\PreserveDependencyAttribute.cs">
+ <Link>Common\System\Runtime\CompilerServices\PreserveDependencyAttribute.cs</Link>
+ </Compile>
</ItemGroup>
<ItemGroup Condition="'$(TargetsNETStandard)' == 'true' OR '$(TargetsNetFx)' == 'true'">
<Compile Include="System\Collections\Generic\StackExtensions.netstandard.cs" />
// See the LICENSE file in the project root for more information.
using System.Reflection;
+using System.Runtime.CompilerServices;
namespace System.Text.Json.Serialization.Converters
{
return type.IsEnum;
}
+ [PreserveDependency(
+ ".ctor(System.Text.Json.Serialization.Converters.EnumConverterOptions)",
+ "System.Text.Json.Serialization.Converters.JsonConverterEnum`1",
+ "System.Text.Json")]
public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options)
{
JsonConverter converter = (JsonConverter)Activator.CreateInstance(
using System.Collections.Generic;
using System.Reflection;
+using System.Runtime.CompilerServices;
namespace System.Text.Json.Serialization.Converters
{
return (generic == typeof(KeyValuePair<,>));
}
+ [PreserveDependency(".ctor()", "System.Text.Json.Serialization.Converters.JsonKeyValuePairConverter`2", "System.Text.Json")]
public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options)
{
Type keyType = type.GetGenericArguments()[0];
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Reflection;
+using System.Runtime.CompilerServices;
using System.Text.Json.Serialization;
using System.Threading;
options);
}
+ [PreserveDependency(".ctor()", "System.Text.Json.JsonPropertyInfoNullable`2", "System.Text.Json")]
+ [PreserveDependency(".ctor()", "System.Text.Json.Serialization.JsonPropertyInfoNotNullableContravariant`4", "System.Text.Json")]
internal static JsonPropertyInfo CreateProperty(
Type declaredPropertyType,
Type runtimePropertyType,
// See the LICENSE file in the project root for more information.
using System.Reflection;
+using System.Runtime.CompilerServices;
using System.Text.Json.Serialization.Converters;
namespace System.Text.Json.Serialization
}
/// <inheritdoc />
+ [PreserveDependency(
+ ".ctor(System.Text.Json.Serialization.Converters.EnumConverterOptions, System.Text.Json.JsonNamingPolicy)",
+ "System.Text.Json.Serialization.Converters.JsonConverterEnum`1",
+ "System.Text.Json")]
public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{
JsonConverter converter = (JsonConverter)Activator.CreateInstance(
using System.Diagnostics;
using System.Reflection;
using System.Reflection.Emit;
+using System.Runtime.CompilerServices;
namespace System.Text.Json
{
return (Action<TProperty>)addMethod.CreateDelegate(typeof(Action<TProperty>), target);
}
+ [PreserveDependency(".ctor()", "System.Text.Json.ImmutableEnumerableCreator`2", "System.Text.Json")]
public override ImmutableCollectionCreator ImmutableCollectionCreateRange(Type constructingType, Type collectionType, Type elementType)
{
MethodInfo createRange = ImmutableCollectionCreateRangeMethod(constructingType, elementType);
return creator;
}
-
+ [PreserveDependency(".ctor()", "System.Text.Json.ImmutableDictionaryCreator`2", "System.Text.Json")]
public override ImmutableCollectionCreator ImmutableDictionaryCreateRange(Type constructingType, Type collectionType, Type elementType)
{
Debug.Assert(collectionType.IsGenericType);
return (Action<TProperty>)addMethod.CreateDelegate(typeof(Action<TProperty>), target);
}
+ [PreserveDependency(".ctor()", "System.Text.Json.ImmutableEnumerableCreator`2", "System.Text.Json")]
public override ImmutableCollectionCreator ImmutableCollectionCreateRange(Type constructingType, Type collectionType, Type elementType)
{
MethodInfo createRange = ImmutableCollectionCreateRangeMethod(constructingType, elementType);
return creator;
}
-
+ [PreserveDependency(".ctor()", "System.Text.Json.ImmutableDictionaryCreator`2", "System.Text.Json")]
public override ImmutableCollectionCreator ImmutableDictionaryCreateRange(Type constructingType, Type collectionType, Type elementType)
{
Debug.Assert(collectionType.IsGenericType);