diff --git a/src/Elastic.Clients.Elasticsearch/Common/ElasticsearchClientProductRegistration.cs b/src/Elastic.Clients.Elasticsearch/Common/ElasticsearchClientProductRegistration.cs index 8008c36bf01..892863d09d2 100644 --- a/src/Elastic.Clients.Elasticsearch/Common/ElasticsearchClientProductRegistration.cs +++ b/src/Elastic.Clients.Elasticsearch/Common/ElasticsearchClientProductRegistration.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System; +using System.Diagnostics.CodeAnalysis; using Elastic.Transport; using Elastic.Transport.Products.Elasticsearch; @@ -28,7 +29,7 @@ public override bool HttpStatusCodeClassifier(HttpMethod method, int statusCode) /// Makes the low level transport aware of Elastic.Clients.Elasticsearch's /// so that it can peek in to its exposed error when reporting failures. /// - public override bool TryGetServerErrorReason(TResponse response, out string? reason) + public override bool TryGetServerErrorReason(TResponse response, [NotNullWhen(returnValue: true)] out string? reason) { if (response is not ElasticsearchResponseBase r) return base.TryGetServerErrorReason(response, out reason); diff --git a/src/Elastic.Clients.Elasticsearch/CrossPlatform/NullableAttributes.cs b/src/Elastic.Clients.Elasticsearch/CrossPlatform/NullableAttributes.cs new file mode 100644 index 00000000000..99e09498c04 --- /dev/null +++ b/src/Elastic.Clients.Elasticsearch/CrossPlatform/NullableAttributes.cs @@ -0,0 +1,143 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. + +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#define INTERNAL_NULLABLE_ATTRIBUTES + +#pragma warning disable SA1402 // File may only contain a single type +#pragma warning disable SA1649 // File name should match first type name + +#if !NETCOREAPP3_1_OR_GREATER && !NETSTANDARD2_1_OR_GREATER || NET461 +namespace System.Diagnostics.CodeAnalysis +{ + /// Specifies that null is allowed as an input even if the corresponding type disallows it. + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false)] +#if INTERNAL_NULLABLE_ATTRIBUTES + internal +#else + public +#endif + 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)] +#if INTERNAL_NULLABLE_ATTRIBUTES + internal +#else + public +#endif + 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)] +#if INTERNAL_NULLABLE_ATTRIBUTES + internal +#else + public +#endif + sealed class MaybeNullAttribute : Attribute + { } + + /// Specifies that an output will not be null even if the corresponding type allows it. + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false)] +#if INTERNAL_NULLABLE_ATTRIBUTES + internal +#else + public +#endif + 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)] +#if INTERNAL_NULLABLE_ATTRIBUTES + internal +#else + public +#endif + 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)] +#if INTERNAL_NULLABLE_ATTRIBUTES + internal +#else + public +#endif + 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)] +#if INTERNAL_NULLABLE_ATTRIBUTES + internal +#else + public +#endif + 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)] +#if INTERNAL_NULLABLE_ATTRIBUTES + internal +#else + public +#endif + 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)] +#if INTERNAL_NULLABLE_ATTRIBUTES + internal +#else + public +#endif + 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 diff --git a/src/Elastic.Clients.Elasticsearch/Types/SourceConfig.cs b/src/Elastic.Clients.Elasticsearch/Types/SourceConfig.cs index ec5d007ffb0..637d9f46a7d 100644 --- a/src/Elastic.Clients.Elasticsearch/Types/SourceConfig.cs +++ b/src/Elastic.Clients.Elasticsearch/Types/SourceConfig.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System; +using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -15,8 +16,7 @@ public partial class SourceConfig public bool HasSourceFilterValue => Tag == 1; - // TODO - Not null when - public bool TryGetBool(out bool? value) + public bool TryGetBool([NotNullWhen(returnValue: true)] out bool? value) { if (Tag == 0) { @@ -28,7 +28,7 @@ public bool TryGetBool(out bool? value) return false; } - public bool TryGetSourceFilter(out SourceFilter? value) + public bool TryGetSourceFilter([NotNullWhen(returnValue: true)] out SourceFilter? value) { if (Tag == 1) {