26
26
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32
using Mono.Collections.Generic;
29
34
namespace Mono.Cecil {
33
public class MethodReference : MemberReference, IMethodSignature, IGenericParameterProvider {
35
ParameterDefinitionCollection m_parameters;
36
MethodReturnType m_returnType;
40
MethodCallingConvention m_callConv;
41
GenericParameterCollection m_genparams;
36
public class MethodReference : MemberReference, IMethodSignature, IGenericParameterProvider, IGenericContext {
38
internal ParameterDefinitionCollection parameters;
39
MethodReturnType return_type;
43
MethodCallingConvention calling_convention;
44
internal Collection<GenericParameter> generic_parameters;
43
46
public virtual bool HasThis {
44
get { return m_hasThis; }
45
set { m_hasThis = value; }
47
get { return has_this; }
48
set { has_this = value; }
48
51
public virtual bool ExplicitThis {
49
get { return m_explicitThis; }
50
set { m_explicitThis = value; }
52
get { return explicit_this; }
53
set { explicit_this = value; }
53
56
public virtual MethodCallingConvention CallingConvention {
54
get { return m_callConv; }
55
set { m_callConv = value; }
57
get { return calling_convention; }
58
set { calling_convention = value; }
58
61
public virtual bool HasParameters {
59
get { return (m_parameters == null) ? false : (m_parameters.Count > 0); }
62
public virtual ParameterDefinitionCollection Parameters {
64
if (m_parameters == null)
65
m_parameters = new ParameterDefinitionCollection (this);
70
public bool HasGenericParameters {
71
get { return (m_genparams == null) ? false : (m_genparams.Count > 0); }
74
public GenericParameterCollection GenericParameters {
76
if (m_genparams == null)
77
m_genparams = new GenericParameterCollection (this);
82
public virtual MethodReturnType ReturnType {
83
get { return m_returnType;}
84
set { m_returnType = value; }
87
internal MethodReference (string name, bool hasThis,
88
bool explicitThis, MethodCallingConvention callConv) : this (name)
90
m_parameters = new ParameterDefinitionCollection (this);
92
m_explicitThis = explicitThis;
93
m_callConv = callConv;
96
internal MethodReference (string name) : base (name)
98
m_returnType = new MethodReturnType (null);
101
public MethodReference (string name,
102
TypeReference declaringType, TypeReference returnType,
103
bool hasThis, bool explicitThis, MethodCallingConvention callConv) :
104
this (name, hasThis, explicitThis, callConv)
62
get { return !parameters.IsNullOrEmpty (); }
65
public virtual Collection<ParameterDefinition> Parameters {
67
if (parameters == null)
68
parameters = new ParameterDefinitionCollection (this);
74
IGenericParameterProvider IGenericContext.Type {
76
var declaring_type = this.DeclaringType;
77
var instance = declaring_type as GenericInstanceType;
79
return instance.ElementType;
81
return declaring_type;
85
IGenericParameterProvider IGenericContext.Method {
89
GenericParameterType IGenericParameterProvider.GenericParameterType {
90
get { return GenericParameterType.Method; }
93
public virtual bool HasGenericParameters {
94
get { return !generic_parameters.IsNullOrEmpty (); }
97
public virtual Collection<GenericParameter> GenericParameters {
99
if (generic_parameters != null)
100
return generic_parameters;
102
return generic_parameters = new Collection<GenericParameter> ();
106
public TypeReference ReturnType {
108
var return_type = MethodReturnType;
109
return return_type != null ? return_type.ReturnType : null;
112
var return_type = MethodReturnType;
113
if (return_type != null)
114
return_type.ReturnType = value;
118
public virtual MethodReturnType MethodReturnType {
119
get { return return_type; }
120
set { return_type = value; }
123
public override string FullName {
125
var builder = new StringBuilder ();
126
builder.Append (ReturnType.FullName);
127
builder.Append (" ");
128
builder.Append (MemberFullName ());
129
this.MethodSignatureFullName (builder);
130
return builder.ToString ();
134
public virtual bool IsGenericInstance {
135
get { return false; }
138
internal override bool ContainsGenericParameter {
140
if (this.ReturnType.ContainsGenericParameter || base.ContainsGenericParameter)
143
var parameters = this.Parameters;
145
for (int i = 0; i < parameters.Count; i++)
146
if (parameters [i].ParameterType.ContainsGenericParameter)
153
internal MethodReference ()
155
this.return_type = new MethodReturnType (this);
156
this.token = new MetadataToken (TokenType.MemberRef);
159
public MethodReference (string name, TypeReference returnType)
162
if (returnType == null)
163
throw new ArgumentNullException ("returnType");
165
this.return_type = new MethodReturnType (this);
166
this.return_type.ReturnType = returnType;
167
this.token = new MetadataToken (TokenType.MemberRef);
170
public MethodReference (string name, TypeReference returnType, TypeReference declaringType)
171
: this (name, returnType)
173
if (declaringType == null)
174
throw new ArgumentNullException ("declaringType");
106
176
this.DeclaringType = declaringType;
107
this.ReturnType.ReturnType = returnType;
179
public virtual MethodReference GetElementMethod ()
110
184
public virtual MethodDefinition Resolve ()
112
TypeReference declaringType = DeclaringType;
113
if (declaringType == null)
116
return declaringType.Module.Resolver.Resolve (this);
119
public virtual MethodReference GetOriginalMethod ()
124
public int GetSentinel ()
127
for (int i = 0; i < Parameters.Count; i++)
128
if (Parameters [i].ParameterType is SentinelType)
186
var module = this.Module;
188
throw new NotSupportedException ();
190
return module.Resolve (this);
194
static partial class Mixin {
196
public static bool IsVarArg (this IMethodSignature self)
198
return (self.CallingConvention & MethodCallingConvention.VarArg) != 0;
201
public static int GetSentinelPosition (this IMethodSignature self)
203
if (!self.HasParameters)
206
var parameters = self.Parameters;
207
for (int i = 0; i < parameters.Count; i++)
208
if (parameters [i].ParameterType.IsSentinel)
134
public override string ToString ()
136
int sentinel = GetSentinel ();
138
StringBuilder sb = new StringBuilder ();
139
sb.Append (m_returnType.ReturnType.FullName);
141
sb.Append (base.ToString ());
143
if (this.HasParameters) {
144
for (int i = 0; i < this.Parameters.Count; i++) {
151
sb.Append (this.Parameters [i].ParameterType.FullName);
155
return sb.ToString ();