From d47751da63014a6df9a23215bcc93b4ff40c0769 Mon Sep 17 00:00:00 2001 From: Bart Koelman <10324372+bkoelman@users.noreply.github.com> Date: Sat, 12 Nov 2022 09:49:41 +0100 Subject: [PATCH 1/7] Update to Resharper v2023.1 --- .config/dotnet-tools.json | 2 +- Build.ps1 | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index e713343770..40d3ba4893 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "jetbrains.resharper.globaltools": { - "version": "2022.2.4", + "version": "2023.1.0", "commands": [ "jb" ] diff --git a/Build.ps1 b/Build.ps1 index 9b076bc4d8..a532a0113b 100644 --- a/Build.ps1 +++ b/Build.ps1 @@ -104,11 +104,8 @@ CheckLastExitCode dotnet build -c Release CheckLastExitCode -# https://youtrack.jetbrains.com/issue/RSRP-488628/Breaking-InspectCode-fails-with-Roslyn-Worker-process-exited-unexpectedly-after-update -if ($IsWindows) { - RunInspectCode - RunCleanupCode -} +RunInspectCode +RunCleanupCode dotnet test -c Release --no-build --collect:"XPlat Code Coverage" CheckLastExitCode From 87a7569b39512f2aa3709a0f5a6f1d284bb680b9 Mon Sep 17 00:00:00 2001 From: Bart Koelman <10324372+bkoelman@users.noreply.github.com> Date: Sun, 12 Mar 2023 13:28:20 +0100 Subject: [PATCH 2/7] InspectCode: Include Roslyn diagnostic ID --- Build.ps1 | 2 +- JetBrainsInspectCodeTransform.xslt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Build.ps1 b/Build.ps1 index a532a0113b..2a143dd168 100644 --- a/Build.ps1 +++ b/Build.ps1 @@ -23,7 +23,7 @@ function RunInspectCode { $issueType = $xml.report.IssueTypes.SelectSingleNode("IssueType[@Id='$($_.TypeId)']") $severity = $_.Severity ?? $issueType.Severity - Write-Output "[$severity] $($_.File):$($_.Line) $($_.Message)" + Write-Output "[$severity] $($_.File):$($_.Line) $($_.TypeId): $($_.Message)" }) }) } diff --git a/JetBrainsInspectCodeTransform.xslt b/JetBrainsInspectCodeTransform.xslt index 098821f29f..28fa772b0f 100644 --- a/JetBrainsInspectCodeTransform.xslt +++ b/JetBrainsInspectCodeTransform.xslt @@ -25,6 +25,7 @@ File Line Number + Type Message @@ -35,6 +36,9 @@ + + + From 476dab04280e1d0b2d0becf77e3fc4fc269ca70e Mon Sep 17 00:00:00 2001 From: Bart Koelman <10324372+bkoelman@users.noreply.github.com> Date: Sun, 12 Mar 2023 12:20:42 +0100 Subject: [PATCH 3/7] Enable new inspections --- JsonApiDotNetCore.sln.DotSettings | 14 ++++++++++---- WarningSeverities.DotSettings | 14 ++++++++++++++ .../CollectionConverter.cs | 11 ++++------- .../SourceCodeWriter.cs | 2 +- .../Configuration/ResourceGraphBuilder.cs | 2 +- src/JsonApiDotNetCore/Configuration/TypeLocator.cs | 2 +- .../Errors/InvalidModelStateException.cs | 2 +- .../Queries/Internal/Parsing/FilterParser.cs | 2 +- .../Internal/Parsing/QueryExpressionParser.cs | 2 +- .../Queries/Internal/SystemExpressionExtensions.cs | 2 +- .../Resources/SortExpressionLambdaConverter.cs | 6 +++--- .../Request/Adapters/ResourceIdentityAdapter.cs | 2 +- .../Serialization/Response/LinkBuilder.cs | 2 +- .../CompositeKeys/CarExpressionRewriter.cs | 2 +- 14 files changed, 41 insertions(+), 24 deletions(-) diff --git a/JsonApiDotNetCore.sln.DotSettings b/JsonApiDotNetCore.sln.DotSettings index 05a03c584b..2b714c22d3 100644 --- a/JsonApiDotNetCore.sln.DotSettings +++ b/JsonApiDotNetCore.sln.DotSettings @@ -28,6 +28,7 @@ JsonApiDotNetCore.ArgumentGuard.NotNull($EXPR$); SUGGESTION SUGGESTION WARNING + WARNING SUGGESTION SUGGESTION SUGGESTION @@ -54,16 +55,16 @@ JsonApiDotNetCore.ArgumentGuard.NotNull($EXPR$); WARNING WARNING WARNING + SUGGESTION HINT WARNING DO_NOT_SHOW HINT SUGGESTION - WARNING - WARNING + SUGGESTION + SUGGESTION WARNING WARNING - SUGGESTION WARNING SUGGESTION SUGGESTION @@ -76,6 +77,7 @@ JsonApiDotNetCore.ArgumentGuard.NotNull($EXPR$); SUGGESTION SUGGESTION SUGGESTION + WARNING WARNING WARNING WARNING @@ -88,8 +90,10 @@ JsonApiDotNetCore.ArgumentGuard.NotNull($EXPR$); WARNING WARNING WARNING + SUGGESTION + SUGGESTION WARNING - <?xml version="1.0" encoding="utf-16"?><Profile name="JADNC Full Cleanup"><XMLReformatCode>True</XMLReformatCode><CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeArgumentsStyle="True" ArrangeCodeBodyStyle="True" ArrangeVarStyle="True" ArrangeTrailingCommas="True" ArrangeObjectCreation="True" ArrangeDefaultValue="True" ArrangeNamespaces="True" /><CssAlphabetizeProperties>True</CssAlphabetizeProperties><JsInsertSemicolon>True</JsInsertSemicolon><FormatAttributeQuoteDescriptor>True</FormatAttributeQuoteDescriptor><CorrectVariableKindsDescriptor>True</CorrectVariableKindsDescriptor><VariablesToInnerScopesDescriptor>True</VariablesToInnerScopesDescriptor><StringToTemplatesDescriptor>True</StringToTemplatesDescriptor><JsReformatCode>True</JsReformatCode><JsFormatDocComments>True</JsFormatDocComments><RemoveRedundantQualifiersTs>True</RemoveRedundantQualifiersTs><OptimizeImportsTs>True</OptimizeImportsTs><OptimizeReferenceCommentsTs>True</OptimizeReferenceCommentsTs><PublicModifierStyleTs>True</PublicModifierStyleTs><ExplicitAnyTs>True</ExplicitAnyTs><TypeAnnotationStyleTs>True</TypeAnnotationStyleTs><RelativePathStyleTs>True</RelativePathStyleTs><AsInsteadOfCastTs>True</AsInsteadOfCastTs><HtmlReformatCode>True</HtmlReformatCode><AspOptimizeRegisterDirectives>True</AspOptimizeRegisterDirectives><RemoveCodeRedundancies>True</RemoveCodeRedundancies><CSUseAutoProperty>True</CSUseAutoProperty><CSMakeFieldReadonly>True</CSMakeFieldReadonly><CSMakeAutoPropertyGetOnly>True</CSMakeAutoPropertyGetOnly><CSArrangeQualifiers>True</CSArrangeQualifiers><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CssReformatCode>True</CssReformatCode><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><CSReformatCode>True</CSReformatCode><CSharpFormatDocComments>True</CSharpFormatDocComments><CSReorderTypeMembers>True</CSReorderTypeMembers><XAMLCollapseEmptyTags>False</XAMLCollapseEmptyTags></Profile> + <?xml version="1.0" encoding="utf-16"?><Profile name="JADNC Full Cleanup"><XMLReformatCode>True</XMLReformatCode><CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeArgumentsStyle="True" ArrangeCodeBodyStyle="True" ArrangeVarStyle="True" ArrangeTrailingCommas="True" ArrangeObjectCreation="True" ArrangeDefaultValue="True" ArrangeNamespaces="True" ArrangeNullCheckingPattern="True" /><CssAlphabetizeProperties>True</CssAlphabetizeProperties><JsInsertSemicolon>True</JsInsertSemicolon><FormatAttributeQuoteDescriptor>True</FormatAttributeQuoteDescriptor><CorrectVariableKindsDescriptor>True</CorrectVariableKindsDescriptor><VariablesToInnerScopesDescriptor>True</VariablesToInnerScopesDescriptor><StringToTemplatesDescriptor>True</StringToTemplatesDescriptor><JsReformatCode>True</JsReformatCode><JsFormatDocComments>True</JsFormatDocComments><RemoveRedundantQualifiersTs>True</RemoveRedundantQualifiersTs><OptimizeImportsTs>True</OptimizeImportsTs><OptimizeReferenceCommentsTs>True</OptimizeReferenceCommentsTs><PublicModifierStyleTs>True</PublicModifierStyleTs><ExplicitAnyTs>True</ExplicitAnyTs><TypeAnnotationStyleTs>True</TypeAnnotationStyleTs><RelativePathStyleTs>True</RelativePathStyleTs><AsInsteadOfCastTs>True</AsInsteadOfCastTs><HtmlReformatCode>True</HtmlReformatCode><AspOptimizeRegisterDirectives>True</AspOptimizeRegisterDirectives><RemoveCodeRedundancies>True</RemoveCodeRedundancies><CSUseAutoProperty>True</CSUseAutoProperty><CSMakeFieldReadonly>True</CSMakeFieldReadonly><CSMakeAutoPropertyGetOnly>True</CSMakeAutoPropertyGetOnly><CSArrangeQualifiers>True</CSArrangeQualifiers><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CssReformatCode>True</CssReformatCode><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><CSReformatCode>True</CSReformatCode><CSharpFormatDocComments>True</CSharpFormatDocComments><CSReorderTypeMembers>True</CSReorderTypeMembers><XAMLCollapseEmptyTags>False</XAMLCollapseEmptyTags><CSReformatInactiveBranches>True</CSReformatInactiveBranches></Profile> JADNC Full Cleanup Required Required @@ -116,6 +120,7 @@ JsonApiDotNetCore.ArgumentGuard.NotNull($EXPR$); False False False + False False False False @@ -134,6 +139,7 @@ JsonApiDotNetCore.ArgumentGuard.NotNull($EXPR$); False False CHOP_ALWAYS + False True True True diff --git a/WarningSeverities.DotSettings b/WarningSeverities.DotSettings index 0d4eeba96f..96f358da23 100644 --- a/WarningSeverities.DotSettings +++ b/WarningSeverities.DotSettings @@ -13,6 +13,7 @@ WARNING WARNING WARNING + WARNING WARNING WARNING WARNING @@ -70,6 +71,7 @@ WARNING WARNING WARNING + WARNING WARNING WARNING WARNING @@ -82,6 +84,7 @@ WARNING WARNING WARNING + WARNING WARNING WARNING WARNING @@ -97,8 +100,13 @@ WARNING WARNING WARNING + WARNING WARNING WARNING + WARNING + WARNING + WARNING + WARNING WARNING WARNING WARNING @@ -109,12 +117,14 @@ WARNING WARNING WARNING + WARNING WARNING WARNING WARNING WARNING WARNING WARNING + WARNING WARNING WARNING WARNING @@ -135,6 +145,7 @@ WARNING WARNING WARNING + WARNING WARNING WARNING WARNING @@ -152,6 +163,8 @@ WARNING WARNING WARNING + WARNING + WARNING WARNING WARNING WARNING @@ -240,6 +253,7 @@ WARNING WARNING WARNING + WARNING WARNING WARNING WARNING diff --git a/src/JsonApiDotNetCore.Annotations/CollectionConverter.cs b/src/JsonApiDotNetCore.Annotations/CollectionConverter.cs index fa1c0c90bd..6edce84335 100644 --- a/src/JsonApiDotNetCore.Annotations/CollectionConverter.cs +++ b/src/JsonApiDotNetCore.Annotations/CollectionConverter.cs @@ -45,7 +45,7 @@ public IEnumerable CopyToTypedCollection(IEnumerable source, Type collectionType /// private Type ToConcreteCollectionType(Type collectionType) { - if (collectionType.IsInterface && collectionType.IsGenericType) + if (collectionType is { IsInterface: true, IsGenericType: true }) { Type openCollectionType = collectionType.GetGenericTypeDefinition(); @@ -101,14 +101,11 @@ public IReadOnlyCollection ExtractResources(object? value) /// public Type? FindCollectionElementType(Type? type) { - if (type != null) + if (type is { IsGenericType: true, GenericTypeArguments.Length: 1 }) { - if (type.IsGenericType && type.GenericTypeArguments.Length == 1) + if (type.IsOrImplementsInterface()) { - if (type.IsOrImplementsInterface()) - { - return type.GenericTypeArguments[0]; - } + return type.GenericTypeArguments[0]; } } diff --git a/src/JsonApiDotNetCore.SourceGenerators/SourceCodeWriter.cs b/src/JsonApiDotNetCore.SourceGenerators/SourceCodeWriter.cs index f138985157..3ac3f5cb64 100644 --- a/src/JsonApiDotNetCore.SourceGenerators/SourceCodeWriter.cs +++ b/src/JsonApiDotNetCore.SourceGenerators/SourceCodeWriter.cs @@ -61,7 +61,7 @@ public string Write(INamedTypeSymbol resourceType, ITypeSymbol idType, JsonApiEn WriteAutoGeneratedComment(); - if (idType.IsReferenceType && idType.NullableAnnotation == NullableAnnotation.Annotated) + if (idType is { IsReferenceType: true, NullableAnnotation: NullableAnnotation.Annotated }) { WriteNullableEnable(); } diff --git a/src/JsonApiDotNetCore/Configuration/ResourceGraphBuilder.cs b/src/JsonApiDotNetCore/Configuration/ResourceGraphBuilder.cs index 2b6f19acd3..97548bd8fa 100644 --- a/src/JsonApiDotNetCore/Configuration/ResourceGraphBuilder.cs +++ b/src/JsonApiDotNetCore/Configuration/ResourceGraphBuilder.cs @@ -159,7 +159,7 @@ public ResourceGraphBuilder Add(DbContext dbContext) private static bool IsImplicitManyToManyJoinEntity(IEntityType entityType) { - return entityType.IsPropertyBag && entityType.HasSharedClrType; + return entityType is { IsPropertyBag: true, HasSharedClrType: true }; } /// diff --git a/src/JsonApiDotNetCore/Configuration/TypeLocator.cs b/src/JsonApiDotNetCore/Configuration/TypeLocator.cs index 981c50c4e4..9f65b46b97 100644 --- a/src/JsonApiDotNetCore/Configuration/TypeLocator.cs +++ b/src/JsonApiDotNetCore/Configuration/TypeLocator.cs @@ -89,7 +89,7 @@ internal sealed class TypeLocator private static (Type implementationType, Type serviceInterface)? GetContainerRegistrationFromType(Type nextType, Type unboundInterface, Type[] interfaceTypeArguments) { - if (!nextType.IsNested && !nextType.IsAbstract && !nextType.IsInterface) + if (nextType is { IsNested: false, IsAbstract: false, IsInterface: false }) { foreach (Type nextConstructedInterface in nextType.GetInterfaces().Where(type => type.IsGenericType)) { diff --git a/src/JsonApiDotNetCore/Errors/InvalidModelStateException.cs b/src/JsonApiDotNetCore/Errors/InvalidModelStateException.cs index be4de87fc8..50cb511b14 100644 --- a/src/JsonApiDotNetCore/Errors/InvalidModelStateException.cs +++ b/src/JsonApiDotNetCore/Errors/InvalidModelStateException.cs @@ -67,7 +67,7 @@ private static IEnumerable FromModelStateDictionary(IReadOnlyDictio return ResolveSourcePointerInComplexType(propertySegment, resourceGraph); } - if (propertySegment.PropertyName == nameof(OperationContainer.Resource) && propertySegment.Parent != null && + if (propertySegment is { PropertyName: nameof(OperationContainer.Resource), Parent: not null } && propertySegment.Parent.ModelType == typeof(IList)) { // Special case: Stepping over OperationContainer.Resource property. diff --git a/src/JsonApiDotNetCore/Queries/Internal/Parsing/FilterParser.cs b/src/JsonApiDotNetCore/Queries/Internal/Parsing/FilterParser.cs index cdada38fb4..bdac0d8962 100644 --- a/src/JsonApiDotNetCore/Queries/Internal/Parsing/FilterParser.cs +++ b/src/JsonApiDotNetCore/Queries/Internal/Parsing/FilterParser.cs @@ -372,7 +372,7 @@ protected QueryExpression ParseCountOrConstantOrNullOrField(FieldChainRequiremen { if (TokenStack.TryPeek(out Token? nextToken)) { - if (nextToken.Kind == TokenKind.Text && nextToken.Value == Keywords.Null) + if (nextToken is { Kind: TokenKind.Text, Value: Keywords.Null }) { TokenStack.Pop(); return NullConstantExpression.Instance; diff --git a/src/JsonApiDotNetCore/Queries/Internal/Parsing/QueryExpressionParser.cs b/src/JsonApiDotNetCore/Queries/Internal/Parsing/QueryExpressionParser.cs index 681c1dd8f4..27466e3b0a 100644 --- a/src/JsonApiDotNetCore/Queries/Internal/Parsing/QueryExpressionParser.cs +++ b/src/JsonApiDotNetCore/Queries/Internal/Parsing/QueryExpressionParser.cs @@ -72,7 +72,7 @@ private void EatFieldChain(StringBuilder pathBuilder, string? alternativeErrorMe protected CountExpression? TryParseCount() { - if (TokenStack.TryPeek(out Token? nextToken) && nextToken.Kind == TokenKind.Text && nextToken.Value == Keywords.Count) + if (TokenStack.TryPeek(out Token? nextToken) && nextToken is { Kind: TokenKind.Text, Value: Keywords.Count }) { TokenStack.Pop(); diff --git a/src/JsonApiDotNetCore/Queries/Internal/SystemExpressionExtensions.cs b/src/JsonApiDotNetCore/Queries/Internal/SystemExpressionExtensions.cs index a314d5f20a..9c77f53938 100644 --- a/src/JsonApiDotNetCore/Queries/Internal/SystemExpressionExtensions.cs +++ b/src/JsonApiDotNetCore/Queries/Internal/SystemExpressionExtensions.cs @@ -21,7 +21,7 @@ public static Expression CreateTupleAccessExpressionForConstant(this object? val // Tuple.Create(value).Item1; MethodInfo tupleCreateUnboundMethod = typeof(Tuple).GetMethods() - .Single(method => method.Name == "Create" && method.IsGenericMethod && method.GetGenericArguments().Length == 1); + .Single(method => method is { Name: "Create", IsGenericMethod: true } && method.GetGenericArguments().Length == 1); MethodInfo tupleCreateClosedMethod = tupleCreateUnboundMethod.MakeGenericMethod(type); diff --git a/src/JsonApiDotNetCore/Resources/SortExpressionLambdaConverter.cs b/src/JsonApiDotNetCore/Resources/SortExpressionLambdaConverter.cs index f1efa204d4..8696195e28 100644 --- a/src/JsonApiDotNetCore/Resources/SortExpressionLambdaConverter.cs +++ b/src/JsonApiDotNetCore/Resources/SortExpressionLambdaConverter.cs @@ -69,7 +69,7 @@ private static Expression SkipConvert(Expression expression) private static (Expression? innerExpression, bool isCount) TryReadCount(Expression expression) { - if (expression is MethodCallExpression methodCallExpression && methodCallExpression.Method.Name == "Count") + if (expression is MethodCallExpression { Method.Name: "Count" } methodCallExpression) { if (methodCallExpression.Arguments.Count <= 1) { @@ -81,7 +81,7 @@ private static (Expression? innerExpression, bool isCount) TryReadCount(Expressi if (expression is MemberExpression memberExpression) { - if (memberExpression.Member.MemberType == MemberTypes.Property && memberExpression.Member.Name is "Count" or "Length") + if (memberExpression.Member is { MemberType: MemberTypes.Property, Name: "Count" or "Length" }) { if (memberExpression.Member.GetCustomAttribute() == null) { @@ -114,7 +114,7 @@ private static (Expression? innerExpression, bool isCount) TryReadCount(Expressi private Expression? ReadAttribute(Expression expression) { - if (expression is MemberExpression { Expression: { } } memberExpression) + if (expression is MemberExpression { Expression: not null } memberExpression) { ResourceType resourceType = _resourceGraph.GetResourceType(memberExpression.Expression.Type); AttrAttribute? attribute = resourceType.FindAttributeByPropertyName(memberExpression.Member.Name); diff --git a/src/JsonApiDotNetCore/Serialization/Request/Adapters/ResourceIdentityAdapter.cs b/src/JsonApiDotNetCore/Serialization/Request/Adapters/ResourceIdentityAdapter.cs index e4c0df21df..6964427680 100644 --- a/src/JsonApiDotNetCore/Serialization/Request/Adapters/ResourceIdentityAdapter.cs +++ b/src/JsonApiDotNetCore/Serialization/Request/Adapters/ResourceIdentityAdapter.cs @@ -131,7 +131,7 @@ private static void AssertHasNoLid(ResourceIdentity identity, RequestAdapterStat private static void AssertNoIdWithLid(ResourceIdentity identity, RequestAdapterState state) { - if (identity.Id != null && identity.Lid != null) + if (identity is { Id: not null, Lid: not null }) { throw new ModelConversionException(state.Position, "The 'id' and 'lid' element are mutually exclusive.", null); } diff --git a/src/JsonApiDotNetCore/Serialization/Response/LinkBuilder.cs b/src/JsonApiDotNetCore/Serialization/Response/LinkBuilder.cs index c6d32e2648..7550cbf761 100644 --- a/src/JsonApiDotNetCore/Serialization/Response/LinkBuilder.cs +++ b/src/JsonApiDotNetCore/Serialization/Response/LinkBuilder.cs @@ -80,7 +80,7 @@ private static string NoAsyncSuffix(string actionName) links.Self = GetLinkForTopLevelSelf(); } - if (_request.Kind == EndpointKind.Relationship && _request.Relationship != null && ShouldIncludeTopLevelLink(LinkTypes.Related, resourceType)) + if (_request is { Kind: EndpointKind.Relationship, Relationship: not null } && ShouldIncludeTopLevelLink(LinkTypes.Related, resourceType)) { links.Related = GetLinkForRelationshipRelated(_request.PrimaryId!, _request.Relationship); } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/CompositeKeys/CarExpressionRewriter.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/CompositeKeys/CarExpressionRewriter.cs index a599ed8eae..2c1e378e77 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/CompositeKeys/CarExpressionRewriter.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/CompositeKeys/CarExpressionRewriter.cs @@ -30,7 +30,7 @@ public CarExpressionRewriter(IResourceGraph resourceGraph) public override QueryExpression? VisitComparison(ComparisonExpression expression, object? argument) { - if (expression.Left is ResourceFieldChainExpression leftChain && expression.Right is LiteralConstantExpression rightConstant) + if (expression is { Left: ResourceFieldChainExpression leftChain, Right: LiteralConstantExpression rightConstant }) { PropertyInfo leftProperty = leftChain.Fields[^1].Property; From 9c38d5548d71b0b36ca61066cb93b81574682ab1 Mon Sep 17 00:00:00 2001 From: Bart Koelman <10324372+bkoelman@users.noreply.github.com> Date: Thu, 13 Apr 2023 12:35:43 +0200 Subject: [PATCH 4/7] Apply Resharper hint: convert switch statement to expression --- .../SourceCodeWriter.cs | 19 +++------ .../OperationProcessorAccessor.cs | 39 +++++-------------- .../Middleware/ExceptionHandler.cs | 12 ++++-- .../QueryableBuilding/WhereClauseBuilder.cs | 32 ++++----------- .../EntityFrameworkCoreRepository.cs | 19 +++------ 5 files changed, 35 insertions(+), 86 deletions(-) diff --git a/src/JsonApiDotNetCore.SourceGenerators/SourceCodeWriter.cs b/src/JsonApiDotNetCore.SourceGenerators/SourceCodeWriter.cs index 3ac3f5cb64..648906e901 100644 --- a/src/JsonApiDotNetCore.SourceGenerators/SourceCodeWriter.cs +++ b/src/JsonApiDotNetCore.SourceGenerators/SourceCodeWriter.cs @@ -130,21 +130,12 @@ private void WriteOpenClassDeclaration(string controllerName, JsonApiEndpointsCo private static string GetControllerBaseClassName(JsonApiEndpointsCopy endpointsToGenerate) { - switch (endpointsToGenerate) + return endpointsToGenerate switch { - case JsonApiEndpointsCopy.Query: - { - return "JsonApiQueryController"; - } - case JsonApiEndpointsCopy.Command: - { - return "JsonApiCommandController"; - } - default: - { - return "JsonApiController"; - } - } + JsonApiEndpointsCopy.Query => "JsonApiQueryController", + JsonApiEndpointsCopy.Command => "JsonApiCommandController", + _ => "JsonApiController" + }; } private void WriteConstructor(string controllerName, INamedTypeSymbol loggerFactoryInterface, JsonApiEndpointsCopy endpointsToGenerate, diff --git a/src/JsonApiDotNetCore/AtomicOperations/OperationProcessorAccessor.cs b/src/JsonApiDotNetCore/AtomicOperations/OperationProcessorAccessor.cs index c2397267b3..a052aa2d6e 100644 --- a/src/JsonApiDotNetCore/AtomicOperations/OperationProcessorAccessor.cs +++ b/src/JsonApiDotNetCore/AtomicOperations/OperationProcessorAccessor.cs @@ -40,36 +40,15 @@ protected virtual IOperationProcessor ResolveProcessor(OperationContainer operat private static Type GetProcessorInterface(WriteOperationKind writeOperation) { - switch (writeOperation) + return writeOperation switch { - case WriteOperationKind.CreateResource: - { - return typeof(ICreateProcessor<,>); - } - case WriteOperationKind.UpdateResource: - { - return typeof(IUpdateProcessor<,>); - } - case WriteOperationKind.DeleteResource: - { - return typeof(IDeleteProcessor<,>); - } - case WriteOperationKind.SetRelationship: - { - return typeof(ISetRelationshipProcessor<,>); - } - case WriteOperationKind.AddToRelationship: - { - return typeof(IAddToRelationshipProcessor<,>); - } - case WriteOperationKind.RemoveFromRelationship: - { - return typeof(IRemoveFromRelationshipProcessor<,>); - } - default: - { - throw new NotSupportedException($"Unknown write operation kind '{writeOperation}'."); - } - } + WriteOperationKind.CreateResource => typeof(ICreateProcessor<,>), + WriteOperationKind.UpdateResource => typeof(IUpdateProcessor<,>), + WriteOperationKind.DeleteResource => typeof(IDeleteProcessor<,>), + WriteOperationKind.SetRelationship => typeof(ISetRelationshipProcessor<,>), + WriteOperationKind.AddToRelationship => typeof(IAddToRelationshipProcessor<,>), + WriteOperationKind.RemoveFromRelationship => typeof(IRemoveFromRelationshipProcessor<,>), + _ => throw new NotSupportedException($"Unknown write operation kind '{writeOperation}'.") + }; } } diff --git a/src/JsonApiDotNetCore/Middleware/ExceptionHandler.cs b/src/JsonApiDotNetCore/Middleware/ExceptionHandler.cs index b8690402a5..80905d1231 100644 --- a/src/JsonApiDotNetCore/Middleware/ExceptionHandler.cs +++ b/src/JsonApiDotNetCore/Middleware/ExceptionHandler.cs @@ -71,15 +71,19 @@ protected virtual IReadOnlyList CreateErrorResponse(Exception excep { ArgumentGuard.NotNull(exception); - IReadOnlyList errors = exception is JsonApiException jsonApiException ? jsonApiException.Errors : - exception is OperationCanceledException ? new ErrorObject((HttpStatusCode)499) + IReadOnlyList errors = exception switch + { + JsonApiException jsonApiException => jsonApiException.Errors, + OperationCanceledException => new ErrorObject((HttpStatusCode)499) { Title = "Request execution was canceled." - }.AsArray() : new ErrorObject(HttpStatusCode.InternalServerError) + }.AsArray(), + _ => new ErrorObject(HttpStatusCode.InternalServerError) { Title = "An unhandled error occurred while processing this request.", Detail = exception.Message - }.AsArray(); + }.AsArray() + }; if (_options.IncludeExceptionStackTraceInErrors && exception is not InvalidModelStateException) { diff --git a/src/JsonApiDotNetCore/Queries/Internal/QueryableBuilding/WhereClauseBuilder.cs b/src/JsonApiDotNetCore/Queries/Internal/QueryableBuilding/WhereClauseBuilder.cs index 87cd066a85..c2e8407c8e 100644 --- a/src/JsonApiDotNetCore/Queries/Internal/QueryableBuilding/WhereClauseBuilder.cs +++ b/src/JsonApiDotNetCore/Queries/Internal/QueryableBuilding/WhereClauseBuilder.cs @@ -191,31 +191,15 @@ public override Expression VisitComparison(ComparisonExpression expression, obje Expression left = WrapInConvert(Visit(expression.Left, argument), commonType); Expression right = WrapInConvert(Visit(expression.Right, argument), commonType); - switch (expression.Operator) + return expression.Operator switch { - case ComparisonOperator.Equals: - { - return Expression.Equal(left, right); - } - case ComparisonOperator.LessThan: - { - return Expression.LessThan(left, right); - } - case ComparisonOperator.LessOrEqual: - { - return Expression.LessThanOrEqual(left, right); - } - case ComparisonOperator.GreaterThan: - { - return Expression.GreaterThan(left, right); - } - case ComparisonOperator.GreaterOrEqual: - { - return Expression.GreaterThanOrEqual(left, right); - } - } - - throw new InvalidOperationException($"Unknown comparison operator '{expression.Operator}'."); + ComparisonOperator.Equals => Expression.Equal(left, right), + ComparisonOperator.LessThan => Expression.LessThan(left, right), + ComparisonOperator.LessOrEqual => Expression.LessThanOrEqual(left, right), + ComparisonOperator.GreaterThan => Expression.GreaterThan(left, right), + ComparisonOperator.GreaterOrEqual => Expression.GreaterThanOrEqual(left, right), + _ => throw new InvalidOperationException($"Unknown comparison operator '{expression.Operator}'.") + }; } private Type ResolveCommonType(QueryExpression left, QueryExpression right) diff --git a/src/JsonApiDotNetCore/Repositories/EntityFrameworkCoreRepository.cs b/src/JsonApiDotNetCore/Repositories/EntityFrameworkCoreRepository.cs index 074e902341..89cfe76b87 100644 --- a/src/JsonApiDotNetCore/Repositories/EntityFrameworkCoreRepository.cs +++ b/src/JsonApiDotNetCore/Repositories/EntityFrameworkCoreRepository.cs @@ -347,21 +347,12 @@ private NavigationEntry GetNavigationEntry(TResource resource, RelationshipAttri { EntityEntry entityEntry = _dbContext.Entry(resource); - switch (relationship) + return relationship switch { - case HasOneAttribute hasOneRelationship: - { - return entityEntry.Reference(hasOneRelationship.Property.Name); - } - case HasManyAttribute hasManyRelationship: - { - return entityEntry.Collection(hasManyRelationship.Property.Name); - } - default: - { - throw new InvalidOperationException($"Unknown relationship type '{relationship.GetType().Name}'."); - } - } + HasOneAttribute hasOneRelationship => entityEntry.Reference(hasOneRelationship.Property.Name), + HasManyAttribute hasManyRelationship => entityEntry.Collection(hasManyRelationship.Property.Name), + _ => throw new InvalidOperationException($"Unknown relationship type '{relationship.GetType().Name}'.") + }; } private bool RequiresLoadOfRelationshipForDeletion(RelationshipAttribute relationship) From f7019615b4a3618256e0a38c698e47954007fc4a Mon Sep 17 00:00:00 2001 From: Bart Koelman <10324372+bkoelman@users.noreply.github.com> Date: Thu, 13 Apr 2023 12:44:01 +0200 Subject: [PATCH 5/7] Apply Resharper hint: pass string interpolation --- src/Examples/JsonApiDotNetCoreExample/appsettings.json | 2 +- src/JsonApiDotNetCore/Diagnostics/CascadingCodeTimer.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Examples/JsonApiDotNetCoreExample/appsettings.json b/src/Examples/JsonApiDotNetCoreExample/appsettings.json index 0e63c6a380..ec2ea30102 100644 --- a/src/Examples/JsonApiDotNetCoreExample/appsettings.json +++ b/src/Examples/JsonApiDotNetCoreExample/appsettings.json @@ -9,7 +9,7 @@ "Microsoft.EntityFrameworkCore.Update": "Critical", "Microsoft.EntityFrameworkCore.Database.Command": "Critical", "JsonApiDotNetCore.Middleware.JsonApiMiddleware": "Information", - "Program": "Information" + "JsonApiDotNetCoreExample": "Information" } }, "AllowedHosts": "*" diff --git a/src/JsonApiDotNetCore/Diagnostics/CascadingCodeTimer.cs b/src/JsonApiDotNetCore/Diagnostics/CascadingCodeTimer.cs index a2aa7a379b..4b4d82b62b 100644 --- a/src/JsonApiDotNetCore/Diagnostics/CascadingCodeTimer.cs +++ b/src/JsonApiDotNetCore/Diagnostics/CascadingCodeTimer.cs @@ -238,12 +238,12 @@ private void WriteResult(StringBuilder builder, int indent, TimeSpan timeElapsed WriteIndent(builder, indent); builder.Append(Name); WritePadding(builder, indent, paddingLength); - builder.AppendFormat(CultureInfo.InvariantCulture, "{0,19:G}", timeElapsedInSelf); + builder.Append(CultureInfo.InvariantCulture, $"{timeElapsedInSelf,19:G}"); if (!_excludeInRelativeCost) { builder.Append(" ... "); - builder.AppendFormat(CultureInfo.InvariantCulture, "{0,7:#0.00%}", scaleElapsedInSelf); + builder.Append(CultureInfo.InvariantCulture, $"{scaleElapsedInSelf,7:#0.00%}"); } if (_stoppedAt == null) From 865b3a3ec68ce904cd2f6f59787490fec4197de4 Mon Sep 17 00:00:00 2001 From: Bart Koelman <10324372+bkoelman@users.noreply.github.com> Date: Sat, 25 Mar 2023 18:51:55 +0100 Subject: [PATCH 6/7] Reduce noice from IDE rules --- .editorconfig | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.editorconfig b/.editorconfig index ca191cf90e..86cbbc3700 100644 --- a/.editorconfig +++ b/.editorconfig @@ -66,15 +66,18 @@ csharp_indent_case_contents_when_block = false csharp_preserve_single_line_statements = false # 'var' usage preferences -csharp_style_var_for_built_in_types = false:suggestion -csharp_style_var_when_type_is_apparent = true:suggestion -csharp_style_var_elsewhere = false:suggestion +csharp_style_var_for_built_in_types = false:none +csharp_style_var_when_type_is_apparent = true:none +csharp_style_var_elsewhere = false:none # Parentheses preferences dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:suggestion dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:suggestion dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:suggestion +# Expression value is never used +dotnet_diagnostic.IDE0058.severity = none + #### Naming Style #### dotnet_diagnostic.IDE1006.severity = warning From 35eb36f1809178d6ce7e528b016b39af4d6f2fe2 Mon Sep 17 00:00:00 2001 From: Bart Koelman <10324372+bkoelman@users.noreply.github.com> Date: Thu, 13 Apr 2023 13:29:04 +0200 Subject: [PATCH 7/7] Package update --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index a7ee36a2d9..820d031038 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -35,6 +35,6 @@ 3.2.* 4.18.* - 17.4.* + 17.5.*