private void ResolveSignatureTypesInFunction(FunctionDeclarationSyntax function)
        {
            function.Type.BeginFulfilling();
            var diagnosticCount = diagnostics.Count;

            // Resolve the declaring type because we need its type for things like `self`
            if (function.DeclaringType != null)
                ResolveSignatureTypesInTypeDeclaration(function.DeclaringType);

            var selfType = ResolveSelfType(function);
            var resolver = new ExpressionTypeResolver(function.File, diagnostics, selfType);

            if (function.GenericParameters != null)
                ResolveTypesInGenericParameters(function.GenericParameters, resolver);

            var parameterTypes = ResolveTypesInParameters(function, resolver);

            var returnType = ResolveReturnType(function, resolver);
            DataType functionType = new FunctionType(parameterTypes, returnType);

            if (function.GenericParameters?.Any() ?? false)
                functionType = new MetaFunctionType(function.GenericParameters.Select(p => p.Type.Fulfilled()), functionType);

            function.Type.Fulfill(functionType);
            if (diagnosticCount != diagnostics.Count) function.Poison();
        }
Esempio n. 2
0
     /// <summary>
 	/// Implements the constructor: MetaFunctionType()
 	/// Direct superclasses: global::MetaDslx.Core.MetaType
 	/// All superclasses: global::MetaDslx.Core.MetaType
     /// </summary>
     public virtual void MetaFunctionType(MetaFunctionType @this)
     {
         this.MetaType(@this);
     }