Exemplo n.º 1
0
        public bool Visit(ArrowAnonymFunctionSyntaxNode node)
        {
            _aliasScope.EnterScope(node.OrderNumber);
            foreach (var syntaxNode in node.ArgumentsDefinition)
            {
                //setup arguments.
                string originName;
                string anonymName;
                if (syntaxNode is TypedVarDefSyntaxNode typed)
                {
                    //argument has type definition on it
                    originName = typed.Id;
                    anonymName = MakeAnonVariableName(node, originName);
                    if (!typed.FunnyType.Equals(FunnyType.Empty))
                    {
                        var ticType = typed.FunnyType.ConvertToTiType();
                        _ticTypeGraph.SetVarType(anonymName, ticType);
                    }
                }
                else if (syntaxNode is NamedIdSyntaxNode varNode)
                {
                    //argument has no type definition on it
                    originName = varNode.Id;
                    anonymName = MakeAnonVariableName(node, originName);
                }
                else
                {
                    throw ErrorFactory.AnonymousFunArgumentIsIncorrect(syntaxNode);
                }

                _aliasScope.AddVariableAlias(originName, anonymName);
            }

            VisitChildren(node);

            var aliasNames = new string[node.ArgumentsDefinition.Length];

            for (var i = 0; i < node.ArgumentsDefinition.Length; i++)
            {
                var syntaxNode = node.ArgumentsDefinition[i];
                if (syntaxNode is TypedVarDefSyntaxNode typed)
                {
                    aliasNames[i] = _aliasScope.GetVariableAlias(typed.Id);
                }
                else if (syntaxNode is NamedIdSyntaxNode varNode)
                {
                    aliasNames[i] = _aliasScope.GetVariableAlias(varNode.Id);
                }
            }

#if DEBUG
            Trace(node, $"f({string.Join(" ", aliasNames)}):{node.OutputType}= {{{node.OrderNumber}}}");
#endif
            if (node.ReturnType == FunnyType.Empty)
            {
                _ticTypeGraph.CreateLambda(node.Body.OrderNumber, node.OrderNumber, aliasNames);
            }
            else
            {
                var retType = (ITypeState)node.ReturnType.ConvertToTiType();
                _ticTypeGraph.CreateLambda(
                    node.Body.OrderNumber,
                    node.OrderNumber,
                    retType,
                    aliasNames);
            }

            _aliasScope.ExitScope();
            return(true);
        }