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)); } }
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); }