public interface ParameterData {
Type ParameterType (int pos);
GenericConstraints GenericConstraints (int pos);
- bool HasArrayParameter { get; }
int Count { get; }
+ bool HasParams { get; }
string ParameterName (int pos);
string ParameterDesc (int pos);
Parameter.Modifier ParameterModifier (int pos);
+ string GetSignatureForError ();
}
public class ReflectionParameters : ParameterData {
if (mb.Mono_IsInflatedMethod) {
MethodInfo generic = mb.GetGenericMethodDefinition ();
- gpd = Invocation.GetParameterData (generic);
+ gpd = TypeManager.GetParameterData (generic);
- last_arg_is_params = gpd.HasArrayParameter;
+ last_arg_is_params = gpd.HasParams;
return;
}
last_arg_is_params = true;
}
-
- public bool HasArrayParameter {
- get { return last_arg_is_params; }
+
+ public string GetSignatureForError ()
+ {
+ StringBuilder sb = new StringBuilder ("(");
+ for (int i = 0; i < pi.Length; ++i) {
+ if (i != 0)
+ sb.Append (", ");
+ sb.Append (ParameterDesc (i));
+ }
+ sb.Append (')');
+ return sb.ToString ();
}
public Type ParameterType (int pos)
public string ParameterName (int pos)
{
+ if (gpd != null)
+ return gpd.ParameterName (pos);
+
if (last_arg_is_params && pos >= pi.Length - 1)
return pi [pi.Length - 1].Name;
else if (is_varargs && pos >= pi.Length)
if (pos >= pi.Length - 1 && last_arg_is_params)
sb.Append ("params ");
- sb.Append (TypeManager.CSharpName (partype));
+ sb.Append (TypeManager.CSharpName (partype).Replace ("&", ""));
return sb.ToString ();
public Parameter.Modifier ParameterModifier (int pos)
{
- int len = pi.Length;
-
if (last_arg_is_params && pos >= pi.Length - 1)
return Parameter.Modifier.PARAMS;
else if (is_varargs && pos >= pi.Length)
return Parameter.Modifier.ARGLIST;
+ if (gpd != null)
+ return gpd.ParameterModifier (pos);
+
Type t = pi [pos].ParameterType;
if (t.IsByRef){
- if ((pi [pos].Attributes & ParameterAttributes.Out) != 0)
+ if ((pi [pos].Attributes & (ParameterAttributes.Out|ParameterAttributes.In)) == ParameterAttributes.Out)
return Parameter.Modifier.ISBYREF | Parameter.Modifier.OUT;
else
return Parameter.Modifier.ISBYREF | Parameter.Modifier.REF;
return is_varargs ? pi.Length + 1 : pi.Length;
}
}
+
+ public bool HasParams {
+ get {
+ return this.last_arg_is_params;
+ }
+ }
}
public class InternalParameters : ParameterData {
{
this.param_types = param_types;
this.Parameters = parameters;
- }
- public InternalParameters (DeclSpace ds, Parameters parameters)
- : this (parameters.GetParameterInfo (ds), parameters)
- {
has_varargs = parameters.HasArglist;
if (param_types == null)
count = param_types.Length;
}
- public InternalParameters (DeclSpace ds, Parameters parameters,
+ public InternalParameters (Type [] param_types, Parameters parameters,
TypeParameter [] type_params)
- : this (ds, parameters)
+ : this (param_types, parameters)
{
this.TypeParameters = type_params;
}
}
}
- public bool HasArrayParameter {
- get { return Parameters.ArrayParameter != null; }
+ public bool HasParams {
+ get {
+ return Parameters.ArrayParameter != null;
+ }
}
Parameter GetParameter (int pos)
return Parameters.ArrayParameter;
}
+ public string GetSignatureForError ()
+ {
+ StringBuilder sb = new StringBuilder ("(");
+ for (int i = 0; i < count; ++i) {
+ if (i != 0)
+ sb.Append (", ");
+ sb.Append (ParameterDesc (i));
+ }
+ sb.Append (')');
+ return sb.ToString ();
+ }
+
public Type ParameterType (int pos)
{
if (has_varargs && pos >= count)
if (has_varargs && pos >= count)
return "__arglist";
- string tmp = String.Empty;
+ Type t = ParameterType (pos);
+ return (ModifierDesc (pos) + " " + TypeManager.CSharpName (t).Replace ("&", "")).TrimStart ();
+ }
+
+ public string ModifierDesc (int pos)
+ {
Parameter p = GetParameter (pos);
//
// extra flag ISBYREF will be set as well
//
if ((p.ModFlags & Parameter.Modifier.REF) != 0)
- tmp = "ref ";
- else if ((p.ModFlags & Parameter.Modifier.OUT) != 0)
- tmp = "out ";
- else if (p.ModFlags == Parameter.Modifier.PARAMS)
- tmp = "params ";
-
- Type t = ParameterType (pos);
+ return "ref";
+ if ((p.ModFlags & Parameter.Modifier.OUT) != 0)
+ return "out";
+ if (p.ModFlags == Parameter.Modifier.PARAMS)
+ return "params";
- return tmp + TypeManager.CSharpName (t);
+ return "";
}
public Parameter.Modifier ParameterModifier (int pos)
// buffer.
if ((value >= buffer_start) && (value < buffer_start + buffer_size)) {
int byte_offset = value - buffer_start;
+
+ // pos is an index into a char
+ // buffer so it might be
+ // greater than the buffer
+ // length now, if the buffer
+ // contains multibyte chars
pos = byte_offset;
- // encoded characters can take more than 1 byte length
- while (reader.CurrentEncoding.GetByteCount (buffer, 0, pos) > byte_offset)
+
+ // encoded characters can take
+ // more than 1 byte length.
+ while ((pos > buffer.Length) ||
+ reader.CurrentEncoding.GetByteCount (buffer, 0, pos) > byte_offset) {
pos--;
+ }
return;
}