/// <inheritdoc/>
        public IEnumerable <(FunctionSignature, StringBuilder)> CreateOverloads(FunctionSignature function)
        {
            if (!function.Parameters.Any(p => p.Type.IsVoidPointer()))
            {
                yield break;
            }

            var baseParameters = function.Parameters;

            var newIntPtrParameters         = new List <ParameterSignature>(baseParameters);
            var newGenericArray1DParameters = new List <ParameterSignature>(baseParameters);
            var newGenericArray2DParameters = new List <ParameterSignature>(baseParameters);
            var newGenericArray3DParameters = new List <ParameterSignature>(baseParameters);

            var newGenericTypeParameters = new List <GenericTypeParameterSignature>();

            for (var i = 0; i < baseParameters.Count; ++i)
            {
                var parameter = baseParameters[i];
                if (!parameter.Type.IsVoidPointer())
                {
                    continue;
                }

                var genericTypeParameterName = baseParameters.Count(p => p.Type.IsVoidPointer()) > 1
                    ? $"T{newGenericTypeParameters.Count + 1}" : "T";

                var genericTypeParameter = new GenericTypeParameterSignature(
                    genericTypeParameterName,
                    new[] { "unmanaged" });

                newGenericTypeParameters.Add(genericTypeParameter);

                var newIntPtrParameterType = new TypeSignatureBuilder(parameter.Type)
                                             .WithIndirectionLevel(0)
                                             .WithName(nameof(IntPtr))
                                             .Build();

                // TODO: Simplify and generalize this
                var newGenericArray1DParameterType = new TypeSignatureBuilder(parameter.Type)
                                                     .WithIndirectionLevel(0)
                                                     .WithArrayDimensions(1)
                                                     .WithName(genericTypeParameterName)
                                                     .Build();

                var newGenericArray2DParameterType = new TypeSignatureBuilder(parameter.Type)
                                                     .WithIndirectionLevel(0)
                                                     .WithArrayDimensions(2)
                                                     .WithName(genericTypeParameterName)
                                                     .Build();

                var newGenericArray3DParameterType = new TypeSignatureBuilder(parameter.Type)
                                                     .WithIndirectionLevel(0)
                                                     .WithArrayDimensions(3)
                                                     .WithName(genericTypeParameterName)
                                                     .Build();

                newIntPtrParameters[i] = new ParameterSignatureBuilder(parameter)
                                         .WithType(newIntPtrParameterType)
                                         .Build();

                newGenericArray1DParameters[i] = new ParameterSignatureBuilder(parameter)
                                                 .WithType(newGenericArray1DParameterType)
                                                 .Build();

                newGenericArray2DParameters[i] = new ParameterSignatureBuilder(parameter)
                                                 .WithType(newGenericArray2DParameterType)
                                                 .Build();

                newGenericArray3DParameters[i] = new ParameterSignatureBuilder(parameter)
                                                 .WithType(newGenericArray3DParameterType)
                                                 .Build();
            }

            yield return(ToPointer
                         (
                             new FunctionSignatureBuilder(function)
                             .WithParameters(newIntPtrParameters)
                             .Build(),
                             function
                         ));

            yield return(Fixed
                         (
                             new FunctionSignatureBuilder(function)
                             .WithParameters(newGenericArray1DParameters)
                             .WithGenericTypeParameters(newGenericTypeParameters)
                             .Build()
                         ));

            yield return(Fixed
                         (
                             new FunctionSignatureBuilder(function)
                             .WithParameters(newGenericArray2DParameters)
                             .WithGenericTypeParameters(newGenericTypeParameters)
                             .Build()
                         ));

            yield return(Fixed
                         (
                             new FunctionSignatureBuilder(function)
                             .WithParameters(newGenericArray3DParameters)
                             .WithGenericTypeParameters(newGenericTypeParameters)
                             .Build()
                         ));
        }
