diff --git a/Directory.Packages.props b/Directory.Packages.props index f22d56b8..62653e99 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -13,7 +13,7 @@ - + diff --git a/Funcky.Analyzers/Funcky.Analyzers.CodeFixes/OptionSomeWhereToFromBooleanRefactoring.cs b/Funcky.Analyzers/Funcky.Analyzers.CodeFixes/OptionSomeWhereToFromBooleanRefactoring.cs index dbf7f280..b1b1cc9f 100644 --- a/Funcky.Analyzers/Funcky.Analyzers.CodeFixes/OptionSomeWhereToFromBooleanRefactoring.cs +++ b/Funcky.Analyzers/Funcky.Analyzers.CodeFixes/OptionSomeWhereToFromBooleanRefactoring.cs @@ -51,19 +51,17 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte private static bool IsWhereInvocation(SyntaxNode syntax, SemanticModel semanticModel, Symbols symbols, [NotNullWhen(true)] out IInvocationOperation? whereInvocation) { whereInvocation = null; - return semanticModel.GetOperation(syntax) is IInvocationOperation operation - && operation.TargetMethod.Name == WhereMethodName - && SymbolEqualityComparer.Default.Equals(symbols.GenericOptionType, operation.TargetMethod.ContainingType.ConstructedFrom) - && (whereInvocation = operation) is var _; + return semanticModel.GetOperation(syntax) is IInvocationOperation { TargetMethod.Name: WhereMethodName } operation + && SymbolEqualityComparer.Default.Equals(symbols.GenericOptionType, operation.TargetMethod.ContainingType.ConstructedFrom) + && (whereInvocation = operation) is var _; } private static bool IsOptionReturnInvocation(IOperation? candidate, Symbols symbols, [NotNullWhen(true)] out IInvocationOperation? returnInvocationOperation) { returnInvocationOperation = null; - return candidate is IInvocationOperation operation - && operation.TargetMethod.Name is MonadReturnMethodName or OptionSomeMethodName - && SymbolEqualityComparer.Default.Equals(symbols.OptionType, operation.TargetMethod.ContainingType) - && (returnInvocationOperation = operation) is var _; + return candidate is IInvocationOperation { TargetMethod.Name: MonadReturnMethodName or OptionSomeMethodName } operation + && SymbolEqualityComparer.Default.Equals(symbols.OptionType, operation.TargetMethod.ContainingType) + && (returnInvocationOperation = operation) is var _; } private static ApplyPredicate? TryGetPredicateApplier(InvocationExpressionSyntax whereInvocation, SemanticModel semanticModel) @@ -82,7 +80,7 @@ LambdaExpressionSyntax lambda when => lambda switch { SimpleLambdaExpressionSyntax { Parameter: var parameter } => parameter, - ParenthesizedLambdaExpressionSyntax { ParameterList.Parameters: { Count: 1 } parameters } => parameters.Single(), + ParenthesizedLambdaExpressionSyntax { ParameterList.Parameters: [var parameter] } => parameter, _ => null, }; @@ -90,11 +88,11 @@ LambdaExpressionSyntax lambda when => lambda switch { { ExpressionBody: { } expressionBody } => expressionBody, - { Block.Statements: { Count: 1 } statements } when statements.Single() is ReturnStatementSyntax { Expression: var returnExpression } => returnExpression, + { Block.Statements: [ReturnStatementSyntax { Expression: var returnExpression }] } => returnExpression, _ => null, }; - private Func> ReplaceWithOptionFromBoolean(Document document, Symbols symbols, ApplyPredicate applyPredicate, InvocationExpressionSyntax whereInvocation, InvocationExpressionSyntax returnInvocation) + private static Func> ReplaceWithOptionFromBoolean(Document document, Symbols symbols, ApplyPredicate applyPredicate, InvocationExpressionSyntax whereInvocation, InvocationExpressionSyntax returnInvocation) => async cancellationToken => { var editor = await DocumentEditor.CreateAsync(document, cancellationToken); @@ -112,7 +110,7 @@ private Func> ReplaceWithOptionFromBoolean(Doc return editor.GetChangedDocument(); }; - private InvocationExpressionSyntax CreateFromBooleanInvocation( + private static InvocationExpressionSyntax CreateFromBooleanInvocation( InvocationExpressionSyntax returnInvocation, Symbols symbols, SyntaxGenerator generator, @@ -127,12 +125,12 @@ private InvocationExpressionSyntax CreateFromBooleanInvocation( ArgumentList(SeparatedList(new[] { Argument(condition), Argument(returnValue) }))) .WithLeadingTrivia(returnInvocation.GetLeadingTrivia()); - private SimpleNameSyntax GetFromBooleanName(InvocationExpressionSyntax returnInvocation) + private static SimpleNameSyntax GetFromBooleanName(InvocationExpressionSyntax returnInvocation) => GetMethodName(returnInvocation) is GenericNameSyntax genericNameSyntax ? genericNameSyntax.WithIdentifier(Identifier(OptionFromBooleanMethodName)) : IdentifierName(OptionFromBooleanMethodName); - private SimpleNameSyntax GetMethodName(InvocationExpressionSyntax invocationExpressionSyntax) + private static SimpleNameSyntax GetMethodName(InvocationExpressionSyntax invocationExpressionSyntax) => invocationExpressionSyntax.Expression switch { SimpleNameSyntax simpleNameSyntax => simpleNameSyntax, diff --git a/Funcky.Analyzers/Funcky.Analyzers/AlternativeMonadAnalyzer/AlternativeMonadAnalyzer.GetOrElse.cs b/Funcky.Analyzers/Funcky.Analyzers/AlternativeMonadAnalyzer/AlternativeMonadAnalyzer.GetOrElse.cs index 8cc0562b..02efac2a 100644 --- a/Funcky.Analyzers/Funcky.Analyzers/AlternativeMonadAnalyzer/AlternativeMonadAnalyzer.GetOrElse.cs +++ b/Funcky.Analyzers/Funcky.Analyzers/AlternativeMonadAnalyzer/AlternativeMonadAnalyzer.GetOrElse.cs @@ -25,7 +25,7 @@ private static bool IsGetOrElseEquivalent(INamedTypeSymbol receiverType, IArgume private static ITypeSymbol? GetTypeOrDelegateReturnType(IOperation operation) => operation switch { - IDelegateCreationOperation { Target: IAnonymousFunctionOperation { Body.Operations: { Length: 1 } operations } } when operations[0] is IReturnOperation returnOperation => returnOperation.ReturnedValue?.Type, + IDelegateCreationOperation { Target: IAnonymousFunctionOperation { Body.Operations: [IReturnOperation returnOperation] } } => returnOperation.ReturnedValue?.Type, IDelegateCreationOperation { Target: IAnonymousFunctionOperation { Symbol.ReturnType: var returnType } } => returnType, IDelegateCreationOperation { Target: IMethodReferenceOperation { Method.ReturnType: var returnType } } => returnType, _ => operation.Type, diff --git a/Funcky.Analyzers/Funcky.Analyzers/AnonymousFunctionMatching.cs b/Funcky.Analyzers/Funcky.Analyzers/AnonymousFunctionMatching.cs index 41f54bed..cab39b56 100644 --- a/Funcky.Analyzers/Funcky.Analyzers/AnonymousFunctionMatching.cs +++ b/Funcky.Analyzers/Funcky.Analyzers/AnonymousFunctionMatching.cs @@ -18,8 +18,7 @@ public static bool MatchAnonymousFunctionWithSingleReturn( [NotNullWhen(true)] out IReturnOperation? functionReturnOperation) { functionReturnOperation = null; - return anonymousFunction.Body.Operations.Length == 1 - && anonymousFunction.Body.Operations[0] is IReturnOperation returnOperation - && (functionReturnOperation = returnOperation) is var _; + return anonymousFunction.Body.Operations is [IReturnOperation returnOperation] + && (functionReturnOperation = returnOperation) is var _; } } diff --git a/Funcky.Analyzers/Funcky.Analyzers/MonadReturnMatching.cs b/Funcky.Analyzers/Funcky.Analyzers/MonadReturnMatching.cs index f1ea3d8e..8a12e734 100644 --- a/Funcky.Analyzers/Funcky.Analyzers/MonadReturnMatching.cs +++ b/Funcky.Analyzers/Funcky.Analyzers/MonadReturnMatching.cs @@ -24,11 +24,10 @@ private static bool IsReturn(AlternativeMonadType alternativeMonadType, IMethodS private static bool IsReturnFunction(AlternativeMonadType alternativeMonadType, IAnonymousFunctionOperation anonymousFunction) => MatchAnonymousUnaryFunctionWithSingleReturn(anonymousFunction, out var returnOperation) - && returnOperation is { ReturnedValue: IInvocationOperation returnedValue } - && IsReturn(alternativeMonadType, returnedValue.TargetMethod) - && returnedValue.Arguments.Length == 1 - && returnedValue.Arguments[0].Value is IParameterReferenceOperation { Parameter.ContainingSymbol: var parameterContainingSymbol } - && SymbolEqualityComparer.Default.Equals(parameterContainingSymbol, anonymousFunction.Symbol); + && returnOperation is { ReturnedValue: IInvocationOperation returnedValue } + && IsReturn(alternativeMonadType, returnedValue.TargetMethod) + && returnedValue.Arguments is [{ Value: IParameterReferenceOperation { Parameter.ContainingSymbol: var parameterContainingSymbol } }] + && SymbolEqualityComparer.Default.Equals(parameterContainingSymbol, anonymousFunction.Symbol); private static bool IsImplicitReturn(AlternativeMonadType alternativeMonadType, IAnonymousFunctionOperation anonymousFunction) => MatchAnonymousUnaryFunctionWithSingleReturn(anonymousFunction, out var returnOperation) diff --git a/Funcky.Analyzers/Funcky.Analyzers/SyntaxNodeExtensions.ExpressionTree.cs b/Funcky.Analyzers/Funcky.Analyzers/SyntaxNodeExtensions.ExpressionTree.cs index 84dc0a7d..10843c70 100644 --- a/Funcky.Analyzers/Funcky.Analyzers/SyntaxNodeExtensions.ExpressionTree.cs +++ b/Funcky.Analyzers/Funcky.Analyzers/SyntaxNodeExtensions.ExpressionTree.cs @@ -52,9 +52,8 @@ private static bool TakesExpressionTree(SymbolInfo info, INamedTypeSymbol expres => GetAllSymbols(info).Any(symbol => TakesExpressionTreeAsFirstArgument(symbol, expressionType)); private static bool TakesExpressionTreeAsFirstArgument(ISymbol symbol, INamedTypeSymbol expressionType) - => symbol is IMethodSymbol method - && method.Parameters.Length > 0 - && SymbolEqualityComparer.Default.Equals(expressionType, method.Parameters[0].Type?.OriginalDefinition); + => symbol is IMethodSymbol { Parameters: [var firstParameter, ..] } + && SymbolEqualityComparer.Default.Equals(expressionType, firstParameter.Type.OriginalDefinition); private sealed record IsExpressionTreeContext( SyntaxNode Syntax, diff --git a/Funcky.Test/Extensions/HttpHeadersNonValidatedExtensionsTest.cs b/Funcky.Test/Extensions/HttpHeadersNonValidatedExtensionsTest.cs index 6efb9c10..2fc69194 100644 --- a/Funcky.Test/Extensions/HttpHeadersNonValidatedExtensionsTest.cs +++ b/Funcky.Test/Extensions/HttpHeadersNonValidatedExtensionsTest.cs @@ -4,6 +4,7 @@ using FsCheck.Xunit; namespace Funcky.Test.Extensions; + public sealed class HttpHeadersNonValidatedExtensionsTest { [Property] diff --git a/Funcky/Extensions/ParseExtensions/ParseExtensions.GenericNumber.cs b/Funcky/Extensions/ParseExtensions/ParseExtensions.GenericNumber.cs index 8acc0e71..6870d2d3 100644 --- a/Funcky/Extensions/ParseExtensions/ParseExtensions.GenericNumber.cs +++ b/Funcky/Extensions/ParseExtensions/ParseExtensions.GenericNumber.cs @@ -3,6 +3,7 @@ using System.Numerics; namespace Funcky.Extensions; + public static partial class ParseExtensions { public static Option ParseNumberOrNone(this string value, NumberStyles style, IFormatProvider? provider) diff --git a/Funcky/Extensions/ParseExtensions/ParseExtensions.TimeOnly.cs b/Funcky/Extensions/ParseExtensions/ParseExtensions.TimeOnly.cs index 76a73476..f694e2f5 100644 --- a/Funcky/Extensions/ParseExtensions/ParseExtensions.TimeOnly.cs +++ b/Funcky/Extensions/ParseExtensions/ParseExtensions.TimeOnly.cs @@ -2,9 +2,8 @@ using Funcky.Internal; namespace Funcky.Extensions; + [OrNoneFromTryPattern(typeof(TimeOnly), nameof(TimeOnly.TryParse))] [OrNoneFromTryPattern(typeof(TimeOnly), nameof(TimeOnly.TryParseExact))] -public static partial class ParseExtensions -{ -} +public static partial class ParseExtensions; #endif