public IExpressionNode Visit(SuperAnonymFunctionSyntaxNode arrowAnonymFunNode) { var outputTypeFunDefinition = arrowAnonymFunNode.OutputType.FunTypeSpecification; if (outputTypeFunDefinition == null) { throw new ImpossibleException("Fun definition expected"); } string[] argNames = null; if (outputTypeFunDefinition.Inputs.Length == 1) { argNames = new[] { "it" } } ; else { argNames = new string[outputTypeFunDefinition.Inputs.Length]; for (int i = 0; i < outputTypeFunDefinition.Inputs.Length; i++) { argNames[i] = $"it{i + 1}"; } } //Prepare local variable scope //Capture all outerscope variables var localVariables = new VariableDictionary(_variables.GetAllSources()); var arguments = new VariableSource[argNames.Length]; for (var i = 0; i < argNames.Length; i++) { var arg = argNames[i]; var type = outputTypeFunDefinition.Inputs[i]; var source = VariableSource.CreateWithoutStrictTypeLabel(arg, type, false); //collect argument arguments[i] = source; //add argument to local scope //if argument with it* name already exist - replace it localVariables.AddOrReplace(source); } var body = arrowAnonymFunNode.Body; return(BuildAnonymousFunction(arrowAnonymFunNode.Interval, body, localVariables, arguments)); }
public bool Visit(SuperAnonymFunctionSyntaxNode node) { _aliasScope.EnterScope(node.OrderNumber); var argType = _parentFunctionArgType.FunTypeSpecification; string[] originArgNames = null; string[] aliasArgNames = null; if (argType == null || argType.Inputs.Length == 1) { originArgNames = new[] { "it" } } ; else { originArgNames = new string[argType.Inputs.Length]; for (int i = 0; i < argType.Inputs.Length; i++) { originArgNames[i] = $"it{i + 1}"; } } aliasArgNames = new string[originArgNames.Length]; for (var i = 0; i < originArgNames.Length; i++) { var originName = originArgNames[i]; var aliasName = MakeAnonVariableName(node, originName); _aliasScope.AddVariableAlias(originName, aliasName); aliasArgNames[i] = aliasName; } VisitChildren(node); #if DEBUG Trace(node, $"f({string.Join(" ", originArgNames)}):{node.OutputType}= {{{node.OrderNumber}}}"); #endif _ticTypeGraph.CreateLambda(node.Body.OrderNumber, node.OrderNumber, aliasArgNames); _aliasScope.ExitScope(); return(true); }
public virtual VisitorEnterResult Visit(SuperAnonymFunctionSyntaxNode node) => DefaultVisitEnter(node);
public string Visit(SuperAnonymFunctionSyntaxNode node) => "{" + node.Body.Accept(this) + "}";
public virtual bool Visit(SuperAnonymFunctionSyntaxNode node) => true;