Esempio n. 1
0
        public JsNode VisitLambdaResolveResult(LambdaResolveResult res)
        {
            //var prmTypes = res.Parameters.Select(t => t.Type).ToArray();
            //var retType = res.GetInferredReturnType(prmTypes);
            //var conv = res.IsValid(prmTypes, retType, CSharpConversions.Get(Project.Compilation));
            //return Visit(conv);
            var func = new JsFunction {
                Parameters = res.Parameters.Select(t => JsIdentifier(t.Name)).ToList()
            };
            var    body = res.Body;
            JsNode body2;
            var    info = res.GetInfo();

            if (body.GetType() == typeof(ResolveResult) && body.Type.IsVoid())
            {
                var x       = res.GetType().GetProperty("BodyExpression", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(res, null);
                var astNode = (AstNode)x;
                body2 = Visit(astNode);
            }
            else
            {
                body2 = Visit(res.Body);
            }
            var currentMember = res.GetCurrentMember();
            var delType       = info.ConversionTargetType;

            if (body2 is JsExpression)
            {
                var         delMethod = delType.GetDelegateInvokeMethod();
                JsStatement st        = new JsReturnStatement {
                    Expression = (JsExpression)body2
                };
                if (delMethod != null && delMethod.ReturnType.IsVoid())
                {
                    st = new JsExpressionStatement {
                        Expression = (JsExpression)body2
                    }
                }
                ;

                func.Block = new JsBlock {
                    Statements = new List <JsStatement> {
                        st
                    }
                };
            }
            else if (body2 is JsBlock)
            {
                func.Block = (JsBlock)body2;
            }
            if (delType == null || currentMember == null)
            {
                Log.Warn(res.GetFirstNode(), "Cannot resolve delegate type / parent method");
                return(func);
            }
            else
            {
                return(CreateJsDelegateIfNeeded(func, currentMember, delType, true));
            }
        }
Esempio n. 2
0
        public JNode VisitLambdaResolveResult(LambdaResolveResult res)
        {
            //var prmTypes = res.Parameters.Select(t => t.Type).ToArray();
            //var retType = res.GetInferredReturnType(prmTypes);
            //var conv = res.IsValid(prmTypes, retType, CSharpConversions.Get(Compiler.Project.Compilation));
            //return Visit(conv);
            var func = new JFunction {
                Parameters = res.Parameters.Select(t => JsIdentifier(t.Name)).ToList()
            };
            var   body = res.Body;
            JNode body2;
            var   info = res.GetInfo();

            if (body.GetType() == typeof(ResolveResult) && body.Type.IsVoid())
            {
                var x       = res.GetType().GetProperty("BodyExpression", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(res, null);
                var astNode = (AstNode)x;
                body2 = Visit(astNode);
            }
            else
            {
                body2 = Visit(res.Body);
            }


            var currentMember = res.GetCurrentMember();
            var delType       = info.ConversionTargetType;
            var delMethod     = delType.GetDelegateInvokeMethod();
            var returnType    = delMethod.ReturnType;

            if (returnType.IsVoid())
            {
                returnType = null;
            }
            if (body2 is JExpression)
            {
                JStatement st = new JReturnStatement {
                    Expression = (JExpression)body2
                };
                if (delMethod != null && delMethod.ReturnType.IsVoid())
                {
                    st = new JExpressionStatement {
                        Expression = (JExpression)body2
                    }
                }
                ;

                func.Block = new JBlock {
                    Statements = new List <JStatement> {
                        st
                    }
                };
            }
            else if (body2 is JBlock)
            {
                func.Block = (JBlock)body2;
            }
            else
            {
                throw new Exception();
            }
            var del2 = CreateDelegate(delType, res.Parameters, returnType, func.Block);

            return(del2);
        }

        JNewAnonymousClassExpression CreateDelegate(IType delType, IList <IParameter> prms, IType returnType, JBlock block)
        {
            var del2 = J.CreateDelegate(delType.JAccess(), prms.Select(t => new JParameterDeclaration {
                Name = t.Name, Type = t.Type.JAccessNonPrimitive()
            }).ToArray(), returnType.JAccessNonPrimitive(), block);

            return(del2);
        }