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.*