@@ -35,10 +35,38 @@ private MethodNameFormatter(MetadataReader metadataReader, SigTypeContext typeCo
35
35
_typeContext = typeContext ;
36
36
}
37
37
38
- public static string FormatMethodName ( MetadataReader metadataReader , Handle methodHandle )
38
+ public static string FormatMethodName ( MetadataReader metadataReader , Handle owningType , ConstantStringValueHandle name , MethodSignatureHandle signature , ConstantStringArrayHandle genericArguments )
39
39
{
40
- MethodNameFormatter formatter = new MethodNameFormatter ( metadataReader , SigTypeContext . FromMethod ( metadataReader , methodHandle ) ) ;
41
- formatter . EmitMethodName ( methodHandle ) ;
40
+ MethodNameFormatter formatter = new MethodNameFormatter ( metadataReader , SigTypeContext . FromMethod ( metadataReader , owningType , genericArguments ) ) ;
41
+ formatter . EmitTypeName ( owningType , namespaceQualified : true ) ;
42
+ formatter . _outputBuilder . Append ( '.' ) ;
43
+ formatter . EmitString ( name ) ;
44
+
45
+ if ( ! genericArguments . IsNull ( metadataReader ) )
46
+ {
47
+ var args = metadataReader . GetConstantStringArray ( genericArguments ) ;
48
+ bool first = true ;
49
+ foreach ( Handle handle in args . Value )
50
+ {
51
+ if ( first )
52
+ {
53
+ first = false ;
54
+ formatter . _outputBuilder . Append ( '[' ) ;
55
+ }
56
+ else
57
+ {
58
+ formatter . _outputBuilder . Append ( ',' ) ;
59
+ }
60
+ formatter . EmitString ( handle . ToConstantStringValueHandle ( metadataReader ) ) ;
61
+ }
62
+ if ( ! first )
63
+ {
64
+ formatter . _outputBuilder . Append ( ']' ) ;
65
+ }
66
+ }
67
+
68
+ formatter . EmitMethodParameters ( metadataReader . GetMethodSignature ( signature ) ) ;
69
+
42
70
return formatter . _outputBuilder . ToString ( ) ;
43
71
}
44
72
@@ -75,99 +103,6 @@ public static string FormatMethodName(MetadataReader metadataReader, TypeDefinit
75
103
return formatter . _outputBuilder . ToString ( ) ;
76
104
}
77
105
78
- /// <summary>
79
- /// Emit a given method signature to a specified string builder.
80
- /// </summary>
81
- /// <param name="methodHandle">Method reference or instantiation token</param>
82
- private void EmitMethodName ( Handle methodHandle )
83
- {
84
- switch ( methodHandle . HandleType )
85
- {
86
- case HandleType . MemberReference :
87
- EmitMethodReferenceName ( methodHandle . ToMemberReferenceHandle ( _metadataReader ) ) ;
88
- break ;
89
-
90
- case HandleType . MethodInstantiation :
91
- EmitMethodInstantiationName ( methodHandle . ToMethodInstantiationHandle ( _metadataReader ) ) ;
92
- break ;
93
-
94
- case HandleType . QualifiedMethod :
95
- EmitMethodDefinitionName ( methodHandle . ToQualifiedMethodHandle ( _metadataReader ) ) ;
96
- break ;
97
-
98
- default :
99
- Debug . Assert ( false ) ;
100
- _outputBuilder . Append ( "???" ) ;
101
- break ;
102
- }
103
- }
104
-
105
- /// <summary>
106
- /// Emit method reference to the output string builder.
107
- /// </summary>
108
- /// <param name="memberRefHandle">Member reference handle</param>
109
- private void EmitMethodReferenceName ( MemberReferenceHandle memberRefHandle )
110
- {
111
- MemberReference methodRef = _metadataReader . GetMemberReference ( memberRefHandle ) ;
112
- MethodSignature methodSignature ;
113
- EmitContainingTypeAndMethodName ( methodRef , out methodSignature ) ;
114
- EmitMethodParameters ( methodSignature ) ;
115
- }
116
-
117
- /// <summary>
118
- /// Emit generic method instantiation to the output string builder.
119
- /// </summary>
120
- /// <param name="methodInstHandle">Method instantiation handle</param>
121
- private void EmitMethodInstantiationName ( MethodInstantiationHandle methodInstHandle )
122
- {
123
- MethodInstantiation methodInst = _metadataReader . GetMethodInstantiation ( methodInstHandle ) ;
124
-
125
- if ( methodInst . Method . HandleType == HandleType . MemberReference )
126
- {
127
- MemberReferenceHandle methodRefHandle = methodInst . Method . ToMemberReferenceHandle ( _metadataReader ) ;
128
- MemberReference methodRef = methodRefHandle . GetMemberReference ( _metadataReader ) ;
129
- EmitContainingTypeAndMethodName ( methodRef , out MethodSignature methodSignature ) ;
130
- EmitGenericArguments ( methodInst . GenericTypeArguments ) ;
131
- EmitMethodParameters ( methodSignature ) ;
132
- }
133
- else
134
- {
135
- QualifiedMethodHandle qualifiedMethodHandle = methodInst . Method . ToQualifiedMethodHandle ( _metadataReader ) ;
136
- QualifiedMethod qualifiedMethod = _metadataReader . GetQualifiedMethod ( qualifiedMethodHandle ) ;
137
- EmitContainingTypeAndMethodName ( qualifiedMethod ) ;
138
- EmitGenericArguments ( methodInst . GenericTypeArguments ) ;
139
- EmitMethodParameters ( qualifiedMethod . Method ) ;
140
- }
141
- }
142
-
143
- private void EmitMethodDefinitionName ( QualifiedMethodHandle qualifiedMethodHandle )
144
- {
145
- QualifiedMethod qualifiedMethod = _metadataReader . GetQualifiedMethod ( qualifiedMethodHandle ) ;
146
- EmitContainingTypeAndMethodName ( qualifiedMethod ) ;
147
- EmitMethodParameters ( qualifiedMethod . Method ) ;
148
- }
149
-
150
- /// <summary>
151
- /// Emit containing type and method name and extract the method signature from a method reference.
152
- /// </summary>
153
- /// <param name="methodRef">Method reference to format</param>
154
- /// <param name="methodSignature">Output method signature</param>
155
- private void EmitContainingTypeAndMethodName ( MemberReference methodRef , out MethodSignature methodSignature )
156
- {
157
- methodSignature = _metadataReader . GetMethodSignature ( methodRef . Signature . ToMethodSignatureHandle ( _metadataReader ) ) ;
158
- EmitTypeName ( methodRef . Parent , namespaceQualified : true ) ;
159
- _outputBuilder . Append ( '.' ) ;
160
- EmitString ( methodRef . Name ) ;
161
- }
162
-
163
- private void EmitContainingTypeAndMethodName ( QualifiedMethod qualifiedMethod )
164
- {
165
- Method method = _metadataReader . GetMethod ( qualifiedMethod . Method ) ;
166
- EmitTypeName ( qualifiedMethod . EnclosingType , namespaceQualified : true ) ;
167
- _outputBuilder . Append ( '.' ) ;
168
- EmitString ( method . Name ) ;
169
- }
170
-
171
106
/// <summary>
172
107
/// Emit parenthesized method argument type list.
173
108
/// </summary>
@@ -308,6 +243,11 @@ private void EmitTypeName(Handle typeHandle, bool namespaceQualified)
308
243
EmitFunctionPointerTypeName ( ) ;
309
244
break ;
310
245
246
+ // This is not an actual type, but we don't always bother representing generic arguments on generic methods as types
247
+ case HandleType . ConstantStringValue :
248
+ EmitString ( typeHandle . ToConstantStringValueHandle ( _metadataReader ) ) ;
249
+ break ;
250
+
311
251
default :
312
252
Debug . Assert ( false , $ "Type handle { typeHandle . HandleType } was not handled") ;
313
253
_outputBuilder . Append ( "???" ) ;
@@ -588,35 +528,12 @@ private static object GetTypeContext(MetadataReader metadataReader, Handle handl
588
528
}
589
529
}
590
530
591
- public static SigTypeContext FromMethod ( MetadataReader metadataReader , Handle methodHandle )
531
+ public static SigTypeContext FromMethod ( MetadataReader metadataReader , Handle enclosingTypeHandle , ConstantStringArrayHandle methodInst )
592
532
{
593
- object typeContext ;
594
- object methodContext ;
595
-
596
- switch ( methodHandle . HandleType )
597
- {
598
- case HandleType . MemberReference :
599
- typeContext = GetTypeContext ( metadataReader , methodHandle ) ;
600
- methodContext = default ( HandleCollection ) ;
601
- break ;
602
-
603
- case HandleType . MethodInstantiation :
604
- MethodInstantiation methodInst = methodHandle . ToMethodInstantiationHandle ( metadataReader ) . GetMethodInstantiation ( metadataReader ) ;
605
- typeContext = GetTypeContext ( metadataReader , methodInst . Method ) ;
606
- methodContext = methodInst . GenericTypeArguments ;
607
- break ;
608
-
609
- case HandleType . QualifiedMethod :
610
- QualifiedMethod qualifiedMethod = methodHandle . ToQualifiedMethodHandle ( metadataReader ) . GetQualifiedMethod ( metadataReader ) ;
611
- typeContext = GetTypeContext ( metadataReader , qualifiedMethod . EnclosingType ) ;
612
- methodContext = qualifiedMethod . Method . GetMethod ( metadataReader ) . GenericParameters ;
613
- break ;
614
- default :
615
- Debug . Assert ( false ) ;
616
- return default ( SigTypeContext ) ;
617
- }
618
-
619
- return new SigTypeContext ( typeContext , methodContext ) ;
533
+ object methodContext = null ;
534
+ if ( ! methodInst . IsNull ( metadataReader ) )
535
+ methodContext = methodInst . GetConstantStringArray ( metadataReader ) . Value ;
536
+ return new SigTypeContext ( GetTypeContext ( metadataReader , enclosingTypeHandle ) , methodContext ) ;
620
537
}
621
538
622
539
public static SigTypeContext FromMethod ( MetadataReader metadataReader , TypeDefinitionHandle enclosingTypeHandle , MethodHandle methodHandle )
0 commit comments