Skip to content

Commit 450aac9

Browse files
[9.1] Address some of the AOT compiler errors in .NET 9 (#8649) (#8652)
Co-authored-by: Martijn Laarman <[email protected]>
1 parent ba0eb13 commit 450aac9

File tree

13 files changed

+68
-23
lines changed

13 files changed

+68
-23
lines changed

src/Elastic.Clients.Elasticsearch/Elastic.Clients.Elasticsearch.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<PropertyGroup>
1515
<IsPackable>true</IsPackable>
1616
<GenerateDocumentationFile>true</GenerateDocumentationFile>
17-
<TargetFrameworks>netstandard2.0;net462;netstandard2.1;net8.0</TargetFrameworks>
17+
<TargetFrameworks>netstandard2.0;net462;netstandard2.1;net8.0;net9.0</TargetFrameworks>
1818
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
1919
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
2020
<Nullable>annotations</Nullable>

src/Elastic.Clients.Elasticsearch/_Shared/Core/Extensions/ExpressionExtensions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System;
6+
using System.Diagnostics.CodeAnalysis;
67
using System.Linq;
78
using System.Linq.Expressions;
89

@@ -87,7 +88,10 @@ private class SuffixExpressionVisitor : ExpressionVisitor
8788

8889
public SuffixExpressionVisitor(string suffix) => _suffix = suffix;
8990

91+
[RequiresDynamicCode("Use of Expression.Call requires dynamic code generation.")]
92+
#pragma warning disable IL3051
9093
public override Expression Visit(Expression node) => Expression.Call(
94+
#pragma warning restore IL3051
9195
typeof(SuffixExtensions),
9296
nameof(SuffixExtensions.Suffix),
9397
null,

src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/DynamicPropertyAccessor.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ internal static class DynamicPropertyAccessor
5151
// Build compiled getter delegate.
5252

5353
#pragma warning disable IL3050
54+
#pragma warning disable IL2060
5455
var getterDelegateFactory = MakeDelegateMethodInfo.MakeGenericMethod(type, getterMethod.ReturnType);
5556
#pragma warning restore IL3050
57+
#pragma warning restore IL2060
5658
var genericGetterDelegate = (Func<object, object>)getterDelegateFactory.Invoke(null, [getterMethod])!;
5759

5860
return instance => retrieverFunc(genericGetterDelegate, instance);

src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/Field/FieldExpressionVisitor.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Runtime.CompilerServices;
1111
using System.Text;
1212
using System.Collections;
13+
using System.Diagnostics.CodeAnalysis;
1314

1415
namespace Elastic.Clients.Elasticsearch;
1516

@@ -61,6 +62,8 @@ protected override Expression VisitMember(MemberExpression expression)
6162
return base.VisitMember(expression);
6263
}
6364

65+
[RequiresDynamicCode("Use of Expression.Lambda")]
66+
[UnconditionalSuppressMessage("Trimming", "IL3051", Justification = "Can only annotate our implementation")]
6467
protected override Expression VisitMethodCall(MethodCallExpression methodCall)
6568
{
6669
if (methodCall.Method.Name == nameof(SuffixExtensions.Suffix) && methodCall.Arguments.Any())
@@ -97,6 +100,7 @@ protected override Expression VisitMethodCall(MethodCallExpression methodCall)
97100
return base.VisitMethodCall(methodCall);
98101
}
99102

103+
[RequiresDynamicCode("Use of Expression.Lambda")]
100104
private static void VisitConstantOrVariable(MethodCallExpression methodCall, Stack<string> stack)
101105
{
102106
var lastArg = methodCall.Arguments.Last();

src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/Id/IdConverter.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System;
6+
using System.Diagnostics.CodeAnalysis;
67
using System.Text.Json;
78
using System.Text.Json.Serialization;
89
using Elastic.Clients.Elasticsearch.Serialization;
@@ -27,6 +28,7 @@ public override void WriteAsPropertyName(Utf8JsonWriter writer, Id value, JsonSe
2728
? new Id(reader.GetInt64())
2829
: new Id(reader.GetString());
2930

31+
[UnconditionalSuppressMessage("AOT", "IL2072:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Call to object.GetType()")]
3032
public override void Write(Utf8JsonWriter writer, Id value, JsonSerializerOptions options)
3133
{
3234
if (value is null)

src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/Id/IdResolver.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Collections.Concurrent;
77
using System.Diagnostics.CodeAnalysis;
88
using System.Globalization;
9+
using static System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes;
910

1011
namespace Elastic.Clients.Elasticsearch;
1112

@@ -16,12 +17,11 @@ public class IdResolver
1617
private readonly IElasticsearchClientSettings _settings;
1718
private readonly ConcurrentDictionary<Type, Func<object, string?>?> _localDelegateCache = new();
1819

19-
public IdResolver(IElasticsearchClientSettings settings)
20-
{
21-
_settings = settings;
22-
}
20+
public IdResolver(IElasticsearchClientSettings settings) => _settings = settings;
2321

24-
public string? Resolve<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(T instance)
22+
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Call to object.GetType()")]
23+
[UnconditionalSuppressMessage("AOT", "IL2072:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Call to object.GetType()")]
24+
public string? Resolve<[DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] T>(T instance)
2525
{
2626
if (_settings.DefaultDisableIdInference || (instance is null))
2727
{
@@ -31,7 +31,7 @@ public IdResolver(IElasticsearchClientSettings settings)
3131
return Resolve(instance.GetType(), instance);
3232
}
3333

34-
public string? Resolve([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, object instance)
34+
public string? Resolve([DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] Type type, object instance)
3535
{
3636
if (type is null)
3737
{

src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/Inferrer.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Diagnostics.CodeAnalysis;
77

88
using Elastic.Transport;
9+
using static System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes;
910

1011
namespace Elastic.Clients.Elasticsearch;
1112

@@ -40,15 +41,15 @@ public Inferrer(IElasticsearchClientSettings elasticsearchClientSettings)
4041

4142
public string IndexName(IndexName index) => IndexNameResolver.Resolve(index);
4243

43-
public string? Id<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(T instance) => IdResolver.Resolve(instance);
44+
public string? Id<[DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] T>(T instance) => IdResolver.Resolve(instance);
4445

45-
public string? Id([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, object instance) => IdResolver.Resolve(type, instance);
46+
public string? Id([DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] Type type, object instance) => IdResolver.Resolve(type, instance);
4647

4748
public string RelationName<T>() => RelationNameResolver.Resolve<T>();
4849

4950
public string RelationName(RelationName type) => RelationNameResolver.Resolve(type);
5051

51-
public string? Routing<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(T document) => RoutingResolver.Resolve(document);
52+
public string? Routing<[DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] T>(T document) => RoutingResolver.Resolve(document);
5253

53-
public string? Routing([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, object instance) => RoutingResolver.Resolve(type, instance);
54+
public string? Routing([DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] Type type, object instance) => RoutingResolver.Resolve(type, instance);
5455
}

src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/JoinFieldRouting/RoutingConverter.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System;
6+
using System.Diagnostics.CodeAnalysis;
67
using System.Text.Json;
78
using System.Text.Json.Serialization;
89
using Elastic.Clients.Elasticsearch.Serialization;
@@ -18,6 +19,7 @@ internal sealed class RoutingConverter : JsonConverter<Routing>
1819
? new Routing(reader.GetInt64())
1920
: new Routing(reader.GetString());
2021

22+
[UnconditionalSuppressMessage("AOT", "IL2072:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Call to object.GetType()")]
2123
public override void Write(Utf8JsonWriter writer, Routing value, JsonSerializerOptions options)
2224
{
2325
if (value is null)

src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/RoutingResolver.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Reflection;
99
using System.Linq;
1010
using System.Globalization;
11+
using static System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes;
1112

1213
namespace Elastic.Clients.Elasticsearch;
1314

@@ -23,7 +24,9 @@ public RoutingResolver(IElasticsearchClientSettings settings, IdResolver idResol
2324
_settings = settings;
2425
}
2526

26-
public string? Resolve<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(T instance)
27+
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Call to object.GetType()")]
28+
[UnconditionalSuppressMessage("AOT", "IL2072:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Call to object.GetType()")]
29+
public string? Resolve<[DynamicallyAccessedMembers(PublicProperties | None | NonPublicProperties)] T>(T instance)
2730
{
2831
if (instance is null)
2932
{
@@ -33,7 +36,8 @@ public RoutingResolver(IElasticsearchClientSettings settings, IdResolver idResol
3336
return Resolve(instance.GetType(), instance);
3437
}
3538

36-
public string? Resolve([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, object instance)
39+
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Call to object.GetType()")]
40+
public string? Resolve([DynamicallyAccessedMembers(PublicProperties | None | NonPublicProperties)] Type type, object instance)
3741
{
3842
if (type is null)
3943
{
@@ -59,7 +63,7 @@ public RoutingResolver(IElasticsearchClientSettings settings, IdResolver idResol
5963
}
6064

6165
private bool TryGetConnectionSettingsRoute(
62-
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type,
66+
[DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] Type type,
6367
object instance,
6468
out string? route)
6569
{
@@ -83,7 +87,7 @@ private bool TryGetConnectionSettingsRoute(
8387
}
8488

8589
private static JoinField? GetJoinFieldFromObject(
86-
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type,
90+
[DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] Type type,
8791
object instance)
8892
{
8993
if (JoinFieldDelegateCache.TryGetValue(type, out var getterDelegate))
@@ -105,7 +109,7 @@ private bool TryGetConnectionSettingsRoute(
105109

106110
return getterDelegate(instance);
107111

108-
static PropertyInfo? GetJoinFieldProperty([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] Type type)
112+
static PropertyInfo? GetJoinFieldProperty([DynamicallyAccessedMembers(PublicProperties)] Type type)
109113
{
110114
var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
111115
try

src/Elastic.Clients.Elasticsearch/_Shared/Serialization/DefaultRequestResponseSerializer.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
using System;
66
using System.Collections.Generic;
7+
using System.Diagnostics.CodeAnalysis;
78
using System.IO;
89
using System.Text.Json;
910
using System.Text.Json.Serialization;
@@ -141,15 +142,15 @@ private static IReadOnlyCollection<JsonConverter> CreateDefaultBuiltInConverters
141142
new StringifiedDoubleConverter(),
142143
];
143144

145+
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
146+
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
144147
private static void MutateOptions(JsonSerializerOptions options)
145148
{
146-
#pragma warning disable IL2026, IL3050
147149
options.TypeInfoResolver = JsonTypeInfoResolver.Combine(
148150
RequestResponseSerializerContext.Default,
149151
ElasticsearchTransportSerializerContext.Default,
150152
new DefaultJsonTypeInfoResolver()
151153
);
152-
#pragma warning restore IL2026, IL3050
153154

154155
options.MaxDepth = 512;
155156
options.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;

0 commit comments

Comments
 (0)