@@ -35,10 +35,38 @@ private MethodNameFormatter(MetadataReader metadataReader, SigTypeContext typeCo
3535 _typeContext = typeContext ;
3636 }
3737
38- public static string FormatMethodName ( MetadataReader metadataReader , Handle methodHandle )
38+ public static string FormatMethodName ( MetadataReader metadataReader , Handle owningType , ConstantStringValueHandle name , MethodSignatureHandle signature , ConstantStringArrayHandle genericArguments )
3939 {
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+
4270 return formatter . _outputBuilder . ToString ( ) ;
4371 }
4472
@@ -75,99 +103,6 @@ public static string FormatMethodName(MetadataReader metadataReader, TypeDefinit
75103 return formatter . _outputBuilder . ToString ( ) ;
76104 }
77105
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-
171106 /// <summary>
172107 /// Emit parenthesized method argument type list.
173108 /// </summary>
@@ -308,6 +243,11 @@ private void EmitTypeName(Handle typeHandle, bool namespaceQualified)
308243 EmitFunctionPointerTypeName ( ) ;
309244 break ;
310245
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+
311251 default :
312252 Debug . Assert ( false , $ "Type handle { typeHandle . HandleType } was not handled") ;
313253 _outputBuilder . Append ( "???" ) ;
@@ -588,35 +528,12 @@ private static object GetTypeContext(MetadataReader metadataReader, Handle handl
588528 }
589529 }
590530
591- public static SigTypeContext FromMethod ( MetadataReader metadataReader , Handle methodHandle )
531+ public static SigTypeContext FromMethod ( MetadataReader metadataReader , Handle enclosingTypeHandle , ConstantStringArrayHandle methodInst )
592532 {
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 ) ;
620537 }
621538
622539 public static SigTypeContext FromMethod ( MetadataReader metadataReader , TypeDefinitionHandle enclosingTypeHandle , MethodHandle methodHandle )
0 commit comments