private void PrecacheParameterBindings()
{
var objs = new List<object>();
var ptrGroups = 1;
foreach (var param in definition.Parameters)
{
if (param is ProceedParameter)
{
objs.Add(proceedHolder);
}
else
{
if(ptrGroups>=match.Groups.Count)
{
throw new CannotLinkStatementException(
definition.MethodInfo,
string.Format("Statement {1} has more parameters than captures available to it."
+ "{0} are available.",
match.Groups.Count -1, definition.Name));
}
var obj = match
.Groups[ptrGroups++]
.Captures
.If(x => x.Count > 0)
.With(x => x[0].Value);
objs.Add(Cast(obj, param));
}
}
if(objs.Count != definition.Parameters.Count)
{
throw new CannotLinkStatementException(
definition.MethodInfo,
string.Format("Statement {2} wants {0} parameters from statement,"
+ " but only {1} could be matched.",
definition.Parameters.Count, objs.Count, definition.Name));
}
if(ptrGroups < match.Groups.Count)
{
throw new CannotLinkStatementException(
definition.MethodInfo,
string.Format("Statement {2} did not use all captures available to it."
+ "It used {0} but {1} are available.",
ptrGroups-1, match.Groups.Count -1, definition.Name));
}
MappedParameters = objs.ToArray();
}