@@ -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+ }
0 commit comments