static IReadOnlyCollection <VariableName> EnumerateCapturedVariables(ArrowFunctionExpr fn) { var capturedvars = new HashSet <VariableName>(); // collect all variables in fn foreach (var v in fn.Expression.SelectLocalVariables()) { capturedvars.Add(v.VarName); } // remove vars specified in parameters foreach (var p in fn.Signature.FormalParams) { capturedvars.Remove(p.Name.Name); } //// intersect with variables from parent function scope //var containingvars = new HashSet<VariableName>(); //foreach (var v in fn.GetContainingRoutine().SelectLocalVariables()) //{ // containingvars.Add(v.VarName); //} //capturedvars.IntersectWith(containingvars); // return(capturedvars); }
public SourceArrowFnSymbol(ArrowFunctionExpr syntax, NamedTypeSymbol container) : base(syntax, container) { _body = ImmutableArray.Create <Statement>(new JumpStmt(syntax.Expression.Span, JumpStmt.Types.Return, syntax.Expression)); _useparams = EnumerateCapturedVariables(syntax) .Select(v => new FormalParam(Span.Invalid, v.Value, Span.Invalid, null, FormalParam.Flags.Default, null)) .ToArray(); }