Skip to content

Commit f0610f5

Browse files
committed
Reduce duplication
1 parent 56ab9c0 commit f0610f5

5 files changed

Lines changed: 40 additions & 64 deletions

File tree

ReflectionAnalyzers/Helpers/Reflection/GetConstructor.cs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using Gu.Roslyn.AnalyzerExtensions;
66

77
using Microsoft.CodeAnalysis;
8-
using Microsoft.CodeAnalysis.CSharp;
98
using Microsoft.CodeAnalysis.CSharp.Syntax;
109

1110
internal readonly struct GetConstructor
@@ -32,22 +31,12 @@ private GetConstructor(InvocationExpressionSyntax invocation, IMethodSymbol targ
3231
/// </summary>
3332
internal static GetConstructor? Match(ExpressionSyntax candidate, SemanticModel semanticModel, CancellationToken cancellationToken)
3433
{
35-
return candidate switch
34+
if (GetX.FindInvocation(candidate, semanticModel, cancellationToken) is { } invocation)
3635
{
37-
InvocationExpressionSyntax invocation
38-
=> Match(invocation, semanticModel, cancellationToken),
39-
PostfixUnaryExpressionSyntax { RawKind: (int)SyntaxKind.SuppressNullableWarningExpression, Operand: InvocationExpressionSyntax invocation }
40-
=> Match(invocation, semanticModel, cancellationToken),
41-
MemberAccessExpressionSyntax { Expression: { } inner }
42-
=> Match(inner, semanticModel, cancellationToken),
43-
MemberBindingExpressionSyntax { Parent.Parent: ConditionalAccessExpressionSyntax { Expression: InvocationExpressionSyntax invocation } }
44-
=> Match(invocation, semanticModel, cancellationToken),
45-
IdentifierNameSyntax identifierName
46-
when semanticModel.TryGetSymbol(identifierName, cancellationToken, out ILocalSymbol? local) &&
47-
AssignedValue.FindSingle(local, semanticModel, cancellationToken) is { } value
48-
=> Match(value, semanticModel, cancellationToken),
49-
_ => null,
50-
};
36+
return Match(invocation, semanticModel, cancellationToken);
37+
}
38+
39+
return null;
5140
}
5241

5342
/// <summary>

ReflectionAnalyzers/Helpers/Reflection/GetField.cs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using System.Threading;
44
using Gu.Roslyn.AnalyzerExtensions;
55
using Microsoft.CodeAnalysis;
6-
using Microsoft.CodeAnalysis.CSharp;
76
using Microsoft.CodeAnalysis.CSharp.Syntax;
87

98
internal readonly struct GetField
@@ -30,22 +29,12 @@ private GetField(InvocationExpressionSyntax invocation, IMethodSymbol target, Re
3029
/// </summary>
3130
internal static GetField? Match(ExpressionSyntax candidate, SemanticModel semanticModel, CancellationToken cancellationToken)
3231
{
33-
return candidate switch
32+
if (GetX.FindInvocation(candidate, semanticModel, cancellationToken) is { } invocation)
3433
{
35-
InvocationExpressionSyntax invocation
36-
=> Match(invocation, semanticModel, cancellationToken),
37-
PostfixUnaryExpressionSyntax { RawKind: (int)SyntaxKind.SuppressNullableWarningExpression, Operand: InvocationExpressionSyntax invocation }
38-
=> Match(invocation, semanticModel, cancellationToken),
39-
MemberAccessExpressionSyntax { Expression: { } inner }
40-
=> Match(inner, semanticModel, cancellationToken),
41-
MemberBindingExpressionSyntax { Parent.Parent: ConditionalAccessExpressionSyntax { Expression: InvocationExpressionSyntax invocation } }
42-
=> Match(invocation, semanticModel, cancellationToken),
43-
IdentifierNameSyntax identifierName
44-
when semanticModel.TryGetSymbol(identifierName, cancellationToken, out ILocalSymbol? local) &&
45-
AssignedValue.FindSingle(local, semanticModel, cancellationToken) is { } value
46-
=> Match(value, semanticModel, cancellationToken),
47-
_ => null,
48-
};
34+
return Match(invocation, semanticModel, cancellationToken);
35+
}
36+
37+
return null;
4938
}
5039

5140
/// <summary>

ReflectionAnalyzers/Helpers/Reflection/GetMethod.cs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using Gu.Roslyn.AnalyzerExtensions;
66

77
using Microsoft.CodeAnalysis;
8-
using Microsoft.CodeAnalysis.CSharp;
98
using Microsoft.CodeAnalysis.CSharp.Syntax;
109

