Skip to content

Commit f952c7b

Browse files
committed
Simplify
1 parent f0610f5 commit f952c7b

4 files changed

Lines changed: 70 additions & 62 deletions

File tree

ReflectionAnalyzers/Helpers/Reflection/EventInfo.cs

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22
{
33
using System.Threading;
44

5-
using Gu.Roslyn.AnalyzerExtensions;
6-
75
using Microsoft.CodeAnalysis;
8-
using Microsoft.CodeAnalysis.CSharp;
96
using Microsoft.CodeAnalysis.CSharp.Syntax;
107

118
internal readonly struct EventInfo
@@ -21,29 +18,12 @@ internal EventInfo(INamedTypeSymbol reflectedType, IEventSymbol @event)
2118

2219
internal static EventInfo? Find(ExpressionSyntax expression, SemanticModel semanticModel, CancellationToken cancellationToken)
2320
{
24-
return expression switch
25-
{
26-
InvocationExpressionSyntax invocation
27-
when GetX.TryMatchGetEvent(invocation, semanticModel, cancellationToken, out var member, out _, out _) &&
28-
member.ReflectedType is { } &&
29-
member.Symbol is IEventSymbol @event
30-
=> new EventInfo(member.ReflectedType, @event),
31-
IdentifierNameSyntax identifierName => FindAssigned(identifierName),
32-
MemberAccessExpressionSyntax memberAccess => FindAssigned(memberAccess),
33-
_ => null,
34-
};
35-
36-
EventInfo? FindAssigned(ExpressionSyntax member)
21+
if (GetEvent.Match(expression, semanticModel, cancellationToken) is { Member: { ReflectedType: { } reflectedType, Symbol: IEventSymbol symbol } })
3722
{
38-
if (member.IsEither(SyntaxKind.IdentifierName, SyntaxKind.SimpleMemberAccessExpression) &&
39-
semanticModel.TryGetSymbol(member, cancellationToken, out var local) &&
40-
AssignedValue.FindSingle(local, semanticModel, cancellationToken) is { } assignedValue)
41-
{
42-
return Find(assignedValue, semanticModel, cancellationToken);
43-
}
44-
45-
return null;
23+
return new EventInfo(reflectedType, symbol);
4624
}
25+
26+
return null;
4727
}
4828
}
4929
}
Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
namespace ReflectionAnalyzers
22
{
33
using System.Threading;
4-
5-
using Gu.Roslyn.AnalyzerExtensions;
6-
74
using Microsoft.CodeAnalysis;
8-
using Microsoft.CodeAnalysis.CSharp;
95
using Microsoft.CodeAnalysis.CSharp.Syntax;
106

117
internal readonly struct FieldInfo
@@ -21,27 +17,12 @@ internal FieldInfo(INamedTypeSymbol reflectedType, IFieldSymbol field)
2117

2218
internal static FieldInfo? Find(ExpressionSyntax expression, SemanticModel semanticModel, CancellationToken cancellationToken)
2319
{
24-
return expression switch
25-
{
26-
InvocationExpressionSyntax invocation
27-
when GetField.Match(invocation, semanticModel, cancellationToken) is { Member: { ReflectedType: { } reflectedType, Symbol: IFieldSymbol field } }
28-
=> new FieldInfo(reflectedType, field),
29-
IdentifierNameSyntax identifierName => FindAssigned(identifierName),
30-
MemberAccessExpressionSyntax memberAccess => FindAssigned(memberAccess),
31-
_ => null,
32-
};
33-
34-
FieldInfo? FindAssigned(ExpressionSyntax member)
20+
if (GetField.Match(expression, semanticModel, cancellationToken) is { Member: { ReflectedType: { } reflectedType, Symbol: IFieldSymbol symbol } })
3521
{
36-
if (member.IsEither(SyntaxKind.IdentifierName, SyntaxKind.SimpleMemberAccessExpression) &&
37-
semanticModel.TryGetSymbol(member, cancellationToken, out var local) &&
38-
AssignedValue.FindSingle(local, semanticModel, cancellationToken) is { } assignedValue)
39-
{
40-
return Find(assignedValue, semanticModel, cancellationToken);
41-
}
42-
43-
return null;
22+
return new FieldInfo(reflectedType, symbol);
4423
}
24+
25+
return null;
4526
}
4627
}
4728
}

