Boo.Lang.Compiler.Steps.ProcessMethodBodies.ProcessClosureInMethodInvocation C# (CSharp) Метод

ProcessClosureInMethodInvocation() приватный Метод

private ProcessClosureInMethodInvocation ( GenericParameterInferrer inferrer, BlockExpression closure, ICallableType formalType ) : void
inferrer GenericParameterInferrer
closure BlockExpression
formalType ICallableType
Результат void
        private void ProcessClosureInMethodInvocation(GenericParameterInferrer inferrer, BlockExpression closure, ICallableType formalType)
        {
            var sig = formalType.GetSignature();

            var replacer = new TypeReplacer();
            var collector = new TypeCollector(delegate(IType t)
            {
                IGenericParameter gp = t as IGenericParameter;
                if (gp == null) return false;
                return gp.DeclaringEntity == inferrer.GenericMethod;
            });

            collector.Visit(formalType);
            foreach (var typeParameter in collector.Matches)
            {
                var inferredType = inferrer.GetInferredType((IGenericParameter)typeParameter);
                if (inferredType != null)
                    replacer.Replace(typeParameter, inferredType);
            }

            for (var i = 0; i < sig.Parameters.Length; i++)
            {
                var pd = closure.Parameters[i];
                if (pd.Type != null) continue;
                pd.Type = CodeBuilder.CreateTypeReference(replacer.MapType(sig.Parameters[i].Type));
            }

            ProcessClosureBody(closure);
        }
ProcessMethodBodies