Skip to content

Commit 8b7a561

Browse files
[9.1] More AOT annotations (#8661) (#8665)
Co-authored-by: Martijn Laarman <[email protected]>
1 parent 42fbd6f commit 8b7a561

File tree

12 files changed

+62
-45
lines changed

12 files changed

+62
-45
lines changed

src/Elastic.Clients.Elasticsearch/_Shared/Core/Configuration/ElasticsearchClientSettings.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
using System.Linq.Expressions;
1010
using System.Reflection;
1111
using System.Runtime.InteropServices;
12-
12+
using System.Text.Json.Serialization.Metadata;
1313
using Elastic.Clients.Elasticsearch.Esql;
1414
using Elastic.Clients.Elasticsearch.Requests;
1515
using Elastic.Clients.Elasticsearch.Serialization;
@@ -86,10 +86,12 @@ public ElasticsearchClientSettings(InMemoryRequestInvoker inMemoryTransportClien
8686
public ElasticsearchClientSettings(
8787
NodePool nodePool,
8888
IRequestInvoker requestInvoker,
89-
SourceSerializerFactory sourceSerializer,
90-
IPropertyMappingProvider propertyMappingProvider) : base(nodePool, requestInvoker, sourceSerializer, propertyMappingProvider)
89+
SourceSerializerFactory? sourceSerializer,
90+
IPropertyMappingProvider? propertyMappingProvider
91+
) : base(nodePool, requestInvoker, sourceSerializer, propertyMappingProvider)
9192
{
9293
}
94+
9395
}
9496

9597
/// <inheritdoc cref="IElasticsearchClientSettings" />
@@ -121,21 +123,23 @@ public abstract class ElasticsearchClientSettingsBase<TConnectionSettings> :
121123

