diff --git a/CHANGELOG.md b/CHANGELOG.md index 712d2a62..063ec50f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.7.11] - 2024-02-26 + +### Changed + +- Updated IParseNode enum methods `DynamicallyAccessedMembersAttribute` to `PublicFields`. +- Fixed AOT compiler warnings from ILC. + ## [1.7.10] - 2024-02-26 ### Changed diff --git a/src/Microsoft.Kiota.Abstractions.csproj b/src/Microsoft.Kiota.Abstractions.csproj index e423838a..b8d78f67 100644 --- a/src/Microsoft.Kiota.Abstractions.csproj +++ b/src/Microsoft.Kiota.Abstractions.csproj @@ -14,7 +14,7 @@ https://aka.ms/kiota/docs true true - 1.7.10 + 1.7.11 true false diff --git a/src/RequestInformation.cs b/src/RequestInformation.cs index e8573f5a..56ff78e1 100644 --- a/src/RequestInformation.cs +++ b/src/RequestInformation.cs @@ -53,7 +53,7 @@ public RequestInformation(Method method, string urlTemplate, IDictionary(Action>? requestConfiguration) where T : class, new() #endif { - if(requestConfiguration == null) return; + if (requestConfiguration == null) return; var requestConfig = new RequestConfiguration(); requestConfiguration(requestConfig); AddQueryParameters(requestConfig.QueryParameters); @@ -69,7 +69,7 @@ public Uri URI { set { - if(value == null) + if (value == null) throw new ArgumentNullException(nameof(value)); QueryParameters.Clear(); PathParameters.Clear(); @@ -77,9 +77,9 @@ public Uri URI } get { - if(_rawUri != null) + if (_rawUri != null) return _rawUri; - else if(PathParameters.TryGetValue(RawUrlKey, out var rawUrl) && + else if (PathParameters.TryGetValue(RawUrlKey, out var rawUrl) && rawUrl is string rawUrlString) { URI = new Uri(rawUrlString); @@ -87,18 +87,18 @@ public Uri URI } else { - if(UrlTemplate?.IndexOf("{+baseurl}", StringComparison.OrdinalIgnoreCase) >= 0 && !PathParameters.ContainsKey("baseurl")) + if (UrlTemplate?.IndexOf("{+baseurl}", StringComparison.OrdinalIgnoreCase) >= 0 && !PathParameters.ContainsKey("baseurl")) throw new InvalidOperationException($"{nameof(PathParameters)} must contain a value for \"baseurl\" for the url to be built."); var substitutions = new Dictionary(); - foreach(var urlTemplateParameter in PathParameters) + foreach (var urlTemplateParameter in PathParameters) { substitutions.Add(urlTemplateParameter.Key, GetSanitizedValues(urlTemplateParameter.Value)); } - foreach(var queryStringParameter in QueryParameters) + foreach (var queryStringParameter in QueryParameters) { - if(queryStringParameter.Value != null) + if (queryStringParameter.Value != null) { substitutions.Add(queryStringParameter.Key, GetSanitizedValues(queryStringParameter.Value)); } @@ -157,8 +157,8 @@ public Uri URI public void AddQueryParameters(T source) #endif { - if(source == null) return; - foreach(var property in typeof(T) + if (source == null) return; + foreach (var property in typeof(T) .GetProperties() .Select( x => ( @@ -179,7 +179,7 @@ public void AddQueryParameters(T source) private static object[] ExpandArray(Array collection) { var passedArray = new object[collection.Length]; - for(var i = 0; i < collection.Length; i++) + for (var i = 0; i < collection.Length; i++) { passedArray[i] = GetSanitizedValue(collection.GetValue(i)!); } @@ -188,7 +188,7 @@ private static object[] ExpandArray(Array collection) private static object ReplaceEnumValueByStringRepresentation(object source) { - if(source is Enum enumValue && GetEnumName(enumValue) is string enumValueName) + if (source is Enum enumValue && GetEnumName(enumValue) is string enumValueName) { return enumValueName; } @@ -203,13 +203,17 @@ private static object ReplaceEnumValueByStringRepresentation(object source) { var type = value.GetType(); - if(Enum.GetName(type, value) is not { } name) + if (Enum.GetName(type, value) is not { } name) throw new ArgumentException($"Invalid Enum value {value} for enum of type {type}"); - if(type.GetField(name)?.GetCustomAttribute() is { } attribute) - return attribute.Value; +#if NET5_0_OR_GREATER + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern", + Justification = "Enumerating Enum fields is always trimming/AOT safe - https://github.com/dotnet/runtime/issues/97737")] +#endif + static string? GetEnumMemberValue(Type enumType, string name) => + enumType.GetField(name, BindingFlags.Static | BindingFlags.Public)?.GetCustomAttribute() is { } attribute ? attribute.Value : null; - return name.ToFirstCharacterLowerCase(); + return GetEnumMemberValue(type, name) ?? name.ToFirstCharacterLowerCase(); } /// /// The Request Headers. @@ -220,7 +224,7 @@ private static object ReplaceEnumValueByStringRepresentation(object source) /// public void AddHeaders(RequestHeaders headers) { - if(headers == null) return; + if (headers == null) return; Headers.AddAll(headers); } /// @@ -238,8 +242,8 @@ public void AddHeaders(RequestHeaders headers) /// The option to add. public void AddRequestOptions(IEnumerable options) { - if(options == null) return; - foreach(var option in options.Where(x => x != null)) + if (options == null) return; + foreach (var option in options.Where(x => x != null)) _requestOptions.AddOrReplace(option.GetType().FullName!, option); } /// @@ -248,8 +252,8 @@ public void AddRequestOptions(IEnumerable options) /// Options to remove. public void RemoveRequestOptions(params IRequestOption[] options) { - if(options.Length == 0) throw new ArgumentNullException(nameof(options)); - foreach(var optionName in options.Where(x => x != null).Select(x => x.GetType().FullName)) + if (options.Length == 0) throw new ArgumentNullException(nameof(options)); + foreach (var optionName in options.Where(x => x != null).Select(x => x.GetType().FullName)) _requestOptions.Remove(optionName!); } @@ -263,7 +267,7 @@ public void RemoveRequestOptions(params IRequestOption[] options) /// public void SetResponseHandler(IResponseHandler responseHandler) { - if(responseHandler == null) + if (responseHandler == null) throw new ArgumentNullException(nameof(responseHandler)); var responseHandlerOption = new ResponseHandlerOption @@ -322,7 +326,7 @@ public void SetContentFromParsable(IRequestAdapter requestAdapter, string con using var activity = _activitySource?.StartActivity(nameof(SetContentFromParsable)); using var writer = GetSerializationWriter(requestAdapter, contentType, item); SetRequestType(item, activity); - if(item is MultipartBody mpBody) + if (item is MultipartBody mpBody) { contentType += "; boundary=" + mpBody.Boundary; mpBody.RequestAdapter = requestAdapter; @@ -333,15 +337,15 @@ public void SetContentFromParsable(IRequestAdapter requestAdapter, string con } private static void SetRequestType(object? result, Activity? activity) { - if(activity == null) return; - if(result == null) return; + if (activity == null) return; + if (result == null) return; activity.SetTag("com.microsoft.kiota.request.type", result.GetType().FullName); } private static ISerializationWriter GetSerializationWriter(IRequestAdapter requestAdapter, string contentType, T item) { - if(string.IsNullOrEmpty(contentType)) throw new ArgumentNullException(nameof(contentType)); - if(requestAdapter == null) throw new ArgumentNullException(nameof(requestAdapter)); - if(item == null) throw new InvalidOperationException($"{nameof(item)} cannot be null"); + if (string.IsNullOrEmpty(contentType)) throw new ArgumentNullException(nameof(contentType)); + if (requestAdapter == null) throw new ArgumentNullException(nameof(requestAdapter)); + if (item == null) throw new InvalidOperationException($"{nameof(item)} cannot be null"); return requestAdapter.SerializationWriterFactory.GetSerializationWriter(contentType); } /// @@ -372,7 +376,7 @@ public void SetContentFromScalar(IRequestAdapter requestAdapter, string conte using var activity = _activitySource?.StartActivity(nameof(SetContentFromScalar)); using var writer = GetSerializationWriter(requestAdapter, contentType, item); SetRequestType(item, activity); - switch(item) + switch (item) { case string s: writer.WriteStringValue(null, s); diff --git a/src/serialization/IParseNode.cs b/src/serialization/IParseNode.cs index e9628dd3..422ef532 100644 --- a/src/serialization/IParseNode.cs +++ b/src/serialization/IParseNode.cs @@ -101,7 +101,7 @@ public interface IParseNode /// /// The collection of enum values. #if NET5_0_OR_GREATER - IEnumerable GetCollectionOfEnumValues<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]T>() where T : struct, Enum; + IEnumerable GetCollectionOfEnumValues<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] T>() where T : struct, Enum; #else IEnumerable GetCollectionOfEnumValues() where T : struct, Enum; #endif @@ -116,7 +116,7 @@ public interface IParseNode /// /// The enum value of the node. #if NET5_0_OR_GREATER - T? GetEnumValue<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]T>() where T : struct, Enum; + T? GetEnumValue<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] T>() where T : struct, Enum; #else T? GetEnumValue() where T : struct, Enum; #endif