Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
using System.Collections.Immutable;
using System.Composition;
using Funcky.Analyzers.CodeAnalysisExtensions;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Editing;
using static Funcky.Analyzers.AlternativeMonadAnalyzer;
using static Funcky.Analyzers.AlternativeMonad.AlternativeMonadAnalyzer;
using static Funcky.Analyzers.FunckyWellKnownMemberNames;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
using System.Collections.Immutable;
using System.Composition;
using Funcky.Analyzers.CodeAnalysisExtensions;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Editing;
using static Funcky.Analyzers.AlternativeMonadAnalyzer;
using static Funcky.Analyzers.AlternativeMonad.AlternativeMonadAnalyzer;
using static Funcky.Analyzers.FunckyWellKnownMemberNames;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System.Diagnostics.CodeAnalysis;
using Microsoft.CodeAnalysis;

namespace Funcky.Analyzers;
namespace Funcky.Analyzers.CodeAnalysisExtensions;

internal static class DiagnosticExtensions
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Editing;

namespace Funcky.Analyzers;
namespace Funcky.Analyzers.CodeAnalysisExtensions;

internal static class SyntaxGeneratorExtensions
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Operations;

namespace Funcky.Analyzers.CodeAnalysisExtensions;

internal static partial class SyntaxNodeExtensions
{
public static TNode ReplaceParameterReferences<TNode>(this TNode node, SemanticModel semanticModel, string parameterName, ExpressionSyntax replacement)
where TNode : SyntaxNode
=> (TNode)new ReplaceParameterReferenceRewriter(semanticModel, parameterName, replacement).Visit(node);

private sealed class ReplaceParameterReferenceRewriter(
SemanticModel semanticModel,
string parameterName,
ExpressionSyntax replacement)
: CSharpSyntaxRewriter(visitIntoStructuredTrivia: false)
{
public override SyntaxNode VisitIdentifierName(IdentifierNameSyntax node)
=> semanticModel.GetOperation(node) is IParameterReferenceOperation { Parameter.Name: var name } && name == parameterName
? replacement.WithTriviaFrom(node)
: node;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;

namespace Funcky.Analyzers;
namespace Funcky.Analyzers.CodeAnalysisExtensions;

internal static partial class SyntaxNodeExtensions
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Immutable;
using System.Composition;
using Funcky.Analyzers.CodeAnalysisExtensions;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Immutable;
using System.Composition;
using Funcky.Analyzers.CodeAnalysisExtensions;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
<PropertyGroup>
<AnalyzerLanguage>cs</AnalyzerLanguage>
</PropertyGroup>
<ItemGroup>
<Compile Include="..\Funcky.Analyzers\CodeAnalysisExtensions\SymbolEqualityFunctions.cs" Link="CodeAnalysisExtensions\%(Filename)%(Extension)" />
<Using Include="Funcky.Analyzers.CodeAnalysisExtensions.SymbolEqualityFunctions" Static="true" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="PolySharp" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" VersionOverride="$(AnalyzerRoslynVersion)" PrivateAssets="all" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Immutable;
using System.Composition;
using Funcky.Analyzers.CodeAnalysisExtensions;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Composition;
using System.Diagnostics.CodeAnalysis;
using Funcky.Analyzers.CodeAnalysisExtensions;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeRefactorings;
Expand Down Expand Up @@ -52,15 +53,15 @@ private static bool IsWhereInvocation(SyntaxNode syntax, SemanticModel semanticM
{
whereInvocation = null;
return semanticModel.GetOperation(syntax) is IInvocationOperation { TargetMethod.Name: WhereMethodName } operation
&& SymbolEqualityComparer.Default.Equals(symbols.GenericOptionType, operation.TargetMethod.ContainingType.ConstructedFrom)
&& SymbolEquals(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 { TargetMethod.Name: MonadReturnMethodName or OptionSomeMethodName } operation
&& SymbolEqualityComparer.Default.Equals(symbols.OptionType, operation.TargetMethod.ContainingType)
&& SymbolEquals(symbols.OptionType, operation.TargetMethod.ContainingType)
&& (returnInvocationOperation = operation) is var _;
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Funcky.Analyzers.Test;
namespace Funcky.Analyzers.Test.AlternativeMonad;

public sealed partial class AlternativeMonadAnalyzerTest
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#pragma warning disable SA1118 // StyleCop support for collection expressions is missing
using Xunit;
using static Funcky.Analyzers.AlternativeMonadAnalyzer;
using VerifyCS = Funcky.Analyzers.Test.CSharpCodeFixVerifier<Funcky.Analyzers.AlternativeMonadAnalyzer, Funcky.Analyzers.AlternativeMonad.MatchToNullableCodeFix>;
using static Funcky.Analyzers.AlternativeMonad.AlternativeMonadAnalyzer;
using VerifyCS = Funcky.Analyzers.Test.CSharpCodeFixVerifier<Funcky.Analyzers.AlternativeMonad.AlternativeMonadAnalyzer, Funcky.Analyzers.AlternativeMonad.MatchToNullableCodeFix>;

namespace Funcky.Analyzers.Test;
namespace Funcky.Analyzers.Test.AlternativeMonad;

public sealed partial class AlternativeMonadAnalyzerTest
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#pragma warning disable SA1118 // StyleCop support for collection expressions is missing
using Xunit;
using static Funcky.Analyzers.AlternativeMonadAnalyzer;
using VerifyCS = Funcky.Analyzers.Test.CSharpCodeFixVerifier<Funcky.Analyzers.AlternativeMonadAnalyzer, Funcky.Analyzers.AlternativeMonad.MatchToOrElseCodeFix>;
using static Funcky.Analyzers.AlternativeMonad.AlternativeMonadAnalyzer;
using VerifyCS = Funcky.Analyzers.Test.CSharpCodeFixVerifier<Funcky.Analyzers.AlternativeMonad.AlternativeMonadAnalyzer, Funcky.Analyzers.AlternativeMonad.MatchToOrElseCodeFix>;

namespace Funcky.Analyzers.Test;
namespace Funcky.Analyzers.Test.AlternativeMonad;

public sealed partial class AlternativeMonadAnalyzerTest
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using Microsoft.CodeAnalysis.Testing;
using Xunit;
using VerifyCS = Funcky.Analyzers.Test.CSharpAnalyzerVerifier<Funcky.Analyzers.NonDefaultableAnalyzer>;
using VerifyCS = Funcky.Analyzers.Test.CSharpAnalyzerVerifier<Funcky.Analyzers.NonDefaultable.NonDefaultableAnalyzer>;

namespace Funcky.Analyzers.Test;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Operations;
using static Funcky.Analyzers.FunckyWellKnownMemberNames;
using static Funcky.Analyzers.IdentityFunctionMatching;
using static Funcky.Analyzers.Functions.IdentityFunctionMatching;

namespace Funcky.Analyzers;
namespace Funcky.Analyzers.AlternativeMonad;

public partial class AlternativeMonadAnalyzer
{
Expand All @@ -18,8 +18,8 @@ public partial class AlternativeMonadAnalyzer

/// <summary>Tests for a <c>Match</c> invocation of the shape <c>Match(none: A, some: Identity)</c>.</summary>
private static bool IsGetOrElseEquivalent(INamedTypeSymbol receiverType, IArgumentOperation errorStateArgument, IArgumentOperation successStateArgument)
=> SymbolEqualityComparer.IncludeNullability.Equals(receiverType.TypeArguments.Last(), GetTypeOrDelegateReturnType(errorStateArgument.Value))
&& SymbolEqualityComparer.Default.Equals(receiverType.TypeArguments.Last(), GetTypeOrDelegateReturnType(successStateArgument.Value))
=> SymbolEqualsIncludeNullability(receiverType.TypeArguments.Last(), GetTypeOrDelegateReturnType(errorStateArgument.Value))
&& SymbolEquals(receiverType.TypeArguments.Last(), GetTypeOrDelegateReturnType(successStateArgument.Value))
&& IsIdentityFunction(successStateArgument.Value);

private static ITypeSymbol? GetTypeOrDelegateReturnType(IOperation operation)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Operations;
using static Funcky.Analyzers.AlternativeMonad.MonadReturnMatching;
using static Funcky.Analyzers.FunckyWellKnownMemberNames;
using static Funcky.Analyzers.MonadReturnMatching;

namespace Funcky.Analyzers;
namespace Funcky.Analyzers.AlternativeMonad;

public partial class AlternativeMonadAnalyzer
{
Expand All @@ -18,6 +18,6 @@ public partial class AlternativeMonadAnalyzer

/// <summary>Tests for a <c>Match</c> invocation of the shape <c>Match(none: A, some: Option.Return)</c>.</summary>
private static bool IsOrElseEquivalent(AlternativeMonadType alternativeMonadType, IInvocationOperation matchInvocation, INamedTypeSymbol receiverType, IArgumentOperation successStateArgument)
=> SymbolEqualityComparer.IncludeNullability.Equals(receiverType, matchInvocation.Type)
=> SymbolEqualsIncludeNullability(receiverType, matchInvocation.Type)
&& IsReturnFunction(alternativeMonadType, successStateArgument.Value);
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Operations;
using static Funcky.Analyzers.AlternativeMonadErrorStateConstructorMatching;
using static Funcky.Analyzers.AlternativeMonad.AlternativeMonadErrorStateConstructorMatching;
using static Funcky.Analyzers.FunckyWellKnownMemberNames;

namespace Funcky.Analyzers;
namespace Funcky.Analyzers.AlternativeMonad;

public partial class AlternativeMonadAnalyzer
{
Expand All @@ -18,6 +18,6 @@ public partial class AlternativeMonadAnalyzer

/// <summary>Tests for a <c>Match</c> invocation of the shape <c>Match(none: Option&lt;T&gt;>.None, some: A)</c>.</summary>
private static bool IsSelectManyEquivalent(AlternativeMonadType alternativeMonadType, IInvocationOperation matchInvocation, INamedTypeSymbol receiverType, IArgumentOperation errorStateArgument)
=> SymbolEqualityComparer.IncludeNullability.Equals(receiverType, matchInvocation.Type)
=> SymbolEqualsIncludeNullability(receiverType, matchInvocation.Type)
&& IsErrorStateConstructorReference(alternativeMonadType, errorStateArgument.Value);
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
using Funcky.Analyzers.CodeAnalysisExtensions;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Operations;
using static Funcky.Analyzers.ConstantFunctionMatching;
using static Funcky.Analyzers.FunckyWellKnownMemberNames;
using static Funcky.Analyzers.IdentityFunctionMatching;
using static Funcky.Analyzers.Functions.ConstantFunctionMatching;
using static Funcky.Analyzers.Functions.IdentityFunctionMatching;

namespace Funcky.Analyzers;
namespace Funcky.Analyzers.AlternativeMonad;

public partial class AlternativeMonadAnalyzer
{
Expand All @@ -29,13 +30,13 @@ private static bool IsToNullableEquivalent(

bool IsToNullableReferenceType()
=> itemType.IsReferenceType
&& SymbolEqualityComparer.Default.Equals(receiverType.TypeArguments.Single(), matchInvocation.Type)
&& SymbolEquals(receiverType.TypeArguments.Single(), matchInvocation.Type)
&& IsNullOrNullFunction(noneArgument.Value)
&& IsIdentityFunction(someArgument.Value);

bool IsToNullableValueType()
=> itemType.IsValueType
&& SymbolEqualityComparer.Default.Equals(matchInvocation.SemanticModel?.NullableOfT(itemType), matchInvocation.Type)
&& SymbolEquals(matchInvocation.SemanticModel?.NullableOfT(itemType), matchInvocation.Type)
&& IsNullOrNullFunction(noneArgument.Value)
&& IsIdentityFunctionWithNullConversion(someArgument.Value);

Expand Down
Loading