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); }
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"); } }
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; }
protected GenericFunctionWithSingleArgument(string name, GenericConstrains constrains, FunnyType returnType, params FunnyType[] argTypes) : base(name, constrains, returnType, argTypes) { }
protected PureGenericFunctionBase(string name, GenericConstrains constrains, int argsCount) : base(name, constrains, FunnyType.Generic(0), Enumerable.Repeat(FunnyType.Generic(0), argsCount).ToArray()) { }