}
}
+ public class ImplicitLambdaParameter : Parameter
+ {
+ public ImplicitLambdaParameter (string name, Location loc)
+ : base ((Type)null, name, Modifier.NONE, null, loc)
+ {
+ }
+
+ public override bool Resolve (IResolveContext ec)
+ {
+ if (parameter_type == null)
+ throw new InternalErrorException ("Implicit lambda parameter type is not set");
+
+ return true;
+ }
+ }
+
public class ParamsParameter : Parameter {
public ParamsParameter (Expression type, string name, Attributes attrs, Location loc):
base (type, name, Parameter.Modifier.PARAMS, attrs, loc)
static string[] attribute_targets = new string [] { "param" };
- public Expression TypeName;
+ Expression TypeName;
public Modifier modFlags;
public string Name;
public bool IsCaptured;
base.ApplyAttributeBuilder (a, cb);
}
-
+
public virtual bool CheckAccessibility (InterfaceMemberBase member)
{
if (IsTypeParameter)
types = new Type [0];
}
- public Parameters (Parameter[] parameters, Type[] types)
+ private Parameters (Parameter[] parameters, Type[] types)
{
FixedParameters = parameters;
this.types = types;
{
HasArglist = has_arglist;
}
+
+ public static Parameters CreateFullyResolved (Parameter p)
+ {
+ return new Parameters (new Parameter [] { p }, new Type [] { p.ParameterType });
+ }
+
+ public static Parameters CreateFullyResolved (Parameter[] parameters, Type[] types)
+ {
+ return new Parameters (parameters, types);
+ }
/// <summary>
/// Use this method when you merge compiler generated argument with user arguments
}
#if MS_COMPATIBLE
- public void InflateTypes (Type[] genArguments, Type[] argTypes)
+ public ParameterData InflateTypes (Type[] genArguments, Type[] argTypes)
{
+ Parameters p = Clone ();
for (int i = 0; i < count; ++i) {
- if (FixedParameters[i].IsTypeParameter) {
- for (int ii = 0; ii < genArguments.Length; ++ii) {
- if (types[i] != genArguments[ii])
- continue;
-
- types[i] = argTypes[ii];
- FixedParameters[i].ParameterType = types[i];
- break;
+ if (types[i].IsGenericType) {
+ Type[] gen_arguments_open = new Type [types[i].GetGenericTypeDefinition ().GetGenericArguments ().Length];
+ Type[] gen_arguments = types[i].GetGenericArguments ();
+ for (int ii = 0; ii < gen_arguments_open.Length; ++ii) {
+ if (gen_arguments[ii].IsGenericParameter) {
+ Type t = argTypes[gen_arguments[ii].GenericParameterPosition];
+ gen_arguments_open[ii] = t;
+ } else
+ gen_arguments_open[ii] = gen_arguments[ii];
}
+
+ p.FixedParameters [i].ParameterType = p.types[i] =
+ types[i].GetGenericTypeDefinition ().MakeGenericType (gen_arguments_open);
continue;
}
- if (types[i].IsGenericType) {
- types[i] = types[i].GetGenericTypeDefinition().MakeGenericType (argTypes[0]); // FIXME: The order can be different
- FixedParameters[i].ParameterType = types[i];
+ if (types[i].IsGenericParameter) {
+ Type gen_argument = argTypes[types[i].GenericParameterPosition];
+ p.FixedParameters[i].ParameterType = p.types[i] = gen_argument;
+ continue;
}
}
+
+ return p;
}
#endif
get {
return types;
}
+ //
+ // Dangerous, used by implicit lambda parameters
+ // only to workaround bad design
+ //
+ set {
+ types = value;
+ }
}
public Parameter this [int pos]