Exemple #1
0
 public void VisitReturnStatement(JReturnStatement node)
 {
     Write("return ");
     if (node.Expression != null)
     {
         Visit(node.Expression);
     }
     WriteSemicolon();
     WriteLine();
 }
Exemple #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);
        }