ReflectionAnalyzers/Helpers/Reflection/GetField.cs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,63 @@ private GetField(InvocationExpressionSyntax invocation, IMethodSymbol target, Re
6464
return null;
6565
}
6666
}
67+
68+
internal readonly struct GetEvent
69+
{
70+
internal readonly InvocationExpressionSyntax Invocation;
71+
internal readonly IMethodSymbol Target;
72+
internal readonly ReflectedMember Member;
73+
internal readonly Name Name;
74+
internal readonly Flags Flags;
75+
76+
private GetEvent(InvocationExpressionSyntax invocation, IMethodSymbol target, ReflectedMember member, Name name, Flags flags)
77+
{
78+
this.Invocation = invocation;
79+
this.Target = target;
80+
this.Member = member;
81+
this.Name = name;
82+
this.Flags = flags;
83+
}
84+
85+
internal IEventSymbol? Single => this.Member.Match == FilterMatch.Single ? (IEventSymbol)this.Member.Symbol! : null;
86+
87+
/// <summary>
88+
/// Check if <paramref name="candidate"/> is a call to Type.GetField.
89+
/// </summary>
90+
internal static GetEvent? Match(ExpressionSyntax candidate, SemanticModel semanticModel, CancellationToken cancellationToken)
91+
{
92+
if (GetX.FindInvocation(candidate, semanticModel, cancellationToken) is { } invocation)
93+
{
94+
return Match(invocation, semanticModel, cancellationToken);
95+
}
96+
97+
return null;
98+
}
99+
100+
/// <summary>
101+
/// Check if <paramref name="candidate"/> is a call to Type.GetField.
102+
/// </summary>
103+
internal static GetEvent? Match(InvocationExpressionSyntax candidate, SemanticModel semanticModel, CancellationToken cancellationToken)
104+
{
105+
if (candidate.TryGetTarget(KnownSymbol.Type.GetField, semanticModel, cancellationToken, out var target))
106+
{
107+
if (ReflectedMember.TryGetType(candidate, semanticModel, cancellationToken, out var type, out var typeSource) &&
108+
Name.TryCreate(candidate, target, semanticModel, cancellationToken, out var name) &&
109+
Flags.TryCreate(candidate, target, semanticModel, cancellationToken, out var flags) &&
110+
ReflectedMember.TryCreate(target, candidate, type, typeSource, name, flags.Effective, Types.Any, semanticModel.Compilation, out var member))
111+
{
112+
return new GetEvent(candidate, target, member, name, flags);
113+
}
114+
115+
if (Flags.TryCreate(candidate, target, semanticModel, cancellationToken, out flags) &&
116+
flags.AreInSufficient)
117+
{
118+
_ = Name.TryCreate(candidate, target, semanticModel, cancellationToken, out name);
119+
member = new ReflectedMember(type, typeSource, null, target, candidate, FilterMatch.InSufficientFlags);
120+
return new GetEvent(candidate, target, member, name, flags);
121+
}
122+
}
123+
124+
return null;
125+
}
126+
}

ReflectionAnalyzers/Helpers/Reflection/PropertyInfo.cs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
namespace ReflectionAnalyzers
22
{
33
using System.Threading;
4-
5-
using Gu.Roslyn.AnalyzerExtensions;
6-
74
using Microsoft.CodeAnalysis;
8-
using Microsoft.CodeAnalysis.CSharp;
95
using Microsoft.CodeAnalysis.CSharp.Syntax;
106

117
internal readonly struct PropertyInfo
@@ -21,18 +17,9 @@ internal PropertyInfo(INamedTypeSymbol reflectedType, IPropertySymbol property)
2117

2218
internal static PropertyInfo? Find(ExpressionSyntax expression, SemanticModel semanticModel, CancellationToken cancellationToken)
2319
{
24-
switch (expression)
25-
{
26-
case InvocationExpressionSyntax invocation
27-
when GetProperty.Match(invocation, semanticModel, cancellationToken) is { Member: { ReflectedType: { } reflectedType, Symbol: IPropertySymbol property } }:
28-
return new PropertyInfo(reflectedType, property);
29-
}
30-
31-
if (expression.IsEither(SyntaxKind.IdentifierName, SyntaxKind.SimpleMemberAccessExpression) &&
32-
semanticModel.TryGetSymbol(expression, cancellationToken, out var local) &&
33-
AssignedValue.FindSingle(local, semanticModel, cancellationToken) is { } assignedValue)
20+
if (GetProperty.Match(expression, semanticModel, cancellationToken) is { Member: { ReflectedType: { } reflectedType, Symbol: IPropertySymbol symbol } })
3421
{
35-
return Find(assignedValue, semanticModel, cancellationToken);
22+
return new PropertyInfo(reflectedType, symbol);
3623
}
3724

3825
return null;

0 commit comments

Comments
 (0)