122124
protected ElasticsearchClientSettingsBase(
123125
NodePool nodePool,
124-
IRequestInvoker requestInvoker,
126+
IRequestInvoker? requestInvoker,
125127
ElasticsearchClientSettings.SourceSerializerFactory? sourceSerializerFactory,
126-
IPropertyMappingProvider propertyMappingProvider)
128+
IPropertyMappingProvider? propertyMappingProvider
129+
)
127130
: base(nodePool, requestInvoker, null, ElasticsearchClientProductRegistration.DefaultForElasticsearchClientsElasticsearch)
128131
{
129132
var requestResponseSerializer = new DefaultRequestResponseSerializer(this);
130133
var sourceSerializer = new DefaultSourceSerializer(this);
131134

132135
UseThisRequestResponseSerializer = requestResponseSerializer;
133136

137+
_propertyMappingProvider = propertyMappingProvider ?? new DefaultPropertyMappingProvider();
134138
_sourceSerializer = sourceSerializerFactory?.Invoke(sourceSerializer, this) ?? sourceSerializer;
135-
_propertyMappingProvider = propertyMappingProvider ?? sourceSerializer as IPropertyMappingProvider ?? new DefaultPropertyMappingProvider();
136139
_defaultFieldNameInferrer = _sourceSerializer.TryGetJsonSerializerOptions(out var options)
137140
? p => options.PropertyNamingPolicy?.ConvertName(p) ?? p
138141
: p => p.ToCamelCase();
142+
139143
_defaultIndices = new FluentDictionary<Type, string>();
140144
_defaultRelationNames = new FluentDictionary<Type, string>();
141145
_inferrer = new Inferrer(this);
@@ -394,9 +398,12 @@ public abstract class ConnectionConfigurationBase<TConnectionConfiguration> :
394398
{
395399
private bool _includeServerStackTraceOnError;
396400

397-
protected ConnectionConfigurationBase(NodePool nodePool, IRequestInvoker requestInvoker,
401+
protected ConnectionConfigurationBase(
402+
NodePool nodePool,
403+
IRequestInvoker? requestInvoker,
398404
Serializer? serializer,
399-
ProductRegistration registration = null)
405+
ProductRegistration? registration = null
406+
)
400407
: base(nodePool, requestInvoker, serializer, registration ?? new ElasticsearchProductRegistration(typeof(ElasticsearchClient)))
401408
{
402409
UserAgent(ConnectionConfiguration.DefaultUserAgent);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
using System.Globalization;
99
using System.Text.Json;
1010
using System.Text.Json.Serialization;
11-
11+
using Elastic.Clients.Elasticsearch.Json;
1212
using Elastic.Transport;
1313

1414
namespace Elastic.Clients.Elasticsearch;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
using Elastic.Clients.Elasticsearch.Serialization;
1010
using Elastic.Transport;
1111

12-
namespace Elastic.Clients.Elasticsearch;
12+
namespace Elastic.Clients.Elasticsearch.Json;
1313

14-
internal sealed class IdConverter : JsonConverter<Id>
14+
public sealed class IdConverter : JsonConverter<Id>
1515
{
1616
private IElasticsearchClientSettings? _settings;
1717

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
using System.Linq;
1010
using System.Text.Json;
1111
using System.Text.Json.Serialization;
12-
12+
using Elastic.Clients.Elasticsearch.Json;
1313
using Elastic.Transport;
1414

1515
namespace Elastic.Clients.Elasticsearch;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
using System.Text.Json.Serialization;
99
using Elastic.Clients.Elasticsearch.Serialization;
1010

11-
namespace Elastic.Clients.Elasticsearch;
11+
namespace Elastic.Clients.Elasticsearch.Json;
1212

13-
internal sealed class RoutingConverter : JsonConverter<Routing>
13+
public sealed class RoutingConverter : JsonConverter<Routing>
1414
{
1515
private IElasticsearchClientSettings _settings;
1616

src/Elastic.Clients.Elasticsearch/_Shared/Next/ContextProvider.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ public ContextProvider(TContext context)
3333
/// If no <see cref="ContextProvider{TContext}"/> for <typeparamref name="TContext"/> is registered to the given
3434
/// <see cref="JsonSerializerOptions"/> instance.
3535
/// </exception>
36+
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
37+
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
3638
public static TContext GetContext(JsonSerializerOptions options)
3739
{
38-
#pragma warning disable IL2026, IL3050
3940
if (options.GetConverter(typeof(Marker)) is not Converter provider)
40-
#pragma warning restore IL2026, IL3050
4141
{
4242
throw new InvalidOperationException($"No context provider for type '{typeof(TContext).Name}' is " +
4343
$"registered for the given 'JsonSerializerOptions' instance.");
@@ -55,11 +55,11 @@ public static TContext GetContext(JsonSerializerOptions options)
5555
/// <see langword="true"/> if the context was successfully retrieved from the given <see cref="JsonSerializerOptions"/>
5656
/// or <see langword="false"/>, if not.
5757
/// </returns>
58+
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
59+
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
5860
public static bool TryGetContext(JsonSerializerOptions options, [MaybeNullWhen(false)] out TContext context)
5961
{
60-
#pragma warning disable IL2026, IL3050
6162
if (options.GetConverter(typeof(Marker)) is not Converter provider)
62-
#pragma warning restore IL2026, IL3050
6363
{
6464
context = default;
6565
return false;

src/Elastic.Clients.Elasticsearch/_Shared/Next/JsonSerializerOptionsExtensions.cs

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

55
using System;
6-
6+
using System.Diagnostics.CodeAnalysis;
77
using System.Runtime.CompilerServices;
88

99
using System.Text.Json.Serialization;
@@ -13,20 +13,18 @@ namespace Elastic.Clients.Elasticsearch.Serialization;
1313

1414
internal static partial class JsonSerializerOptionsExtensions
1515
{
16+
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
17+
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
1618
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1719
public static JsonConverter<T> GetConverter<T>(this JsonSerializerOptions options, Type? markerType)
1820
{
1921
// Mimics the internal behavior of `JsonSerializer.Serialize()` and as well seems to be required in order
2022
// to directly use converters like we do.
2123
// When getting a default generic converter from `JsonSerializerOptions` that are not read-only, a
2224
// `NotSupportedException` is thrown as soon as we call `converter.Read()` or `converter.Write()`.
23-
#pragma warning disable IL2026, IL3050
2425
options.MakeReadOnly(true);
25-
#pragma warning restore IL2026, IL3050
2626

27-
#pragma warning disable IL2026, IL3050
2827
var rawConverter = options.GetConverter(markerType ?? typeof(T));
29-
#pragma warning restore IL2026, IL3050
3028

3129
var converter = (JsonConverter<T>)(rawConverter is IMarkerTypeConverter markerTypeConverter
3230
? markerTypeConverter.WrappedConverter
@@ -35,6 +33,8 @@ public static JsonConverter<T> GetConverter<T>(this JsonSerializerOptions option
3533
return converter;
3634
}
3735

36+
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
37+
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
3838
[MethodImpl(MethodImplOptions.AggressiveInlining)]
3939
public static TContext GetContext<TContext>(this JsonSerializerOptions options)
4040
{

src/Elastic.Clients.Elasticsearch/_Shared/Next/ObjectToInferredTypesConverter.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@
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

910
namespace Elastic.Clients.Elasticsearch.Serialization;
1011

11-
internal sealed class ObjectToInferredTypesConverter :
12-
JsonConverter<object>
12+
internal sealed class ObjectToInferredTypesConverter : JsonConverter<object>
1313
{
14+
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
15+
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
1416
public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1517
{
1618
return reader.TokenType switch
@@ -26,12 +28,11 @@ JsonTokenType.String when reader.TryGetDateTimeOffset(out var value) => value,
2628
};
2729
}
2830

31+
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
32+
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
2933
public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
3034
{
3135
// TODO: Match `SourceMarker<T>` values and delegate to the `SourceSerializer`.
32-
33-
#pragma warning disable IL2026, IL3050
3436
JsonSerializer.Serialize(writer, value, value.GetType(), options);
35-
#pragma warning restore IL2026, IL3050
3637
}
3738
}

src/Elastic.Clients.Elasticsearch/_Shared/Next/SourceConverter.cs

Lines changed: 7 additions & 6 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.Reflection;
78
using System.Text.Json;
89
using System.Text.Json.Serialization;
@@ -50,27 +51,23 @@ public override bool CanConvert(Type typeToConvert)
5051
typeToConvert.GetGenericTypeDefinition() == typeof(SourceMarker<>);
5152
}
5253

54+
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
5355
public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
5456
{
5557
var args = typeToConvert.GetGenericArguments();
5658

57-
#pragma warning disable IL3050 // SourceMarker<T> static constructor roots SourceMarkerConverter<T>.
58-
5959
var converter = (JsonConverter)Activator.CreateInstance(
6060
typeof(SourceMarkerConverter<>).MakeGenericType(args[0]),
6161
BindingFlags.Instance | BindingFlags.Public,
6262
binder: null,
6363
args: [settings],
6464
culture: null)!;
6565

66-
#pragma warning restore IL3050
67-
6866
return converter;
6967
}
7068
}
7169

72-
internal sealed class SourceConverter<T> :
73-
JsonConverter<T>
70+
internal sealed class SourceConverter<T> : JsonConverter<T>
7471
{
7572
private readonly IElasticsearchClientSettings _settings;
7673

@@ -79,11 +76,15 @@ public SourceConverter(IElasticsearchClientSettings settings)
7976
_settings = settings;
8077
}
8178

79+
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
80+
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
8281
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
8382
{
8483
return _settings.SourceSerializer.Deserialize<T>(ref reader);
8584
}
8685

86+
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
87+
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
8788
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
8889
{
8990
_settings.SourceSerializer.Serialize(value, writer);

src/Playground/Person.cs

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

55
using System.Runtime.Serialization;
6+
using System.Text.Json.Serialization;
67
using Elastic.Clients.Elasticsearch;
7-
using Elastic.Clients.Elasticsearch.QueryDsl;
8+
using Playground;
89

910
namespace Playground
1011
{
12+
[JsonSerializable(typeof(Person))]
13+
internal partial class PlaygroundJsonSerializerContext : JsonSerializerContext;
14+
1115
public class Person
1216
{
1317
public int Id { get; set; }
1418

15-
[System.Text.Json.Serialization.JsonPropertyName("id2")]
19+
[JsonPropertyName("id2")]
1620
public Guid SecondaryId { get; set; } = Guid.NewGuid();
1721
public string? FirstName { get; init; }
1822
public string? LastName { get; init; }
1923
public int? Age { get; init; }
20-
public bool IsDeleted { get; init; }
24+
public bool IsDeleted { get; init; }
2125
public Routing? Routing { get; init; }
2226

2327
public Id Idv3 => "testing";
2428
//public Guid Routing { get; init; } = Guid.NewGuid();
2529

26-
[System.Text.Json.Serialization.JsonIgnore]
30+
[JsonIgnore]
2731
public string? Email { get; init; }
2832

2933
[DataMember(Name = "STEVE")]
3034
[IgnoreDataMember]
3135
public string Data { get; init; } = "NOTHING";
3236

3337
public DateTimeKind Enum { get; init; }
34-
35-
public Query? Q { get; init; }
3638
}
3739

3840
public class PersonV3
3941
{
4042
public Guid SecondaryId { get; set; } = Guid.NewGuid();
4143
}
4244
}
45+
46+
47+

0 commit comments

Comments
 (0)