Ejemplo n.º 2
0
        /// <inheritdoc/>
        public IEnumerable <FunctionSignature> CreateOverloads(FunctionSignature function)
        {
            var baseParameters = function.Parameters;

            var newIntPtrParameters         = new List <ParameterSignature>(baseParameters);
            var newGenericArray1DParameters = new List <ParameterSignature>(baseParameters);
            var newGenericArray2DParameters = new List <ParameterSignature>(baseParameters);
            var newGenericArray3DParameters = new List <ParameterSignature>(baseParameters);
            var newGenericRefParameters     = new List <ParameterSignature>(baseParameters);

            var newGenericTypeParameters = new List <GenericTypeParameterSignature>();

            for (int i = 0; i < baseParameters.Count; ++i)
            {
                var parameter = baseParameters[i];
                if (!parameter.Type.IsVoidPointer())
                {
                    continue;
                }

                string genericTypeParameterName;
                if (baseParameters.Count(p => p.Type.IsVoidPointer()) > 1)
                {
                    genericTypeParameterName = $"T{newGenericTypeParameters.Count + 1}";
                }
                else
                {
                    genericTypeParameterName = "T";
                }

                var genericTypeParameter = new GenericTypeParameterSignature(genericTypeParameterName);

                newGenericTypeParameters.Add(genericTypeParameter);

                var newIntPtrParameterType = new TypeSignatureBuilder(parameter.Type)
                                             .WithIndirectionLevel(0)
                                             .WithName(nameof(IntPtr))
                                             .Build();

                // TODO: Simplify and generalize this
                var newGenericArray1DParameterType = new TypeSignatureBuilder(parameter.Type)
                                                     .WithIndirectionLevel(0)
                                                     .WithArrayDimensions(1)
                                                     .WithName(genericTypeParameterName)
                                                     .Build();

                var newGenericArray2DParameterType = new TypeSignatureBuilder(parameter.Type)
                                                     .WithIndirectionLevel(0)
                                                     .WithArrayDimensions(2)
                                                     .WithName(genericTypeParameterName)
                                                     .Build();

                var newGenericArray3DParameterType = new TypeSignatureBuilder(parameter.Type)
                                                     .WithIndirectionLevel(0)
                                                     .WithArrayDimensions(3)
                                                     .WithName(genericTypeParameterName)
                                                     .Build();

                var newGenericRefParameterType = new TypeSignatureBuilder(parameter.Type)
                                                 .WithIndirectionLevel(0)
                                                 .WithName(genericTypeParameterName)
                                                 .WithByRef(true)
                                                 .Build();

                newIntPtrParameters[i] = new ParameterSignatureBuilder(parameter)
                                         .WithType(newIntPtrParameterType)
                                         .Build();

                newGenericArray1DParameters[i] = new ParameterSignatureBuilder(parameter)
                                                 .WithType(newGenericArray1DParameterType)
                                                 .Build();

                newGenericArray2DParameters[i] = new ParameterSignatureBuilder(parameter)
                                                 .WithType(newGenericArray2DParameterType)
                                                 .Build();

                newGenericArray3DParameters[i] = new ParameterSignatureBuilder(parameter)
                                                 .WithType(newGenericArray3DParameterType)
                                                 .Build();

                newGenericRefParameters[i] = new ParameterSignatureBuilder(parameter)
                                             .WithType(newGenericRefParameterType)
                                             .Build();
            }

            yield return(new FunctionSignatureBuilder(function)
                         .WithParameters(newIntPtrParameters)
                         .Build());

            yield return(new FunctionSignatureBuilder(function)
                         .WithParameters(newGenericArray1DParameters)
                         .WithGenericTypeParameters(newGenericTypeParameters)
                         .Build());

            yield return(new FunctionSignatureBuilder(function)
                         .WithParameters(newGenericArray2DParameters)
                         .WithGenericTypeParameters(newGenericTypeParameters)
                         .Build());

            yield return(new FunctionSignatureBuilder(function)
                         .WithParameters(newGenericArray3DParameters)
                         .WithGenericTypeParameters(newGenericTypeParameters)
                         .Build());

            yield return(new FunctionSignatureBuilder(function)
                         .WithParameters(newGenericRefParameters)
                         .WithGenericTypeParameters(newGenericTypeParameters)
                         .Build());
        }