Exemplo n.º 1
0
        public static GenericUserFunction Create(
            TypeInferenceResults typeInferenceResults,
            UserFunctionDefinitionSyntaxNode syntaxNode,
            IFunctionDictionary dictionary)
        {
            var ticGenerics    = typeInferenceResults.Generics;
            var langConstrains = new GenericConstrains[ticGenerics.Length];

            for (int i = 0; i < ticGenerics.Length; i++)
            {
                var ticConstrains = ticGenerics[i];
                langConstrains[i] = GenericConstrains.FromTicConstrains(ticConstrains);
            }
            var ticFunName         = syntaxNode.Id + "'" + syntaxNode.Args.Count;
            var ticSignature       = (StateFun)typeInferenceResults.GetVariableType(ticFunName);
            var signatureConverter = TicTypesConverter.GenericSignatureConverter(ticGenerics);

            var argTypes = new FunnyType[ticSignature.ArgNodes.Length];

            for (var i = 0; i < ticSignature.ArgNodes.Length; i++)
            {
                argTypes[i] = signatureConverter.Convert(ticSignature.ArgNodes[i].State);
            }
            var retType = signatureConverter.Convert(ticSignature.ReturnType);

#if DEBUG
            TraceLog.WriteLine($"CREATE GENERIC FUN {syntaxNode.Id}({string.Join(",",argTypes)}):{retType}");
            TraceLog.WriteLine($"    ...where {string.Join(", ", langConstrains)}");
#endif
            var function = new GenericUserFunction(typeInferenceResults, syntaxNode, dictionary, langConstrains, retType, argTypes);
            return(function);
        }
Exemplo n.º 2
0
        protected GenericFunctionBase(string name, GenericConstrains constrains, FunnyType returnType,
                                      params FunnyType[] argTypes)
        {
            Name         = name;
            ArgTypes     = argTypes;
            ReturnType   = returnType;
            Constrainses = new [] { constrains };
            var maxGenericId = argTypes
                               .Append(returnType)
                               .Max(i => i.SearchMaxGenericTypeId());

            if (!maxGenericId.HasValue)
            {
                throw new InvalidOperationException($"Type {name} has wrong generic defenition");
            }
        }
Exemplo n.º 3
0
        protected GenericFunctionBase(string name, FunnyType returnType,
                                      params FunnyType[] argTypes)
        {
            Name       = name;
            ArgTypes   = argTypes;
            ReturnType = returnType;
            var maxGenericId = argTypes
                               .Append(returnType)
                               .Max(i => i.SearchMaxGenericTypeId());

            if (!maxGenericId.HasValue)
            {
                throw new InvalidOperationException($"Type {name} has wrong generic defenition");
            }

            Constrainses = new GenericConstrains[maxGenericId.Value + 1];

            for (int i = 0; i <= maxGenericId; i++)
            {
                Constrainses[i] = GenericConstrains.Any;
            }
            _maxGenericId = maxGenericId.Value;
        }
Exemplo n.º 4
0
 protected GenericFunctionWithSingleArgument(string name, GenericConstrains constrains,
                                             FunnyType returnType, params FunnyType[] argTypes) : base(name, constrains, returnType, argTypes)
 {
 }
Exemplo n.º 5
0
 protected PureGenericFunctionBase(string name, GenericConstrains constrains, int argsCount)
     : base(name, constrains, FunnyType.Generic(0), Enumerable.Repeat(FunnyType.Generic(0), argsCount).ToArray())
 {
 }