diff --git a/src/Http/Http.Abstractions/src/Routing/Endpoint.cs b/src/Http/Http.Abstractions/src/Routing/Endpoint.cs index 4733177674ba..1f795f74ad42 100644 --- a/src/Http/Http.Abstractions/src/Routing/Endpoint.cs +++ b/src/Http/Http.Abstractions/src/Routing/Endpoint.cs @@ -20,8 +20,8 @@ public class Endpoint /// public Endpoint( RequestDelegate requestDelegate, - EndpointMetadataCollection metadata, - string displayName) + EndpointMetadataCollection? metadata, + string? displayName) { // All are allowed to be null RequestDelegate = requestDelegate; @@ -32,7 +32,7 @@ public Endpoint( /// /// Gets the informational display name of this endpoint. /// - public string DisplayName { get; } + public string? DisplayName { get; } /// /// Gets the collection of metadata associated with this endpoint. diff --git a/src/Http/Routing.Abstractions/src/IRouteConstraint.cs b/src/Http/Routing.Abstractions/src/IRouteConstraint.cs index 076706dcd9e6..37ea18c67230 100644 --- a/src/Http/Routing.Abstractions/src/IRouteConstraint.cs +++ b/src/Http/Routing.Abstractions/src/IRouteConstraint.cs @@ -25,7 +25,7 @@ public interface IRouteConstraint : IParameterPolicy /// true if the URL parameter contains a valid value; otherwise, false. bool Match( HttpContext? httpContext, - IRouter route, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection); diff --git a/src/Http/Routing/src/ArrayBuilder.cs b/src/Http/Routing/src/ArrayBuilder.cs index ff20c2e64dc5..ede0f990b618 100644 --- a/src/Http/Routing/src/ArrayBuilder.cs +++ b/src/Http/Routing/src/ArrayBuilder.cs @@ -6,6 +6,7 @@ // // See https://github.com/dotnet/corefx/blob/143df51926f2ad397fef9c9ca7ede88e2721e801/src/Common/src/System/Collections/Generic/ArrayBuilder.cs +#nullable disable using System; using System.Diagnostics; diff --git a/src/Http/Routing/src/Builder/EndpointRoutingApplicationBuilderExtensions.cs b/src/Http/Routing/src/Builder/EndpointRoutingApplicationBuilderExtensions.cs index d1d3617210e3..dbc343210739 100644 --- a/src/Http/Routing/src/Builder/EndpointRoutingApplicationBuilderExtensions.cs +++ b/src/Http/Routing/src/Builder/EndpointRoutingApplicationBuilderExtensions.cs @@ -128,7 +128,7 @@ private static void VerifyEndpointRoutingMiddlewareIsRegistered(IApplicationBuil } // If someone messes with this, just let it crash. - endpointRouteBuilder = (DefaultEndpointRouteBuilder)obj; + endpointRouteBuilder = (DefaultEndpointRouteBuilder)obj!; // This check handles the case where Map or something else that forks the pipeline is called between the two // routing middleware. diff --git a/src/Http/Routing/src/CompositeEndpointDataSource.cs b/src/Http/Routing/src/CompositeEndpointDataSource.cs index 008ad09a9cf9..9d0a97c832c8 100644 --- a/src/Http/Routing/src/CompositeEndpointDataSource.cs +++ b/src/Http/Routing/src/CompositeEndpointDataSource.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -6,6 +6,7 @@ using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; using System.Threading; @@ -21,8 +22,8 @@ namespace Microsoft.AspNetCore.Routing public sealed class CompositeEndpointDataSource : EndpointDataSource { private readonly object _lock; - private readonly ICollection _dataSources; - private IReadOnlyList _endpoints; + private readonly ICollection _dataSources = default!; + private IReadOnlyList _endpoints = default!; private IChangeToken _consumerChangeToken; private CancellationTokenSource _cts; @@ -49,7 +50,7 @@ public CompositeEndpointDataSource(IEnumerable endpointDataS } } - private void OnDataSourcesChanged(object sender, NotifyCollectionChangedEventArgs e) + private void OnDataSourcesChanged(object? sender, NotifyCollectionChangedEventArgs e) { lock (_lock) { @@ -140,6 +141,7 @@ private void HandleChange() } } + [MemberNotNull(nameof(_cts), nameof(_consumerChangeToken))] private void CreateChangeToken() { _cts = new CancellationTokenSource(); @@ -198,7 +200,7 @@ private string DebuggerDisplayString } return sb.ToString(); - IEnumerable FormatValues(IEnumerable> values) + IEnumerable FormatValues(IEnumerable> values) { return values.Select( kvp => diff --git a/src/Http/Routing/src/Constraints/BoolRouteConstraint.cs b/src/Http/Routing/src/Constraints/BoolRouteConstraint.cs index d19000f9debb..26a37c2e80d3 100644 --- a/src/Http/Routing/src/Constraints/BoolRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/BoolRouteConstraint.cs @@ -14,8 +14,8 @@ public class BoolRouteConstraint : IRouteConstraint { /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -44,4 +44,4 @@ public bool Match( return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/CompositeRouteConstraint.cs b/src/Http/Routing/src/Constraints/CompositeRouteConstraint.cs index 468699ce8a6f..023a32eae8ce 100644 --- a/src/Http/Routing/src/Constraints/CompositeRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/CompositeRouteConstraint.cs @@ -33,8 +33,8 @@ public CompositeRouteConstraint(IEnumerable constraints) /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -60,4 +60,4 @@ public bool Match( return true; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/DateTimeRouteConstraint.cs b/src/Http/Routing/src/Constraints/DateTimeRouteConstraint.cs index a912a84f52b6..2d7fdd1bc2c7 100644 --- a/src/Http/Routing/src/Constraints/DateTimeRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/DateTimeRouteConstraint.cs @@ -20,8 +20,8 @@ public class DateTimeRouteConstraint : IRouteConstraint { /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -50,4 +50,4 @@ public bool Match( return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/DecimalRouteConstraint.cs b/src/Http/Routing/src/Constraints/DecimalRouteConstraint.cs index 9fcc80a9f17d..b08d13d5154e 100644 --- a/src/Http/Routing/src/Constraints/DecimalRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/DecimalRouteConstraint.cs @@ -14,8 +14,8 @@ public class DecimalRouteConstraint : IRouteConstraint { /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -44,4 +44,4 @@ public bool Match( return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/DoubleRouteConstraint.cs b/src/Http/Routing/src/Constraints/DoubleRouteConstraint.cs index 405e46cb0d2e..e3c351d3e869 100644 --- a/src/Http/Routing/src/Constraints/DoubleRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/DoubleRouteConstraint.cs @@ -14,8 +14,8 @@ public class DoubleRouteConstraint : IRouteConstraint { /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -48,4 +48,4 @@ public bool Match( return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/FileNameRouteConstraint.cs b/src/Http/Routing/src/Constraints/FileNameRouteConstraint.cs index 50d85eb86ff8..0051ef3fb121 100644 --- a/src/Http/Routing/src/Constraints/FileNameRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/FileNameRouteConstraint.cs @@ -85,8 +85,8 @@ public class FileNameRouteConstraint : IRouteConstraint { /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) diff --git a/src/Http/Routing/src/Constraints/FloatRouteConstraint.cs b/src/Http/Routing/src/Constraints/FloatRouteConstraint.cs index fbdd3c87d6c6..5108da1bcb95 100644 --- a/src/Http/Routing/src/Constraints/FloatRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/FloatRouteConstraint.cs @@ -14,8 +14,8 @@ public class FloatRouteConstraint : IRouteConstraint { /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -48,4 +48,4 @@ public bool Match( return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/GuidRouteConstraint.cs b/src/Http/Routing/src/Constraints/GuidRouteConstraint.cs index b87069df986a..101621c068e8 100644 --- a/src/Http/Routing/src/Constraints/GuidRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/GuidRouteConstraint.cs @@ -16,8 +16,8 @@ public class GuidRouteConstraint : IRouteConstraint { /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -46,4 +46,4 @@ public bool Match( return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/HttpMethodRouteConstraint.cs b/src/Http/Routing/src/Constraints/HttpMethodRouteConstraint.cs index ea20e8141977..b2ad0eff33a2 100644 --- a/src/Http/Routing/src/Constraints/HttpMethodRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/HttpMethodRouteConstraint.cs @@ -35,8 +35,8 @@ public HttpMethodRouteConstraint(params string[] allowedMethods) /// public virtual bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) diff --git a/src/Http/Routing/src/Constraints/IntRouteConstraint.cs b/src/Http/Routing/src/Constraints/IntRouteConstraint.cs index 34ff02331e24..6190180858c4 100644 --- a/src/Http/Routing/src/Constraints/IntRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/IntRouteConstraint.cs @@ -14,8 +14,8 @@ public class IntRouteConstraint : IRouteConstraint { /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -44,4 +44,4 @@ public bool Match( return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/LengthRouteConstraint.cs b/src/Http/Routing/src/Constraints/LengthRouteConstraint.cs index 8964f2549eef..52fecb9d4224 100644 --- a/src/Http/Routing/src/Constraints/LengthRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/LengthRouteConstraint.cs @@ -71,8 +71,8 @@ public LengthRouteConstraint(int minLength, int maxLength) /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -89,7 +89,7 @@ public bool Match( if (values.TryGetValue(routeKey, out var value) && value != null) { - var valueString = Convert.ToString(value, CultureInfo.InvariantCulture); + var valueString = Convert.ToString(value, CultureInfo.InvariantCulture)!; var length = valueString.Length; return length >= MinLength && length <= MaxLength; } @@ -97,4 +97,4 @@ public bool Match( return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/LongRouteConstraint.cs b/src/Http/Routing/src/Constraints/LongRouteConstraint.cs index 8ed5cccc467e..493be38eb1b8 100644 --- a/src/Http/Routing/src/Constraints/LongRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/LongRouteConstraint.cs @@ -14,8 +14,8 @@ public class LongRouteConstraint : IRouteConstraint { /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -44,4 +44,4 @@ public bool Match( return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/MaxLengthRouteConstraint.cs b/src/Http/Routing/src/Constraints/MaxLengthRouteConstraint.cs index 4005a041aaa4..470f9110d832 100644 --- a/src/Http/Routing/src/Constraints/MaxLengthRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/MaxLengthRouteConstraint.cs @@ -34,8 +34,8 @@ public MaxLengthRouteConstraint(int maxLength) /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -52,11 +52,11 @@ public bool Match( if (values.TryGetValue(routeKey, out var value) && value != null) { - var valueString = Convert.ToString(value, CultureInfo.InvariantCulture); + var valueString = Convert.ToString(value, CultureInfo.InvariantCulture)!; return valueString.Length <= MaxLength; } return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/MaxRouteConstraint.cs b/src/Http/Routing/src/Constraints/MaxRouteConstraint.cs index dab22f5075ff..c7d5e91dfef5 100644 --- a/src/Http/Routing/src/Constraints/MaxRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/MaxRouteConstraint.cs @@ -28,8 +28,8 @@ public MaxRouteConstraint(long max) /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -56,4 +56,4 @@ public bool Match( return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/MinLengthRouteConstraint.cs b/src/Http/Routing/src/Constraints/MinLengthRouteConstraint.cs index c58bd0b30d80..9c7b54704bcb 100644 --- a/src/Http/Routing/src/Constraints/MinLengthRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/MinLengthRouteConstraint.cs @@ -34,8 +34,8 @@ public MinLengthRouteConstraint(int minLength) /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -52,11 +52,11 @@ public bool Match( if (values.TryGetValue(routeKey, out var value) && value != null) { - var valueString = Convert.ToString(value, CultureInfo.InvariantCulture); + var valueString = Convert.ToString(value, CultureInfo.InvariantCulture)!; return valueString.Length >= MinLength; } return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/MinRouteConstraint.cs b/src/Http/Routing/src/Constraints/MinRouteConstraint.cs index 450ed46fbf73..ef504f446d24 100644 --- a/src/Http/Routing/src/Constraints/MinRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/MinRouteConstraint.cs @@ -28,8 +28,8 @@ public MinRouteConstraint(long min) /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -56,4 +56,4 @@ public bool Match( return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/NonFileNameRouteConstraint.cs b/src/Http/Routing/src/Constraints/NonFileNameRouteConstraint.cs index c6867b6e05ba..9d58423b9ae5 100644 --- a/src/Http/Routing/src/Constraints/NonFileNameRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/NonFileNameRouteConstraint.cs @@ -81,8 +81,8 @@ public class NonFileNameRouteConstraint : IRouteConstraint { /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) diff --git a/src/Http/Routing/src/Constraints/NullRouteConstraint.cs b/src/Http/Routing/src/Constraints/NullRouteConstraint.cs index f61e74041945..7accfcb16623 100644 --- a/src/Http/Routing/src/Constraints/NullRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/NullRouteConstraint.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNetCore.Http; @@ -13,7 +13,7 @@ private NullRouteConstraint() { } - public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) + public bool Match(HttpContext? httpContext, IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { return true; } diff --git a/src/Http/Routing/src/Constraints/OptionalRouteConstraint.cs b/src/Http/Routing/src/Constraints/OptionalRouteConstraint.cs index 6b7cf8a1a5ad..f66bdd67de9b 100644 --- a/src/Http/Routing/src/Constraints/OptionalRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/OptionalRouteConstraint.cs @@ -24,8 +24,8 @@ public OptionalRouteConstraint(IRouteConstraint innerConstraint) public IRouteConstraint InnerConstraint { get; } public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -52,4 +52,4 @@ public bool Match( return true; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/RangeRouteConstraint.cs b/src/Http/Routing/src/Constraints/RangeRouteConstraint.cs index 34c946fa6623..3e7dde78cb17 100644 --- a/src/Http/Routing/src/Constraints/RangeRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/RangeRouteConstraint.cs @@ -42,8 +42,8 @@ public RangeRouteConstraint(long min, long max) /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -70,4 +70,4 @@ public bool Match( return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/RegexRouteConstraint.cs b/src/Http/Routing/src/Constraints/RegexRouteConstraint.cs index 9269de51a30c..4d17f5d7ea37 100644 --- a/src/Http/Routing/src/Constraints/RegexRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/RegexRouteConstraint.cs @@ -38,8 +38,8 @@ public RegexRouteConstraint(string regexPattern) public Regex Constraint { get; private set; } public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -57,7 +57,7 @@ public bool Match( if (values.TryGetValue(routeKey, out var routeValue) && routeValue != null) { - var parameterValueString = Convert.ToString(routeValue, CultureInfo.InvariantCulture); + var parameterValueString = Convert.ToString(routeValue, CultureInfo.InvariantCulture)!; return Constraint.IsMatch(parameterValueString); } diff --git a/src/Http/Routing/src/Constraints/RequiredRouteConstraint.cs b/src/Http/Routing/src/Constraints/RequiredRouteConstraint.cs index e33e1e23a667..71b594a07b20 100644 --- a/src/Http/Routing/src/Constraints/RequiredRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/RequiredRouteConstraint.cs @@ -18,8 +18,8 @@ public class RequiredRouteConstraint : IRouteConstraint { /// public bool Match( - HttpContext httpContext, - IRouter route, + HttpContext? httpContext, + IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) @@ -44,4 +44,4 @@ public bool Match( return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Constraints/StringRouteConstraint.cs b/src/Http/Routing/src/Constraints/StringRouteConstraint.cs index fb6a3568c340..737cf228128f 100644 --- a/src/Http/Routing/src/Constraints/StringRouteConstraint.cs +++ b/src/Http/Routing/src/Constraints/StringRouteConstraint.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -29,7 +29,7 @@ public StringRouteConstraint(string value) } /// - public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) + public bool Match(HttpContext? httpContext, IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { if (routeKey == null) { @@ -44,7 +44,7 @@ public bool Match(HttpContext httpContext, IRouter route, string routeKey, Route if (values.TryGetValue(routeKey, out var routeValue) && routeValue != null) { - var parameterValueString = Convert.ToString(routeValue, CultureInfo.InvariantCulture); + var parameterValueString = Convert.ToString(routeValue, CultureInfo.InvariantCulture)!; return parameterValueString.Equals(_value, StringComparison.OrdinalIgnoreCase); } @@ -52,4 +52,4 @@ public bool Match(HttpContext httpContext, IRouter route, string routeKey, Route return false; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/DataSourceDependentCache.cs b/src/Http/Routing/src/DataSourceDependentCache.cs index f31807e171ca..53b8572694ef 100644 --- a/src/Http/Routing/src/DataSourceDependentCache.cs +++ b/src/Http/Routing/src/DataSourceDependentCache.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Collections.Generic; using System.Threading; diff --git a/src/Http/Routing/src/DecisionTree/DecisionCriterion.cs b/src/Http/Routing/src/DecisionTree/DecisionCriterion.cs index efc9c742d26d..ce8ec1149893 100644 --- a/src/Http/Routing/src/DecisionTree/DecisionCriterion.cs +++ b/src/Http/Routing/src/DecisionTree/DecisionCriterion.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System.Collections.Generic; namespace Microsoft.AspNetCore.Routing.DecisionTree @@ -11,4 +13,4 @@ internal class DecisionCriterion public Dictionary> Branches { get; set; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/DecisionTree/DecisionTreeNode.cs b/src/Http/Routing/src/DecisionTree/DecisionTreeNode.cs index 1be3064c622f..df2809778692 100644 --- a/src/Http/Routing/src/DecisionTree/DecisionTreeNode.cs +++ b/src/Http/Routing/src/DecisionTree/DecisionTreeNode.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System.Collections.Generic; namespace Microsoft.AspNetCore.Routing.DecisionTree @@ -17,4 +19,4 @@ internal class DecisionTreeNode // matching the input data. public IList> Criteria { get; set; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/DecisionTree/ItemDescriptor.cs b/src/Http/Routing/src/DecisionTree/ItemDescriptor.cs index 84a6279c27a1..e5146f98c4b6 100644 --- a/src/Http/Routing/src/DecisionTree/ItemDescriptor.cs +++ b/src/Http/Routing/src/DecisionTree/ItemDescriptor.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System.Collections.Generic; namespace Microsoft.AspNetCore.Routing.DecisionTree @@ -13,4 +15,4 @@ internal class ItemDescriptor public TItem Item { get; set; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/DefaultLinkGenerator.cs b/src/Http/Routing/src/DefaultLinkGenerator.cs index 2dda3328589e..e080aaec50b0 100644 --- a/src/Http/Routing/src/DefaultLinkGenerator.cs +++ b/src/Http/Routing/src/DefaultLinkGenerator.cs @@ -325,7 +325,7 @@ internal bool TryProcessTemplate( } // Also called from DefaultLinkGenerationTemplate - public static RouteValueDictionary? GetAmbientValues(HttpContext httpContext) + public static RouteValueDictionary? GetAmbientValues(HttpContext? httpContext) { return httpContext?.Features.Get()?.RouteValues; } diff --git a/src/Http/Routing/src/DefaultLinkParser.cs b/src/Http/Routing/src/DefaultLinkParser.cs index 8c922e2668bd..07aaacbb0371 100644 --- a/src/Http/Routing/src/DefaultLinkParser.cs +++ b/src/Http/Routing/src/DefaultLinkParser.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; @@ -46,7 +47,7 @@ public DefaultLinkParser( _createMatcher = CreateRoutePatternMatcher; } - public override RouteValueDictionary ParsePathByAddress(TAddress address, PathString path) + public override RouteValueDictionary? ParsePathByAddress(TAddress address, PathString path) { var endpoints = GetEndpoints(address); if (endpoints.Count == 0) @@ -117,7 +118,7 @@ private MatcherState CreateRoutePatternMatcher(RouteEndpoint endpoint) internal MatcherState GetMatcherState(RouteEndpoint endpoint) => _matcherCache.EnsureInitialized().GetOrAdd(endpoint, _createMatcher); // Internal for testing - internal bool TryParse(RouteEndpoint endpoint, PathString path, out RouteValueDictionary values) + internal bool TryParse(RouteEndpoint endpoint, PathString path, [NotNullWhen(true)] out RouteValueDictionary? values) { var (matcher, constraints) = GetMatcherState(endpoint); @@ -168,6 +169,7 @@ public void Deconstruct(out RoutePatternMatcher matcher, out Dictionary _executingEndpoint = LoggerMessage.Define( diff --git a/src/Http/Routing/src/EndpointNameAddressScheme.cs b/src/Http/Routing/src/EndpointNameAddressScheme.cs index 9d2753cf5252..24799d2d39a0 100644 --- a/src/Http/Routing/src/EndpointNameAddressScheme.cs +++ b/src/Http/Routing/src/EndpointNameAddressScheme.cs @@ -92,7 +92,7 @@ private static Dictionary Initialize(IReadOnlyList throw new InvalidOperationException(builder.ToString()); - string GetEndpointName(Endpoint endpoint) + string? GetEndpointName(Endpoint endpoint) { if (endpoint.Metadata.GetMetadata()?.SuppressLinkGeneration == true) { diff --git a/src/Http/Routing/src/EndpointRoutingMiddleware.cs b/src/Http/Routing/src/EndpointRoutingMiddleware.cs index 482e86bb6dc0..82c841941c7b 100644 --- a/src/Http/Routing/src/EndpointRoutingMiddleware.cs +++ b/src/Http/Routing/src/EndpointRoutingMiddleware.cs @@ -22,7 +22,7 @@ internal sealed class EndpointRoutingMiddleware private readonly DiagnosticListener _diagnosticListener; private readonly RequestDelegate _next; - private Task _initializationTask; + private Task? _initializationTask; public EndpointRoutingMiddleware( MatcherFactory matcherFactory, @@ -165,6 +165,7 @@ private Task InitializeCoreAsync() } } +#nullable disable private static class Log { private static readonly Action _matchSuccess = LoggerMessage.Define( diff --git a/src/Http/Routing/src/InlineRouteParameterParser.cs b/src/Http/Routing/src/InlineRouteParameterParser.cs index 33c70558f269..49dd434d37d1 100644 --- a/src/Http/Routing/src/InlineRouteParameterParser.cs +++ b/src/Http/Routing/src/InlineRouteParameterParser.cs @@ -75,7 +75,7 @@ public static TemplatePart ParseRouteParameter(string routeParameter) var parseResults = ParseConstraints(routeParameter, currentIndex, endIndex); currentIndex = parseResults.CurrentIndex; - string defaultValue = null; + string? defaultValue = null; if (currentIndex <= endIndex && routeParameter[currentIndex] == '=') { diff --git a/src/Http/Routing/src/LinkGeneratorEndpointNameAddressExtensions.cs b/src/Http/Routing/src/LinkGeneratorEndpointNameAddressExtensions.cs index dd0e462c2079..bc6ca2fc241c 100644 --- a/src/Http/Routing/src/LinkGeneratorEndpointNameAddressExtensions.cs +++ b/src/Http/Routing/src/LinkGeneratorEndpointNameAddressExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNetCore.Http; @@ -27,14 +27,14 @@ public static class LinkGeneratorEndpointNameAddressExtensions /// names from RouteOptions. /// /// A URI with an absolute path, or null. - public static string GetPathByName( + public static string? GetPathByName( this LinkGenerator generator, HttpContext httpContext, string endpointName, - object values, + object? values, PathString? pathBase = default, FragmentString fragment = default, - LinkOptions options = default) + LinkOptions? options = default) { if (generator == null) { @@ -74,13 +74,13 @@ public static string GetPathByName( /// names from RouteOptions. /// /// A URI with an absolute path, or null. - public static string GetPathByName( + public static string? GetPathByName( this LinkGenerator generator, string endpointName, - object values, + object? values, PathString pathBase = default, FragmentString fragment = default, - LinkOptions options = default) + LinkOptions? options = default) { if (generator == null) { @@ -126,16 +126,16 @@ public static string GetPathByName( /// your deployment environment. /// /// - public static string GetUriByName( + public static string? GetUriByName( this LinkGenerator generator, HttpContext httpContext, string endpointName, - object values, - string scheme = default, + object? values, + string? scheme = default, HostString? host = default, PathString? pathBase = default, FragmentString fragment = default, - LinkOptions options = default) + LinkOptions? options = default) { if (generator == null) { @@ -190,15 +190,15 @@ public static string GetUriByName( /// your deployment environment. /// /// - public static string GetUriByName( + public static string? GetUriByName( this LinkGenerator generator, string endpointName, - object values, + object? values, string scheme, HostString host, PathString pathBase = default, FragmentString fragment = default, - LinkOptions options = default) + LinkOptions? options = default) { if (generator == null) { diff --git a/src/Http/Routing/src/LinkGeneratorRouteValuesAddressExtensions.cs b/src/Http/Routing/src/LinkGeneratorRouteValuesAddressExtensions.cs index f683b4d3cad5..ddf4bb9e917e 100644 --- a/src/Http/Routing/src/LinkGeneratorRouteValuesAddressExtensions.cs +++ b/src/Http/Routing/src/LinkGeneratorRouteValuesAddressExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNetCore.Http; @@ -27,14 +27,14 @@ public static class LinkGeneratorRouteValuesAddressExtensions /// names from RouteOptions. /// /// A URI with an absolute path, or null. - public static string GetPathByRouteValues( + public static string? GetPathByRouteValues( this LinkGenerator generator, HttpContext httpContext, - string routeName, - object values, + string? routeName, + object? values, PathString? pathBase = default, FragmentString fragment = default, - LinkOptions options = default) + LinkOptions? options = default) { if (generator == null) { @@ -70,13 +70,13 @@ public static string GetPathByRouteValues( /// names from RouteOptions. /// /// A URI with an absolute path, or null. - public static string GetPathByRouteValues( + public static string? GetPathByRouteValues( this LinkGenerator generator, - string routeName, - object values, + string? routeName, + object? values, PathString pathBase = default, FragmentString fragment = default, - LinkOptions options = default) + LinkOptions? options = default) { if (generator == null) { @@ -118,16 +118,16 @@ public static string GetPathByRouteValues( /// your deployment environment. /// /// - public static string GetUriByRouteValues( + public static string? GetUriByRouteValues( this LinkGenerator generator, HttpContext httpContext, - string routeName, - object values, - string scheme = default, + string? routeName, + object? values, + string? scheme = default, HostString? host = default, PathString? pathBase = default, FragmentString fragment = default, - LinkOptions options = default) + LinkOptions? options = default) { if (generator == null) { @@ -178,15 +178,15 @@ public static string GetUriByRouteValues( /// your deployment environment. /// /// - public static string GetUriByRouteValues( + public static string? GetUriByRouteValues( this LinkGenerator generator, - string routeName, - object values, + string? routeName, + object? values, string scheme, HostString host, PathString pathBase = default, FragmentString fragment = default, - LinkOptions options = default) + LinkOptions? options = default) { if (generator == null) { @@ -197,7 +197,7 @@ public static string GetUriByRouteValues( return generator.GetUriByAddress(address, address.ExplicitValues, scheme, host, pathBase, fragment, options); } - private static RouteValuesAddress CreateAddress(HttpContext httpContext, string routeName, object values) + private static RouteValuesAddress CreateAddress(HttpContext? httpContext, string? routeName, object? values) { return new RouteValuesAddress() { diff --git a/src/Http/Routing/src/LinkParser.cs b/src/Http/Routing/src/LinkParser.cs index b5135b3f014e..88ed8c8131d0 100644 --- a/src/Http/Routing/src/LinkParser.cs +++ b/src/Http/Routing/src/LinkParser.cs @@ -32,6 +32,6 @@ public abstract class LinkParser /// of the route patterns match the provided URI path. /// /// - public abstract RouteValueDictionary ParsePathByAddress(TAddress address, PathString path); + public abstract RouteValueDictionary? ParsePathByAddress(TAddress address, PathString path); } } diff --git a/src/Http/Routing/src/LinkParserEndpointNameAddressExtensions.cs b/src/Http/Routing/src/LinkParserEndpointNameAddressExtensions.cs index 904dc0b885bc..2217a8eb45b4 100644 --- a/src/Http/Routing/src/LinkParserEndpointNameAddressExtensions.cs +++ b/src/Http/Routing/src/LinkParserEndpointNameAddressExtensions.cs @@ -33,7 +33,7 @@ public static class LinkParserEndpointNameAddressExtensions /// of the route patterns match the provided URI path. /// /// - public static RouteValueDictionary ParsePathByEndpointName( + public static RouteValueDictionary? ParsePathByEndpointName( this LinkParser parser, string endpointName, PathString path) diff --git a/src/Http/Routing/src/Logging/RouteConstraintMatcherExtensions.cs b/src/Http/Routing/src/Logging/RouteConstraintMatcherExtensions.cs index afa7337e757b..9415831bdc02 100644 --- a/src/Http/Routing/src/Logging/RouteConstraintMatcherExtensions.cs +++ b/src/Http/Routing/src/Logging/RouteConstraintMatcherExtensions.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Routing.Logging { internal static class RouteConstraintMatcherExtensions { - private static readonly Action _constraintNotMatched; + private static readonly Action _constraintNotMatched; static RouteConstraintMatcherExtensions() { diff --git a/src/Http/Routing/src/Logging/RouterMiddlewareLoggerExtensions.cs b/src/Http/Routing/src/Logging/RouterMiddlewareLoggerExtensions.cs index cdbd64477510..76f569c1508f 100644 --- a/src/Http/Routing/src/Logging/RouterMiddlewareLoggerExtensions.cs +++ b/src/Http/Routing/src/Logging/RouterMiddlewareLoggerExtensions.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Routing.Logging { internal static class RouterMiddlewareLoggerExtensions { - private static readonly Action _requestNotMatched; + private static readonly Action _requestNotMatched; static RouterMiddlewareLoggerExtensions() { diff --git a/src/Http/Routing/src/Logging/TreeRouterLoggerExtensions.cs b/src/Http/Routing/src/Logging/TreeRouterLoggerExtensions.cs index e6733263f94f..bcb0f343a779 100644 --- a/src/Http/Routing/src/Logging/TreeRouterLoggerExtensions.cs +++ b/src/Http/Routing/src/Logging/TreeRouterLoggerExtensions.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Routing.Logging { internal static class TreeRouterLoggerExtensions { - private static readonly Action _requestMatchedRoute; + private static readonly Action _requestMatchedRoute; static TreeRouterLoggerExtensions() { diff --git a/src/Http/Routing/src/MapRouteRouteBuilderExtensions.cs b/src/Http/Routing/src/MapRouteRouteBuilderExtensions.cs index 23f4536b9b1a..56f91c40506a 100644 --- a/src/Http/Routing/src/MapRouteRouteBuilderExtensions.cs +++ b/src/Http/Routing/src/MapRouteRouteBuilderExtensions.cs @@ -154,7 +154,7 @@ public BackCompatInlineConstraintResolver(IInlineConstraintResolver inner, Param return routeConstraint; } - var parameterPolicy = _parameterPolicyFactory.Create(null, inlineConstraint); + var parameterPolicy = _parameterPolicyFactory.Create(null!, inlineConstraint); if (parameterPolicy != null) { // Logic inside Route will skip adding NullRouteConstraint diff --git a/src/Http/Routing/src/Matching/CandidateSet.cs b/src/Http/Routing/src/Matching/CandidateSet.cs index f90183897db1..0d07dc594004 100644 --- a/src/Http/Routing/src/Matching/CandidateSet.cs +++ b/src/Http/Routing/src/Matching/CandidateSet.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Runtime.CompilerServices; using Microsoft.AspNetCore.Http; @@ -176,15 +177,17 @@ internal static void SetValidity(ref CandidateState candidate, bool value) /// The to replace the original at /// the . /// - public void ReplaceEndpoint(int index, Endpoint endpoint, RouteValueDictionary values) + public void ReplaceEndpoint(int index, Endpoint? endpoint, RouteValueDictionary? values) { // Friendliness for inlining if ((uint)index >= Count) { ThrowIndexArgumentOutOfRangeException(); } - - Candidates[index] = new CandidateState(endpoint, values, Candidates[index].Score); + + // CandidateState allows a null-valued endpoint. However a validate candidate should never have a null endpoint + // We'll make lives easier for matcher policies by declaring it as non-null. + Candidates[index] = new CandidateState(endpoint!, values, Candidates[index].Score); if (endpoint == null) { @@ -354,7 +357,7 @@ private void ValidateUniqueScore(int index) { if (GetOriginalScore(i) == score) { - duplicates.Add(candidates[i].Endpoint); + duplicates.Add(candidates[i].Endpoint!); } } @@ -366,11 +369,13 @@ private void ValidateUniqueScore(int index) } } + [DoesNotReturn] private static void ThrowIndexArgumentOutOfRangeException() { throw new ArgumentOutOfRangeException("index"); } + [DoesNotReturn] private static void ThrowArgumentNullException(string parameter) { throw new ArgumentNullException(parameter); diff --git a/src/Http/Routing/src/Matching/CandidateState.cs b/src/Http/Routing/src/Matching/CandidateState.cs index 5b198beb8ebc..14b8591c6880 100644 --- a/src/Http/Routing/src/Matching/CandidateState.cs +++ b/src/Http/Routing/src/Matching/CandidateState.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNetCore.Http; @@ -17,7 +17,7 @@ internal CandidateState(Endpoint endpoint, int score) Values = null; } - internal CandidateState(Endpoint endpoint, RouteValueDictionary values, int score) + internal CandidateState(Endpoint endpoint, RouteValueDictionary? values, int score) { Endpoint = endpoint; Values = values; @@ -50,6 +50,6 @@ internal CandidateState(Endpoint endpoint, RouteValueDictionary values, int scor /// Gets associated with the /// and the current request. /// - public RouteValueDictionary Values { get; internal set; } + public RouteValueDictionary? Values { get; internal set; } } } diff --git a/src/Http/Routing/src/Matching/DataSourceDependentMatcher.cs b/src/Http/Routing/src/Matching/DataSourceDependentMatcher.cs index c757b1646ec9..bf6c02102eb9 100644 --- a/src/Http/Routing/src/Matching/DataSourceDependentMatcher.cs +++ b/src/Http/Routing/src/Matching/DataSourceDependentMatcher.cs @@ -57,10 +57,10 @@ private Matcher CreateMatcher(IReadOnlyList endpoints) public sealed class Lifetime : IDisposable { private readonly object _lock = new object(); - private DataSourceDependentCache _cache; + private DataSourceDependentCache? _cache; private bool _disposed; - public DataSourceDependentCache Cache + public DataSourceDependentCache? Cache { get => _cache; set diff --git a/src/Http/Routing/src/Matching/DefaultEndpointSelector.cs b/src/Http/Routing/src/Matching/DefaultEndpointSelector.cs index cc455d4eb7b1..31c863a5a9ac 100644 --- a/src/Http/Routing/src/Matching/DefaultEndpointSelector.cs +++ b/src/Http/Routing/src/Matching/DefaultEndpointSelector.cs @@ -47,7 +47,7 @@ internal static void Select(HttpContext httpContext, CandidateState[] candidateS if (CandidateSet.IsValidCandidate(ref state)) { httpContext.SetEndpoint(state.Endpoint); - httpContext.Request.RouteValues = state.Values; + httpContext.Request.RouteValues = state.Values!; } break; @@ -67,8 +67,8 @@ private static void ProcessFinalCandidates( HttpContext httpContext, CandidateState[] candidateState) { - Endpoint endpoint = null; - RouteValueDictionary values = null; + Endpoint? endpoint = null; + RouteValueDictionary? values = null; int? foundScore = null; for (var i = 0; i < candidateState.Length; i++) { @@ -110,7 +110,7 @@ private static void ProcessFinalCandidates( if (endpoint != null) { httpContext.SetEndpoint(endpoint); - httpContext.Request.RouteValues = values; + httpContext.Request.RouteValues = values!; } } diff --git a/src/Http/Routing/src/Matching/DfaMatcher.cs b/src/Http/Routing/src/Matching/DfaMatcher.cs index d79f13e2abac..e40e21e252a9 100644 --- a/src/Http/Routing/src/Matching/DfaMatcher.cs +++ b/src/Http/Routing/src/Matching/DfaMatcher.cs @@ -40,7 +40,7 @@ public sealed override Task MatchAsync(HttpContext httpContext) // The sequence of actions we take is optimized to avoid doing expensive work // like creating substrings, creating route value dictionaries, and calling // into policies like versioning. - var path = httpContext.Request.Path.Value; + var path = httpContext.Request.Path.Value!; // First tokenize the path into series of segments. Span buffer = stackalloc PathSegment[_maxSegmentCount]; @@ -119,7 +119,7 @@ public sealed override Task MatchAsync(HttpContext httpContext) // We want to create a new array for the route values based on Slots // as a prototype. var prototype = candidate.Slots; - var slots = new KeyValuePair[prototype.Length]; + var slots = new KeyValuePair[prototype.Length]; if ((flags & Candidate.CandidateFlags.HasDefaults) != 0) { @@ -221,7 +221,7 @@ public sealed override Task MatchAsync(HttpContext httpContext) } private void ProcessCaptures( - KeyValuePair[] slots, + KeyValuePair[] slots, (string parameterName, int segmentIndex, int slotIndex)[] captures, string path, ReadOnlySpan segments) @@ -235,7 +235,7 @@ private void ProcessCaptures( var segment = segments[segmentIndex]; if (parameterName != null && segment.Length > 0) { - slots[slotIndex] = new KeyValuePair( + slots[slotIndex] = new KeyValuePair( parameterName, path.Substring(segment.Start, segment.Length)); } @@ -244,7 +244,7 @@ private void ProcessCaptures( } private void ProcessCatchAll( - KeyValuePair[] slots, + KeyValuePair[] slots, in (string parameterName, int segmentIndex, int slotIndex) catchAll, string path, ReadOnlySpan segments) @@ -255,7 +255,7 @@ private void ProcessCatchAll( if ((uint)segmentIndex < (uint)segments.Length) { var segment = segments[segmentIndex]; - slots[catchAll.slotIndex] = new KeyValuePair( + slots[catchAll.slotIndex] = new KeyValuePair( catchAll.parameterName, path.Substring(segment.Start)); } @@ -333,6 +333,7 @@ internal static class EventIds public static readonly EventId CandidateValid = new EventId(1005, "CandiateValid"); } +#nullable disable private static class Logger { private static readonly Action _candidatesNotFound = LoggerMessage.Define( diff --git a/src/Http/Routing/src/Matching/DfaMatcherBuilder.cs b/src/Http/Routing/src/Matching/DfaMatcherBuilder.cs index 2782f8a3ae5e..c10c34d12b59 100644 --- a/src/Http/Routing/src/Matching/DfaMatcherBuilder.cs +++ b/src/Http/Routing/src/Matching/DfaMatcherBuilder.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Collections.Generic; using System.Linq; diff --git a/src/Http/Routing/src/Matching/DfaNode.cs b/src/Http/Routing/src/Matching/DfaNode.cs index 602a48a0e267..b0ba4b9887d0 100644 --- a/src/Http/Routing/src/Matching/DfaNode.cs +++ b/src/Http/Routing/src/Matching/DfaNode.cs @@ -1,6 +1,8 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/src/Http/Routing/src/Matching/EndpointComparer.cs b/src/Http/Routing/src/Matching/EndpointComparer.cs index 7df5de8ea42e..b76802f2e638 100644 --- a/src/Http/Routing/src/Matching/EndpointComparer.cs +++ b/src/Http/Routing/src/Matching/EndpointComparer.cs @@ -38,7 +38,7 @@ public EndpointComparer(IEndpointComparerPolicy[] policies) } } - public int Compare(Endpoint x, Endpoint y) + public int Compare(Endpoint? x, Endpoint? y) { // We don't expose this publicly, and we should never call it on // a null endpoint. @@ -74,7 +74,7 @@ private int ComparePattern(Endpoint x, Endpoint y) return 0; } - public bool Equals(Endpoint x, Endpoint y) + public bool Equals(Endpoint? x, Endpoint? y) { // We don't expose this publicly, and we should never call it on // a null endpoint. @@ -109,7 +109,7 @@ private class OrderComparer : IComparer { public static readonly IComparer Instance = new OrderComparer(); - public int Compare(Endpoint x, Endpoint y) + public int Compare(Endpoint? x, Endpoint? y) { var routeEndpointX = x as RouteEndpoint; var routeEndpointY = y as RouteEndpoint; @@ -136,7 +136,7 @@ private class PrecedenceComparer : IComparer { public static readonly IComparer Instance = new PrecedenceComparer(); - public int Compare(Endpoint x, Endpoint y) + public int Compare(Endpoint? x, Endpoint? y) { var routeEndpointX = x as RouteEndpoint; var routeEndpointY = y as RouteEndpoint; diff --git a/src/Http/Routing/src/Matching/HostMatcherPolicy.cs b/src/Http/Routing/src/Matching/HostMatcherPolicy.cs index be6f5bbf847a..d0f29612e469 100644 --- a/src/Http/Routing/src/Matching/HostMatcherPolicy.cs +++ b/src/Http/Routing/src/Matching/HostMatcherPolicy.cs @@ -342,7 +342,7 @@ private static (string host, int? port) GetHostAndPort(HttpContext httpContext) private class HostMetadataEndpointComparer : EndpointMetadataComparer { - protected override int CompareMetadata(IHostMetadata x, IHostMetadata y) + protected override int CompareMetadata(IHostMetadata? x, IHostMetadata? y) { // Ignore the metadata if it has an empty list of hosts. return base.CompareMetadata( @@ -391,9 +391,9 @@ public override int GetDestination(HttpContext httpContext) public readonly int? Port; public readonly string Host; - private readonly string _wildcardEndsWith; + private readonly string? _wildcardEndsWith; - public EdgeKey(string host, int? port) + public EdgeKey(string? host, int? port) { Host = host ?? WildcardHost; Port = port; @@ -421,9 +421,9 @@ public int CompareTo(EdgeKey other) return Comparer.Default.Compare(Port, other.Port); } - public int CompareTo(object obj) + public int CompareTo(object? obj) { - return CompareTo((EdgeKey)obj); + return CompareTo((EdgeKey)obj!); } public bool Equals(EdgeKey other) @@ -437,7 +437,7 @@ public bool MatchHost(string host) { if (HasHostWildcard) { - return host.EndsWith(_wildcardEndsWith, StringComparison.OrdinalIgnoreCase); + return host.EndsWith(_wildcardEndsWith!, StringComparison.OrdinalIgnoreCase); } else { @@ -454,7 +454,7 @@ public override int GetHashCode() return (Host?.GetHashCode() ?? 0) ^ (Port?.GetHashCode() ?? 0); } - public override bool Equals(object obj) + public override bool Equals(object? obj) { if (obj is EdgeKey key) { diff --git a/src/Http/Routing/src/Matching/HttpMethodMatcherPolicy.cs b/src/Http/Routing/src/Matching/HttpMethodMatcherPolicy.cs index 2dfdefcf020e..039d889fed53 100644 --- a/src/Http/Routing/src/Matching/HttpMethodMatcherPolicy.cs +++ b/src/Http/Routing/src/Matching/HttpMethodMatcherPolicy.cs @@ -108,7 +108,7 @@ public Task ApplyAsync(HttpContext httpContext, CandidateSet candidates) // We want to return a 405 iff we eliminated ALL of the currently valid endpoints due to HTTP method // mismatch. bool? needs405Endpoint = null; - HashSet methods = null; + HashSet? methods = null; for (var i = 0; i < candidates.Count; i++) { @@ -168,8 +168,8 @@ public Task ApplyAsync(HttpContext httpContext, CandidateSet candidates) if (needs405Endpoint == true) { // We saw some endpoints coming in, and we eliminated them all. - httpContext.SetEndpoint(CreateRejectionEndpoint(methods.OrderBy(m => m, StringComparer.OrdinalIgnoreCase))); - httpContext.Request.RouteValues = null; + httpContext.SetEndpoint(CreateRejectionEndpoint(methods!.OrderBy(m => m, StringComparer.OrdinalIgnoreCase))); + httpContext.Request.RouteValues = null!; } return Task.CompletedTask; @@ -329,8 +329,8 @@ public IReadOnlyList GetEdges(IReadOnlyList endpoints) /// public PolicyJumpTable BuildJumpTable(int exitDestination, IReadOnlyList edges) { - Dictionary destinations = null; - Dictionary corsPreflightDestinations = null; + Dictionary? destinations = null; + Dictionary? corsPreflightDestinations = null; for (var i = 0; i < edges.Count; i++) { // We create this data, so it's safe to cast it. @@ -421,17 +421,17 @@ private static bool ContainsHttpMethod(List httpMethods, string httpMeth private class HttpMethodPolicyJumpTable : PolicyJumpTable { private readonly int _exitDestination; - private readonly Dictionary _destinations; + private readonly Dictionary? _destinations; private readonly int _corsPreflightExitDestination; - private readonly Dictionary _corsPreflightDestinations; + private readonly Dictionary? _corsPreflightDestinations; private readonly bool _supportsCorsPreflight; public HttpMethodPolicyJumpTable( int exitDestination, - Dictionary destinations, + Dictionary? destinations, int corsPreflightExitDestination, - Dictionary corsPreflightDestinations) + Dictionary? corsPreflightDestinations) { _exitDestination = exitDestination; _destinations = destinations; @@ -466,7 +466,7 @@ public override int GetDestination(HttpContext httpContext) private class HttpMethodMetadataEndpointComparer : EndpointMetadataComparer { - protected override int CompareMetadata(IHttpMethodMetadata x, IHttpMethodMetadata y) + protected override int CompareMetadata(IHttpMethodMetadata? x, IHttpMethodMetadata? y) { // Ignore the metadata if it has an empty list of HTTP methods. return base.CompareMetadata( @@ -501,9 +501,9 @@ public int CompareTo(EdgeKey other) return IsCorsPreflightRequest.CompareTo(other.IsCorsPreflightRequest); } - public int CompareTo(object obj) + public int CompareTo(object? obj) { - return CompareTo((EdgeKey)obj); + return CompareTo((EdgeKey)obj!); } public bool Equals(EdgeKey other) @@ -513,7 +513,7 @@ public bool Equals(EdgeKey other) HttpMethods.Equals(HttpMethod, other.HttpMethod); } - public override bool Equals(object obj) + public override bool Equals(object? obj) { var other = obj as EdgeKey?; return other == null ? false : Equals(other.Value); diff --git a/src/Http/Routing/src/Matching/ILEmitTrieFactory.cs b/src/Http/Routing/src/Matching/ILEmitTrieFactory.cs index 3cb240c2fa28..18a60c4e0d94 100644 --- a/src/Http/Routing/src/Matching/ILEmitTrieFactory.cs +++ b/src/Http/Routing/src/Matching/ILEmitTrieFactory.cs @@ -1,6 +1,8 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Diagnostics; using System.Linq; diff --git a/src/Http/Routing/src/Matching/ILEmitTrieJumpTable.cs b/src/Http/Routing/src/Matching/ILEmitTrieJumpTable.cs index e59f2834354a..18bdd2bc356e 100644 --- a/src/Http/Routing/src/Matching/ILEmitTrieJumpTable.cs +++ b/src/Http/Routing/src/Matching/ILEmitTrieJumpTable.cs @@ -1,6 +1,8 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Threading; using System.Threading.Tasks; diff --git a/src/Http/Routing/src/Matching/PathSegment.cs b/src/Http/Routing/src/Matching/PathSegment.cs index a5f570f8b527..fd8d8a9223c1 100644 --- a/src/Http/Routing/src/Matching/PathSegment.cs +++ b/src/Http/Routing/src/Matching/PathSegment.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -16,7 +16,7 @@ public PathSegment(int start, int length) Length = length; } - public override bool Equals(object obj) + public override bool Equals(object? obj) { return obj is PathSegment segment ? Equals(segment) : false; } diff --git a/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj b/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj index 1937aae7f6a0..9ff392522517 100644 --- a/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj +++ b/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj @@ -12,7 +12,7 @@ Microsoft.AspNetCore.Routing.RouteCollection aspnetcore;routing true false - annotations + enable diff --git a/src/Http/Routing/src/NullRouter.cs b/src/Http/Routing/src/NullRouter.cs index 9fd1908942f4..2823067b5e41 100644 --- a/src/Http/Routing/src/NullRouter.cs +++ b/src/Http/Routing/src/NullRouter.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; @@ -13,7 +13,7 @@ private NullRouter() { } - public VirtualPathData GetVirtualPath(VirtualPathContext context) + public VirtualPathData? GetVirtualPath(VirtualPathContext context) { return null; } diff --git a/src/Http/Routing/src/ParameterPolicyActivator.cs b/src/Http/Routing/src/ParameterPolicyActivator.cs index b83c5c186bd8..81da4d49e96e 100644 --- a/src/Http/Routing/src/ParameterPolicyActivator.cs +++ b/src/Http/Routing/src/ParameterPolicyActivator.cs @@ -1,12 +1,13 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Reflection; -using System.Text; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNetCore.Routing diff --git a/src/Http/Routing/src/ParameterPolicyFactory.cs b/src/Http/Routing/src/ParameterPolicyFactory.cs index 2d8e665b47a8..95212e126309 100644 --- a/src/Http/Routing/src/ParameterPolicyFactory.cs +++ b/src/Http/Routing/src/ParameterPolicyFactory.cs @@ -26,7 +26,7 @@ public abstract class ParameterPolicyFactory /// The parameter the parameter policy is being created for. /// An existing parameter policy. /// The for the parameter. - public abstract IParameterPolicy Create(RoutePatternParameterPart parameter, IParameterPolicy parameterPolicy); + public abstract IParameterPolicy Create(RoutePatternParameterPart? parameter, IParameterPolicy parameterPolicy); /// /// Creates a parameter policy. @@ -34,7 +34,7 @@ public abstract class ParameterPolicyFactory /// The parameter the parameter policy is being created for. /// The reference to resolve. /// The for the parameter. - public IParameterPolicy Create(RoutePatternParameterPart parameter, RoutePatternParameterPolicyReference reference) + public IParameterPolicy Create(RoutePatternParameterPart? parameter, RoutePatternParameterPolicyReference reference) { if (reference == null) { diff --git a/src/Http/Routing/src/PathTokenizer.cs b/src/Http/Routing/src/PathTokenizer.cs index 307dfb115944..79f971e49738 100644 --- a/src/Http/Routing/src/PathTokenizer.cs +++ b/src/Http/Routing/src/PathTokenizer.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Collections; using System.Collections.Generic; diff --git a/src/Http/Routing/src/Patterns/DefaultRoutePatternTransformer.cs b/src/Http/Routing/src/Patterns/DefaultRoutePatternTransformer.cs index 39adf3a4d038..c79946c728a1 100644 --- a/src/Http/Routing/src/Patterns/DefaultRoutePatternTransformer.cs +++ b/src/Http/Routing/src/Patterns/DefaultRoutePatternTransformer.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Collections.Generic; diff --git a/src/Http/Routing/src/Patterns/RouteParameterParser.cs b/src/Http/Routing/src/Patterns/RouteParameterParser.cs index 07c8d91bb910..072ab0d8fc91 100644 --- a/src/Http/Routing/src/Patterns/RouteParameterParser.cs +++ b/src/Http/Routing/src/Patterns/RouteParameterParser.cs @@ -78,7 +78,7 @@ public static RoutePatternParameterPart ParseRouteParameter(string parameter) var parseResults = ParseConstraints(parameter, currentIndex, endIndex); currentIndex = parseResults.CurrentIndex; - string defaultValue = null; + string? defaultValue = null; if (currentIndex <= endIndex && parameter[currentIndex] == '=') { diff --git a/src/Http/Routing/src/Patterns/RoutePattern.cs b/src/Http/Routing/src/Patterns/RoutePattern.cs index 4cd881c8e20c..055a06266989 100644 --- a/src/Http/Routing/src/Patterns/RoutePattern.cs +++ b/src/Http/Routing/src/Patterns/RoutePattern.cs @@ -27,7 +27,7 @@ public sealed class RoutePattern /// public static readonly object RequiredValueAny = new RequiredValueAnySentinal(); - internal static bool IsRequiredValueAny(object value) + internal static bool IsRequiredValueAny(object? value) { return object.ReferenceEquals(RequiredValueAny, value); } @@ -35,10 +35,10 @@ internal static bool IsRequiredValueAny(object value) private const string SeparatorString = "/"; internal RoutePattern( - string rawText, - IReadOnlyDictionary defaults, + string? rawText, + IReadOnlyDictionary defaults, IReadOnlyDictionary> parameterPolicies, - IReadOnlyDictionary requiredValues, + IReadOnlyDictionary requiredValues, IReadOnlyList parameters, IReadOnlyList pathSegments) { @@ -63,7 +63,7 @@ internal RoutePattern( /// Gets the set of default values for the route pattern. /// The keys of are the route parameter names. /// - public IReadOnlyDictionary Defaults { get; } + public IReadOnlyDictionary Defaults { get; } /// /// Gets the set of parameter policy references for the route pattern. @@ -92,7 +92,7 @@ internal RoutePattern( /// /// /// - public IReadOnlyDictionary RequiredValues { get; } + public IReadOnlyDictionary RequiredValues { get; } /// /// Gets the precedence value of the route pattern for URL matching. @@ -115,7 +115,7 @@ internal RoutePattern( /// /// Gets the raw text supplied when parsing the route pattern. May be null. /// - public string RawText { get; } + public string? RawText { get; } /// /// Gets the list of route parameters. @@ -132,7 +132,7 @@ internal RoutePattern( /// /// The name of the parameter to match. /// The matching parameter or null if no parameter matches the given name. - public RoutePatternParameterPart GetParameter(string name) + public RoutePatternParameterPart? GetParameter(string name) { if (name == null) { diff --git a/src/Http/Routing/src/Patterns/RoutePatternException.cs b/src/Http/Routing/src/Patterns/RoutePatternException.cs index 7b21ac0ac5f0..c7c95f068c3a 100644 --- a/src/Http/Routing/src/Patterns/RoutePatternException.cs +++ b/src/Http/Routing/src/Patterns/RoutePatternException.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -15,7 +15,7 @@ public sealed class RoutePatternException : Exception private RoutePatternException(SerializationInfo info, StreamingContext context) : base(info, context) { - Pattern = (string)info.GetValue(nameof(Pattern), typeof(string)); + Pattern = (string)info.GetValue(nameof(Pattern), typeof(string))!; } /// diff --git a/src/Http/Routing/src/Patterns/RoutePatternFactory.cs b/src/Http/Routing/src/Patterns/RoutePatternFactory.cs index 91c8ae8b385d..8832e94e599d 100644 --- a/src/Http/Routing/src/Patterns/RoutePatternFactory.cs +++ b/src/Http/Routing/src/Patterns/RoutePatternFactory.cs @@ -17,8 +17,8 @@ namespace Microsoft.AspNetCore.Routing.Patterns /// public static class RoutePatternFactory { - private static readonly IReadOnlyDictionary EmptyDictionary = - new ReadOnlyDictionary(new Dictionary()); + private static readonly IReadOnlyDictionary EmptyDictionary = + new ReadOnlyDictionary(new Dictionary()); private static readonly IReadOnlyDictionary> EmptyPoliciesDictionary = new ReadOnlyDictionary>(new Dictionary>()); @@ -55,7 +55,7 @@ public static RoutePattern Parse(string pattern) /// Multiple policies can be specified for a key by providing a collection as the value. /// /// The . - public static RoutePattern Parse(string pattern, object defaults, object parameterPolicies) + public static RoutePattern Parse(string pattern, object? defaults, object? parameterPolicies) { if (pattern == null) { @@ -86,7 +86,7 @@ public static RoutePattern Parse(string pattern, object defaults, object paramet /// Route values that can be substituted for parameters in the route pattern. See remarks on . /// /// The . - public static RoutePattern Parse(string pattern, object defaults, object parameterPolicies, object requiredValues) + public static RoutePattern Parse(string pattern, object? defaults, object? parameterPolicies, object? requiredValues) { if (pattern == null) { @@ -118,7 +118,7 @@ public static RoutePattern Pattern(IEnumerable segments /// The raw text to associate with the route pattern. May be null. /// The collection of segments. /// The . - public static RoutePattern Pattern(string rawText, IEnumerable segments) + public static RoutePattern Pattern(string? rawText, IEnumerable segments) { if (segments == null) { @@ -146,8 +146,8 @@ public static RoutePattern Pattern(string rawText, IEnumerableThe collection of segments. /// The . public static RoutePattern Pattern( - object defaults, - object parameterPolicies, + object? defaults, + object? parameterPolicies, IEnumerable segments) { if (segments == null) @@ -177,9 +177,9 @@ public static RoutePattern Pattern( /// The collection of segments. /// The . public static RoutePattern Pattern( - string rawText, - object defaults, - object parameterPolicies, + string? rawText, + object? defaults, + object? parameterPolicies, IEnumerable segments) { if (segments == null) @@ -239,8 +239,8 @@ public static RoutePattern Pattern(string rawText, params RoutePatternPathSegmen /// The collection of segments. /// The . public static RoutePattern Pattern( - object defaults, - object parameterPolicies, + object? defaults, + object? parameterPolicies, params RoutePatternPathSegment[] segments) { if (segments == null) @@ -270,9 +270,9 @@ public static RoutePattern Pattern( /// The collection of segments. /// The . public static RoutePattern Pattern( - string rawText, - object defaults, - object parameterPolicies, + string? rawText, + object? defaults, + object? parameterPolicies, params RoutePatternPathSegment[] segments) { if (segments == null) @@ -284,10 +284,10 @@ public static RoutePattern Pattern( } private static RoutePattern PatternCore( - string rawText, - RouteValueDictionary defaults, - RouteValueDictionary parameterPolicies, - RouteValueDictionary requiredValues, + string? rawText, + RouteValueDictionary? defaults, + RouteValueDictionary? parameterPolicies, + RouteValueDictionary? requiredValues, IEnumerable segments) { // We want to merge the segment data with the 'out of line' defaults and parameter policies. @@ -301,10 +301,10 @@ private static RoutePattern PatternCore( // It's important that these two views of the data are consistent. We don't want // values specified out of line to have a different behavior. - Dictionary updatedDefaults = null; + Dictionary? updatedDefaults = null; if (defaults != null && defaults.Count > 0) { - updatedDefaults = new Dictionary(defaults.Count, StringComparer.OrdinalIgnoreCase); + updatedDefaults = new Dictionary(defaults.Count, StringComparer.OrdinalIgnoreCase); foreach (var kvp in defaults) { @@ -312,7 +312,7 @@ private static RoutePattern PatternCore( } } - Dictionary> updatedParameterPolicies = null; + Dictionary>? updatedParameterPolicies = null; if (parameterPolicies != null && parameterPolicies.Count > 0) { updatedParameterPolicies = new Dictionary>(parameterPolicies.Count, StringComparer.OrdinalIgnoreCase); @@ -349,7 +349,7 @@ private static RoutePattern PatternCore( } } - List parameters = null; + List? parameters = null; var updatedSegments = segments.ToArray(); for (var i = 0; i < updatedSegments.Length; i++) { @@ -420,12 +420,12 @@ private static RoutePattern PatternCore( ? updatedParameterPolicies.ToDictionary(kvp => kvp.Key, kvp => (IReadOnlyList)kvp.Value.ToArray()) : EmptyPoliciesDictionary, requiredValues ?? EmptyDictionary, - (IReadOnlyList)parameters ?? Array.Empty(), + (IReadOnlyList?)parameters ?? Array.Empty(), updatedSegments); RoutePatternPathSegment VisitSegment(RoutePatternPathSegment segment) { - RoutePatternPart[] updatedParts = null; + RoutePatternPart[]? updatedParts = null; for (var i = 0; i < segment.Parts.Count; i++) { var part = segment.Parts[i]; @@ -482,13 +482,13 @@ RoutePatternPart VisitPart(RoutePatternPart part) { if (updatedDefaults == null) { - updatedDefaults = new Dictionary(StringComparer.OrdinalIgnoreCase); + updatedDefaults = new Dictionary(StringComparer.OrdinalIgnoreCase); } updatedDefaults[parameter.Name] = parameter.Default; } - List parameterConstraints = null; + List? parameterConstraints = null; if ((updatedParameterPolicies == null || !updatedParameterPolicies.TryGetValue(parameter.Name, out parameterConstraints)) && parameter.ParameterPolicies.Count > 0) { @@ -503,7 +503,7 @@ RoutePatternPart VisitPart(RoutePatternPart part) if (parameter.ParameterPolicies.Count > 0) { - parameterConstraints.AddRange(parameter.ParameterPolicies); + parameterConstraints!.AddRange(parameter.ParameterPolicies); } if (Equals(parameter.Default, @default) @@ -667,7 +667,7 @@ public static RoutePatternParameterPart ParameterPart(string parameterName, obje /// The . public static RoutePatternParameterPart ParameterPart( string parameterName, - object @default, + object? @default, RoutePatternParameterKind parameterKind) { if (string.IsNullOrEmpty(parameterName)) @@ -703,7 +703,7 @@ public static RoutePatternParameterPart ParameterPart( /// The . public static RoutePatternParameterPart ParameterPart( string parameterName, - object @default, + object? @default, RoutePatternParameterKind parameterKind, IEnumerable parameterPolicies) { @@ -745,7 +745,7 @@ public static RoutePatternParameterPart ParameterPart( /// The . public static RoutePatternParameterPart ParameterPart( string parameterName, - object @default, + object? @default, RoutePatternParameterKind parameterKind, params RoutePatternParameterPolicyReference[] parameterPolicies) { @@ -778,7 +778,7 @@ public static RoutePatternParameterPart ParameterPart( private static RoutePatternParameterPart ParameterPartCore( string parameterName, - object @default, + object? @default, RoutePatternParameterKind parameterKind, RoutePatternParameterPolicyReference[] parameterPolicies) { @@ -787,7 +787,7 @@ private static RoutePatternParameterPart ParameterPartCore( private static RoutePatternParameterPart ParameterPartCore( string parameterName, - object @default, + object? @default, RoutePatternParameterKind parameterKind, RoutePatternParameterPolicyReference[] parameterPolicies, bool encodeSlashes) @@ -906,7 +906,7 @@ private static RoutePatternParameterPolicyReference ParameterPolicyCore(IParamet return new RoutePatternParameterPolicyReference(parameterPolicy); } - private static RouteValueDictionary Wrap(object values) + private static RouteValueDictionary? Wrap(object? values) { return values == null ? null : new RouteValueDictionary(values); } diff --git a/src/Http/Routing/src/Patterns/RoutePatternMatcher.cs b/src/Http/Routing/src/Patterns/RoutePatternMatcher.cs index 15bc489a64fd..f82d860e8373 100644 --- a/src/Http/Routing/src/Patterns/RoutePatternMatcher.cs +++ b/src/Http/Routing/src/Patterns/RoutePatternMatcher.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Diagnostics; using Microsoft.AspNetCore.Http; diff --git a/src/Http/Routing/src/Patterns/RoutePatternParameterPart.cs b/src/Http/Routing/src/Patterns/RoutePatternParameterPart.cs index 2b5f40826883..30cb7db2da72 100644 --- a/src/Http/Routing/src/Patterns/RoutePatternParameterPart.cs +++ b/src/Http/Routing/src/Patterns/RoutePatternParameterPart.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; @@ -16,7 +16,7 @@ public sealed class RoutePatternParameterPart : RoutePatternPart { internal RoutePatternParameterPart( string parameterName, - object @default, + object? @default, RoutePatternParameterKind parameterKind, RoutePatternParameterPolicyReference[] parameterPolicies) : this(parameterName, @default, parameterKind, parameterPolicies, encodeSlashes: true) @@ -25,7 +25,7 @@ internal RoutePatternParameterPart( internal RoutePatternParameterPart( string parameterName, - object @default, + object? @default, RoutePatternParameterKind parameterKind, RoutePatternParameterPolicyReference[] parameterPolicies, bool encodeSlashes) @@ -53,7 +53,7 @@ internal RoutePatternParameterPart( /// /// Gets the default value of this route parameter. May be null. /// - public object Default { get; } + public object? Default { get; } /// /// Returns true if this part is a catch-all parameter. diff --git a/src/Http/Routing/src/Patterns/RoutePatternParameterPolicyReference.cs b/src/Http/Routing/src/Patterns/RoutePatternParameterPolicyReference.cs index 65f58087c141..3fb95983f428 100644 --- a/src/Http/Routing/src/Patterns/RoutePatternParameterPolicyReference.cs +++ b/src/Http/Routing/src/Patterns/RoutePatternParameterPolicyReference.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Diagnostics; @@ -26,16 +26,16 @@ internal RoutePatternParameterPolicyReference(IParameterPolicy parameterPolicy) /// /// Gets the constraint text. /// - public string Content { get; } + public string? Content { get; } /// /// Gets a pre-existing that was used to construct this reference. /// - public IParameterPolicy ParameterPolicy { get; } + public IParameterPolicy? ParameterPolicy { get; } - private string DebuggerToString() + private string? DebuggerToString() { return Content; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Patterns/RoutePatternParser.cs b/src/Http/Routing/src/Patterns/RoutePatternParser.cs index 990d1854fc5b..8b8f181f52c1 100644 --- a/src/Http/Routing/src/Patterns/RoutePatternParser.cs +++ b/src/Http/Routing/src/Patterns/RoutePatternParser.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/src/Http/Routing/src/Patterns/RoutePatternTransformer.cs b/src/Http/Routing/src/Patterns/RoutePatternTransformer.cs index bea4c610fc0e..b16ab4cb0e3c 100644 --- a/src/Http/Routing/src/Patterns/RoutePatternTransformer.cs +++ b/src/Http/Routing/src/Patterns/RoutePatternTransformer.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNetCore.Routing.Patterns @@ -30,6 +30,6 @@ public abstract class RoutePatternTransformer /// return null if any required value cannot be substituted. /// /// - public abstract RoutePattern SubstituteRequiredValues(RoutePattern original, object requiredValues); + public abstract RoutePattern? SubstituteRequiredValues(RoutePattern original, object requiredValues); } } diff --git a/src/Http/Routing/src/RequestDelegateRouteBuilderExtensions.cs b/src/Http/Routing/src/RequestDelegateRouteBuilderExtensions.cs index f376683c4d92..8a9e228e46c3 100644 --- a/src/Http/Routing/src/RequestDelegateRouteBuilderExtensions.cs +++ b/src/Http/Routing/src/RequestDelegateRouteBuilderExtensions.cs @@ -259,7 +259,7 @@ public static IRouteBuilder MapVerb( new RouteHandler(handler), template, defaults: null, - constraints: new RouteValueDictionary(new { httpMethod = new HttpMethodRouteConstraint(verb) }), + constraints: new RouteValueDictionary(new { httpMethod = new HttpMethodRouteConstraint(verb) })!, dataTokens: null, inlineConstraintResolver: GetConstraintResolver(builder)); diff --git a/src/Http/Routing/src/Route.cs b/src/Http/Routing/src/Route.cs index 0a6afd3b2603..555c328127cc 100644 --- a/src/Http/Routing/src/Route.cs +++ b/src/Http/Routing/src/Route.cs @@ -1,8 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -#nullable enable - using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -62,7 +60,7 @@ public Route( _target = target; } - public string RouteTemplate => ParsedTemplate.TemplateText; + public string? RouteTemplate => ParsedTemplate.TemplateText; protected override Task OnRouteMatched(RouteContext context) { diff --git a/src/Http/Routing/src/RouteBase.cs b/src/Http/Routing/src/RouteBase.cs index 2ba62fbcab11..5c9db8f026e5 100644 --- a/src/Http/Routing/src/RouteBase.cs +++ b/src/Http/Routing/src/RouteBase.cs @@ -1,8 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -#nullable enable - using System; using System.Collections.Generic; using System.Diagnostics; @@ -110,7 +108,7 @@ public virtual Task RouteAsync(RouteContext context) { return Task.CompletedTask; } - _logger.RequestMatchedRoute(Name!, ParsedTemplate.TemplateText); + _logger.RequestMatchedRoute(Name!, ParsedTemplate.TemplateText!); return OnRouteMatched(context); } @@ -175,7 +173,7 @@ protected static IDictionary GetConstraints( RouteTemplate parsedTemplate, IDictionary? constraints) { - var constraintBuilder = new RouteConstraintBuilder(inlineConstraintResolver, parsedTemplate.TemplateText); + var constraintBuilder = new RouteConstraintBuilder(inlineConstraintResolver, parsedTemplate.TemplateText!); if (constraints != null) { @@ -189,12 +187,12 @@ protected static IDictionary GetConstraints( { if (parameter.IsOptional) { - constraintBuilder.SetOptional(parameter.Name); + constraintBuilder.SetOptional(parameter.Name!); } foreach (var inlineConstraint in parameter.InlineConstraints) { - constraintBuilder.AddResolvedConstraint(parameter.Name, inlineConstraint.Constraint); + constraintBuilder.AddResolvedConstraint(parameter.Name!, inlineConstraint.Constraint); } } @@ -219,7 +217,7 @@ protected static RouteValueDictionary GetDefaults( parameter.Name)); } #else - if (result.ContainsKey(parameter.Name)) + if (result.ContainsKey(parameter.Name!)) { throw new InvalidOperationException( Resources.FormatTemplateRoute_CannotHaveDefaultValueSpecifiedInlineAndExplicitly( @@ -227,7 +225,7 @@ protected static RouteValueDictionary GetDefaults( } else { - result.Add(parameter.Name, parameter.DefaultValue); + result.Add(parameter.Name!, parameter.DefaultValue); } #endif } @@ -300,7 +298,7 @@ private void EnsureMatcher() public override string ToString() { - return ParsedTemplate.TemplateText; + return ParsedTemplate.TemplateText!; } } } diff --git a/src/Http/Routing/src/RouteConstraintMatcher.cs b/src/Http/Routing/src/RouteConstraintMatcher.cs index 26728e817a5c..268e4110cc3a 100644 --- a/src/Http/Routing/src/RouteConstraintMatcher.cs +++ b/src/Http/Routing/src/RouteConstraintMatcher.cs @@ -53,7 +53,7 @@ public static bool Match( { routeValues.TryGetValue(kvp.Key, out var routeValue); - logger.ConstraintNotMatched(routeValue, kvp.Key, kvp.Value); + logger.ConstraintNotMatched(routeValue!, kvp.Key, kvp.Value); } return false; diff --git a/src/Http/Routing/src/RouteEndpoint.cs b/src/Http/Routing/src/RouteEndpoint.cs index a6750a2ef6c5..db4f9d4d2b37 100644 --- a/src/Http/Routing/src/RouteEndpoint.cs +++ b/src/Http/Routing/src/RouteEndpoint.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -28,8 +28,8 @@ public RouteEndpoint( RequestDelegate requestDelegate, RoutePattern routePattern, int order, - EndpointMetadataCollection metadata, - string displayName) + EndpointMetadataCollection? metadata, + string? displayName) : base(requestDelegate, metadata, displayName) { if (requestDelegate == null) diff --git a/src/Http/Routing/src/RouteEndpointModel.cs b/src/Http/Routing/src/RouteEndpointBuilder.cs similarity index 82% rename from src/Http/Routing/src/RouteEndpointModel.cs rename to src/Http/Routing/src/RouteEndpointBuilder.cs index f06ccba0bfbe..4397c51cfc97 100644 --- a/src/Http/Routing/src/RouteEndpointModel.cs +++ b/src/Http/Routing/src/RouteEndpointBuilder.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing.Patterns; @@ -25,6 +26,11 @@ public RouteEndpointBuilder( public override Endpoint Build() { + if (RequestDelegate is null) + { + throw new InvalidOperationException($"{nameof(RequestDelegate)} must be specified to construct a {nameof(RouteEndpoint)}."); + } + var routeEndpoint = new RouteEndpoint( RequestDelegate, RoutePattern, diff --git a/src/Http/Routing/src/RouteOptions.cs b/src/Http/Routing/src/RouteOptions.cs index dcff5482e706..796554dd5800 100644 --- a/src/Http/Routing/src/RouteOptions.cs +++ b/src/Http/Routing/src/RouteOptions.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Routing public class RouteOptions { private IDictionary _constraintTypeMap = GetDefaultConstraintMap(); - private ICollection _endpointDataSources; + private ICollection _endpointDataSources = default!; /// /// Gets a collection of instances configured with routing. diff --git a/src/Http/Routing/src/RouteValueEqualityComparer.cs b/src/Http/Routing/src/RouteValueEqualityComparer.cs index f7cf0570c978..18ffc3070b7d 100644 --- a/src/Http/Routing/src/RouteValueEqualityComparer.cs +++ b/src/Http/Routing/src/RouteValueEqualityComparer.cs @@ -18,12 +18,12 @@ namespace Microsoft.AspNetCore.Routing /// /// strings are compared using . /// - public class RouteValueEqualityComparer : IEqualityComparer + public class RouteValueEqualityComparer : IEqualityComparer { public static readonly RouteValueEqualityComparer Default = new RouteValueEqualityComparer(); /// - public new bool Equals(object x, object y) + public new bool Equals(object? x, object? y) { var stringX = x as string ?? Convert.ToString(x, CultureInfo.InvariantCulture); var stringY = y as string ?? Convert.ToString(y, CultureInfo.InvariantCulture); @@ -52,4 +52,4 @@ public int GetHashCode(object obj) } } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/RouteValuesAddressScheme.cs b/src/Http/Routing/src/RouteValuesAddressScheme.cs index 3d0db2b0f928..80a74c19a434 100644 --- a/src/Http/Routing/src/RouteValuesAddressScheme.cs +++ b/src/Http/Routing/src/RouteValuesAddressScheme.cs @@ -30,7 +30,7 @@ public IEnumerable FindEndpoints(RouteValuesAddress address) var state = State; - IList matchResults = null; + IList? matchResults = null; if (string.IsNullOrEmpty(address.RouteName)) { matchResults = state.AllMatchesLinkGenerationTree.GetMatches( @@ -141,8 +141,8 @@ private StateEntry Initialize(IReadOnlyList endpoints) private OutboundRouteEntry CreateOutboundRouteEntry( RouteEndpoint endpoint, - IReadOnlyDictionary requiredValues, - string routeName) + IReadOnlyDictionary requiredValues, + string? routeName) { var entry = new OutboundRouteEntry() { diff --git a/src/Http/Routing/src/Template/InlineConstraint.cs b/src/Http/Routing/src/Template/InlineConstraint.cs index a711ecb13690..71be48e247b0 100644 --- a/src/Http/Routing/src/Template/InlineConstraint.cs +++ b/src/Http/Routing/src/Template/InlineConstraint.cs @@ -32,7 +32,7 @@ public InlineConstraint(RoutePatternParameterPolicyReference other) throw new ArgumentNullException(nameof(other)); } - Constraint = other.Content; + Constraint = other.Content!; } /// @@ -40,4 +40,4 @@ public InlineConstraint(RoutePatternParameterPolicyReference other) /// public string Constraint { get; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Template/RouteTemplate.cs b/src/Http/Routing/src/Template/RouteTemplate.cs index ec5d5631f6c7..2b699e85cc2d 100644 --- a/src/Http/Routing/src/Template/RouteTemplate.cs +++ b/src/Http/Routing/src/Template/RouteTemplate.cs @@ -68,7 +68,7 @@ public RouteTemplate(string template, List segments) } } - public string TemplateText { get; } + public string? TemplateText { get; } public IList Parameters { get; } diff --git a/src/Http/Routing/src/Template/TemplateBinder.cs b/src/Http/Routing/src/Template/TemplateBinder.cs index 10af79ec2c80..366a012b588b 100644 --- a/src/Http/Routing/src/Template/TemplateBinder.cs +++ b/src/Http/Routing/src/Template/TemplateBinder.cs @@ -1,8 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -#nullable enable - using System; using System.Collections; using System.Collections.Generic; diff --git a/src/Http/Routing/src/Template/TemplateMatcher.cs b/src/Http/Routing/src/Template/TemplateMatcher.cs index 97dc3565ddde..95875258598e 100644 --- a/src/Http/Routing/src/Template/TemplateMatcher.cs +++ b/src/Http/Routing/src/Template/TemplateMatcher.cs @@ -51,7 +51,7 @@ public TemplateMatcher( continue; } - if (Defaults.TryGetValue(part.Name, out var value)) + if (Defaults.TryGetValue(part.Name!, out var value)) { _hasDefaultValue[i] = true; _defaultValues[i] = value; diff --git a/src/Http/Routing/src/Template/TemplatePart.cs b/src/Http/Routing/src/Template/TemplatePart.cs index 5d84969a9c93..c7acbd1b5750 100644 --- a/src/Http/Routing/src/Template/TemplatePart.cs +++ b/src/Http/Routing/src/Template/TemplatePart.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Linq; using Microsoft.AspNetCore.Routing.Patterns; @@ -32,7 +33,7 @@ public TemplatePart(RoutePatternPart other) IsCatchAll = parameter.IsCatchAll; IsOptional = parameter.IsOptional; DefaultValue = parameter.Default; - InlineConstraints = parameter.ParameterPolicies?.Select(p => new InlineConstraint(p)); + InlineConstraints = parameter.ParameterPolicies?.Select(p => new InlineConstraint(p)) ?? Enumerable.Empty(); } else if (other.IsSeparator && other is RoutePatternSeparatorPart separator) { @@ -59,8 +60,8 @@ public static TemplatePart CreateParameter( string name, bool isCatchAll, bool isOptional, - object defaultValue, - IEnumerable inlineConstraints) + object? defaultValue, + IEnumerable? inlineConstraints) { if (name == null) { @@ -83,12 +84,12 @@ public static TemplatePart CreateParameter( public bool IsParameter { get; private set; } public bool IsOptional { get; private set; } public bool IsOptionalSeperator { get; set; } - public string Name { get; private set; } - public string Text { get; private set; } - public object DefaultValue { get; private set; } - public IEnumerable InlineConstraints { get; private set; } + public string? Name { get; private set; } + public string? Text { get; private set; } + public object? DefaultValue { get; private set; } + public IEnumerable InlineConstraints { get; private set; } = Enumerable.Empty(); - internal string DebuggerToString() + internal string? DebuggerToString() { if (IsParameter) { @@ -104,11 +105,11 @@ public RoutePatternPart ToRoutePatternPart() { if (IsLiteral && IsOptionalSeperator) { - return RoutePatternFactory.SeparatorPart(Text); + return RoutePatternFactory.SeparatorPart(Text!); } else if (IsLiteral) { - return RoutePatternFactory.LiteralPart(Text); + return RoutePatternFactory.LiteralPart(Text!); } else { @@ -119,7 +120,7 @@ public RoutePatternPart ToRoutePatternPart() RoutePatternParameterKind.Standard; var constraints = InlineConstraints.Select(c => new RoutePatternParameterPolicyReference(c.Constraint)); - return RoutePatternFactory.ParameterPart(Name, DefaultValue, kind, constraints); + return RoutePatternFactory.ParameterPart(Name!, DefaultValue, kind, constraints); } } } diff --git a/src/Http/Routing/src/Template/TemplateValuesResult.cs b/src/Http/Routing/src/Template/TemplateValuesResult.cs index 2a7c46398ff2..98489a93a85c 100644 --- a/src/Http/Routing/src/Template/TemplateValuesResult.cs +++ b/src/Http/Routing/src/Template/TemplateValuesResult.cs @@ -11,7 +11,7 @@ public class TemplateValuesResult /// /// The set of values that will appear in the URL. /// - public RouteValueDictionary AcceptedValues { get; set; } + public RouteValueDictionary AcceptedValues { get; set; } = default!; /// /// The set of values that that were supplied for URL generation. @@ -24,6 +24,6 @@ public class TemplateValuesResult /// Implicit (ambient) values which are invalidated due to changes in values lexically earlier in the /// route template are excluded from this set. /// - public RouteValueDictionary CombinedValues { get; set; } + public RouteValueDictionary CombinedValues { get; set; } = default!; } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Tree/InboundMatch.cs b/src/Http/Routing/src/Tree/InboundMatch.cs index 57f1b6db7b65..9ddb321de00a 100644 --- a/src/Http/Routing/src/Tree/InboundMatch.cs +++ b/src/Http/Routing/src/Tree/InboundMatch.cs @@ -1,6 +1,8 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System.Diagnostics; using Microsoft.AspNetCore.Routing.Template; diff --git a/src/Http/Routing/src/Tree/InboundRouteEntry.cs b/src/Http/Routing/src/Tree/InboundRouteEntry.cs index 7c4a5f0abc84..893a461d1c28 100644 --- a/src/Http/Routing/src/Tree/InboundRouteEntry.cs +++ b/src/Http/Routing/src/Tree/InboundRouteEntry.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System.Collections.Generic; using Microsoft.AspNetCore.Routing.Template; diff --git a/src/Http/Routing/src/Tree/LinkGenerationDecisionTree.cs b/src/Http/Routing/src/Tree/LinkGenerationDecisionTree.cs index 6aa8b848676d..47db9e345ba5 100644 --- a/src/Http/Routing/src/Tree/LinkGenerationDecisionTree.cs +++ b/src/Http/Routing/src/Tree/LinkGenerationDecisionTree.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/src/Http/Routing/src/Tree/OutboundMatch.cs b/src/Http/Routing/src/Tree/OutboundMatch.cs index 49980b991234..95653e3bb5ad 100644 --- a/src/Http/Routing/src/Tree/OutboundMatch.cs +++ b/src/Http/Routing/src/Tree/OutboundMatch.cs @@ -1,6 +1,8 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using Microsoft.AspNetCore.Routing.Template; namespace Microsoft.AspNetCore.Routing.Tree diff --git a/src/Http/Routing/src/Tree/OutboundRouteEntry.cs b/src/Http/Routing/src/Tree/OutboundRouteEntry.cs index 9c5258df1a28..4df5ae351a01 100644 --- a/src/Http/Routing/src/Tree/OutboundRouteEntry.cs +++ b/src/Http/Routing/src/Tree/OutboundRouteEntry.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System.Collections.Generic; using Microsoft.AspNetCore.Routing.Template; @@ -64,4 +66,4 @@ public class OutboundRouteEntry /// public object Data { get; set; } } -} \ No newline at end of file +} diff --git a/src/Http/Routing/src/Tree/TreeEnumerator.cs b/src/Http/Routing/src/Tree/TreeEnumerator.cs index 5a88f5bc3519..2f7d3dc94ad0 100644 --- a/src/Http/Routing/src/Tree/TreeEnumerator.cs +++ b/src/Http/Routing/src/Tree/TreeEnumerator.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System.Collections; using System.Collections.Generic; using System.Diagnostics; diff --git a/src/Http/Routing/src/Tree/TreeRouteBuilder.cs b/src/Http/Routing/src/Tree/TreeRouteBuilder.cs index 59e06d83c00c..1f9e9d031329 100644 --- a/src/Http/Routing/src/Tree/TreeRouteBuilder.cs +++ b/src/Http/Routing/src/Tree/TreeRouteBuilder.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Collections.Generic; using System.Linq; diff --git a/src/Http/Routing/src/Tree/TreeRouter.cs b/src/Http/Routing/src/Tree/TreeRouter.cs index 9dd6eb290b2d..5a27d237f368 100644 --- a/src/Http/Routing/src/Tree/TreeRouter.cs +++ b/src/Http/Routing/src/Tree/TreeRouter.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Collections.Generic; using System.Text.Encodings.Web; diff --git a/src/Http/Routing/src/Tree/UrlMatchingNode.cs b/src/Http/Routing/src/Tree/UrlMatchingNode.cs index ffc387efe942..b829bc70365e 100644 --- a/src/Http/Routing/src/Tree/UrlMatchingNode.cs +++ b/src/Http/Routing/src/Tree/UrlMatchingNode.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable disable + using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/src/Http/Routing/src/Tree/UrlMatchingTree.cs b/src/Http/Routing/src/Tree/UrlMatchingTree.cs index 570dce1b3a33..3dec2b54bd21 100644 --- a/src/Http/Routing/src/Tree/UrlMatchingTree.cs +++ b/src/Http/Routing/src/Tree/UrlMatchingTree.cs @@ -158,7 +158,7 @@ internal void AddEntry(InboundRouteEntry entry) current.Matches.Sort((x, y) => { var result = x.Entry.Precedence.CompareTo(y.Entry.Precedence); - return result == 0 ? x.Entry.RouteTemplate.TemplateText.CompareTo(y.Entry.RouteTemplate.TemplateText) : result; + return result == 0 ? x.Entry.RouteTemplate.TemplateText!.CompareTo(y.Entry.RouteTemplate.TemplateText) : result; }); }