Exemple #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);
        }
Exemple #2
0
        public static void CreateSomeConcrete(GenericUserFunction function)
        {
            var varType = new FunnyType[function._constrainsMap.Length];

            for (var i = 0; i < function._constrainsMap.Length; i++)
            {
                var anc      = function._constrainsMap[i].Ancestor ?? StatePrimitive.Any;
                var concrete = TicTypesConverter.ToConcrete(anc.Name);
                varType[i] = concrete;
            }

            function.CreateConcrete(varType);
        }