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));
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 public virtual VisitorEnterResult Visit(SuperAnonymFunctionSyntaxNode node) => DefaultVisitEnter(node);
Beispiel #4
0
 public string Visit(SuperAnonymFunctionSyntaxNode node) => "{" + node.Body.Accept(this) + "}";
Beispiel #5
0
 public virtual bool Visit(SuperAnonymFunctionSyntaxNode node) => true;