1110
internal readonly struct GetMethod
@@ -34,22 +33,12 @@ private GetMethod(InvocationExpressionSyntax invocation, IMethodSymbol target, R
3433
/// </summary>
3534
internal static GetMethod? Match(ExpressionSyntax candidate, SemanticModel semanticModel, CancellationToken cancellationToken)
3635
{
37-
return candidate switch
36+
if (GetX.FindInvocation(candidate, semanticModel, cancellationToken) is { } invocation)
3837
{
39-
InvocationExpressionSyntax invocation
40-
=> Match(invocation, semanticModel, cancellationToken),
41-
PostfixUnaryExpressionSyntax { RawKind: (int)SyntaxKind.SuppressNullableWarningExpression, Operand: InvocationExpressionSyntax invocation }
42-
=> Match(invocation, semanticModel, cancellationToken),
43-
MemberAccessExpressionSyntax { Expression: { } inner }
44-
=> Match(inner, semanticModel, cancellationToken),
45-
MemberBindingExpressionSyntax { Parent.Parent: ConditionalAccessExpressionSyntax { Expression: InvocationExpressionSyntax invocation } }
46-
=> Match(invocation, semanticModel, cancellationToken),
47-
IdentifierNameSyntax identifierName
48-
when semanticModel.TryGetSymbol(identifierName, cancellationToken, out ILocalSymbol? local) &&
49-
AssignedValue.FindSingle(local, semanticModel, cancellationToken) is { } value
50-
=> Match(value, semanticModel, cancellationToken),
51-
_ => null,
52-
};
38+
return Match(invocation, semanticModel, cancellationToken);
39+
}
40+
41+
return null;
5342
}
5443

5544
/// <summary>

ReflectionAnalyzers/Helpers/Reflection/GetProperty.cs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using Gu.Roslyn.AnalyzerExtensions;
66

77
using Microsoft.CodeAnalysis;
8-
using Microsoft.CodeAnalysis.CSharp;
98
using Microsoft.CodeAnalysis.CSharp.Syntax;
109

1110
internal readonly struct GetProperty
@@ -34,22 +33,12 @@ private GetProperty(InvocationExpressionSyntax invocation, IMethodSymbol target,
3433
/// </summary>
3534
internal static GetProperty? Match(ExpressionSyntax candidate, SemanticModel semanticModel, CancellationToken cancellationToken)
3635
{
37-
return candidate switch
36+
if (GetX.FindInvocation(candidate, semanticModel, cancellationToken) is { } invocation)
3837
{
39-
InvocationExpressionSyntax invocation
40-
=> Match(invocation, semanticModel, cancellationToken),
41-
PostfixUnaryExpressionSyntax { RawKind: (int)SyntaxKind.SuppressNullableWarningExpression, Operand: InvocationExpressionSyntax invocation }
42-
=> Match(invocation, semanticModel, cancellationToken),
43-
MemberAccessExpressionSyntax { Expression: { } inner }
44-
=> Match(inner, semanticModel, cancellationToken),
45-
MemberBindingExpressionSyntax { Parent.Parent: ConditionalAccessExpressionSyntax { Expression: InvocationExpressionSyntax invocation } }
46-
=> Match(invocation, semanticModel, cancellationToken),
47-
IdentifierNameSyntax identifierName
48-
when semanticModel.TryGetSymbol(identifierName, cancellationToken, out ILocalSymbol? local) &&
49-
AssignedValue.FindSingle(local, semanticModel, cancellationToken) is { } value
50-
=> Match(value, semanticModel, cancellationToken),
51-
_ => null,
52-
};
38+
return Match(invocation, semanticModel, cancellationToken);
39+
}
40+
41+
return null;
5342
}
5443

5544
/// <summary>

ReflectionAnalyzers/Helpers/Reflection/GetX.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,26 @@ internal static bool TryMatchGetNestedType(InvocationExpressionSyntax invocation
2929
return TryMatchGetX(invocation, KnownSymbol.Type.GetNestedType, semanticModel, cancellationToken, out member, out name, out flags);
3030
}
3131

32+
internal static InvocationExpressionSyntax? FindInvocation(ExpressionSyntax candidate, SemanticModel semanticModel, CancellationToken cancellationToken)
33+
{
34+
return candidate switch
35+
{
36+
InvocationExpressionSyntax invocation
37+
=> invocation,
38+
PostfixUnaryExpressionSyntax { RawKind: (int)SyntaxKind.SuppressNullableWarningExpression, Operand: InvocationExpressionSyntax invocation }
39+
=> invocation,
40+
MemberAccessExpressionSyntax { Expression: { } inner }
41+
=> FindInvocation(inner, semanticModel, cancellationToken),
42+
MemberBindingExpressionSyntax { Parent.Parent: ConditionalAccessExpressionSyntax { Expression: InvocationExpressionSyntax invocation } }
43+
=> invocation,
44+
IdentifierNameSyntax identifierName
45+
when semanticModel.TryGetSymbol(identifierName, cancellationToken, out ILocalSymbol? local) &&
46+
AssignedValue.FindSingle(local, semanticModel, cancellationToken) is { } value
47+
=> FindInvocation(value, semanticModel, cancellationToken),
48+
_ => null,
49+
};
50+
}
51+
3252
/// <summary>
3353
/// Handles GetField, GetEvent, GetMember, GetMethod...
3454
/// </summary>

0 commit comments

Comments
 (0)