@@ -10,13 +10,20 @@ namespace NetDoc
1010 public class Call
1111 {
1212 private readonly MemberReference m_Operand ;
13+ private readonly MethodReference ? m_Delegate ;
1314 private IEnumerable < string > ReferencedDlls { get ; }
1415
1516 public Call ( Instruction instruction , IEnumerable < string > referencedDlls )
1617 {
1718 ReferencedDlls = referencedDlls ;
1819 m_Operand = ( MemberReference ) instruction . Operand ;
19- if ( instruction . OpCode == OpCodes . Ldfld || instruction . OpCode == OpCodes . Stfld )
20+ if ( instruction . OpCode == OpCodes . Newobj &&
21+ MethodReference ? . Parameters . Select ( x => x . ParameterType . Name ) . SequenceEqual ( [ nameof ( Object ) , nameof ( IntPtr ) ] ) == true &&
22+ instruction . Previous . OpCode == OpCodes . Ldftn )
23+ {
24+ m_Delegate = ( MethodReference ) instruction . Previous . Operand ;
25+ }
26+ else if ( instruction . OpCode == OpCodes . Ldfld || instruction . OpCode == OpCodes . Stfld )
2027 {
2128 IsStatic = false ;
2229 }
@@ -85,10 +92,13 @@ private string BuildInvocation()
8592
8693 if ( m_Operand . Name == ".ctor" )
8794 {
88- if ( parameterDefs . Select ( x => x . Name ) . SequenceEqual ( [ "object" , "method" ] ) )
95+ if ( m_Delegate != null )
8996 {
90- // not sure how to infer the delegate signature
91- return AssignToRandomVariable ( MethodReference . DeclaringType , "_ => default" ) ;
97+ var args = string . Join ( ", " , m_Delegate . Parameters . Select ( ( p , i ) => $ "{ GetTypeName ( p . ParameterType ) } arg{ i } ") ) ;
98+ var expression = m_Delegate . ReturnType . FullName == "System.Void"
99+ ? "{}"
100+ : CallToFactory ( m_Delegate . ReturnType ) ;
101+ return AssignToRandomVariable ( MethodReference . DeclaringType , $ "({ args } ) => { expression } ") ;
92102 }
93103
94104 return AssignToRandomVariable ( MethodReference . DeclaringType , $ "new { TypeWithGenerics } ({ parameters } )") ;
0 commit comments