Пример #1
0
        private Dictionary <string, Function> ConvertFunctions(VulkanSpecification spec, ProfileConverterOptions opts)
        {
            var ret = new Dictionary <string, Function>();

            foreach (var function in spec.Commands)
            {
                ret.Add
                (
                    function.Name, new Function
                {
                    Name       = Naming.Translate(NameTrimmer.Trim(TrimName(function.Name, opts), opts.Prefix), opts.Prefix),
                    Parameters = function.Parameters.Select
                                 (
                        x => new Parameter
                    {
                        Count = x.IsNullTerminated ? null :
                                x.ElementCountSymbolic != null ? new Count(x.ElementCountSymbolic.Split(',')) :
                                new Count(x.ElementCount),
                        Flow = ConvertFlow(x.Modifier), Name = x.Name, Type = ConvertType(x.Type)
                    }
                                 )
                                 .ToList(),
                    NativeName = function.Name,
                    ReturnType = ConvertType(function.ReturnType)
                }
                );
            }

            return(ret);
        }
Пример #2
0
        /// <summary>
        /// Writes documentation to all functions in an interface at once.
        /// </summary>
        /// <param name="interface">The interface to write to.</param>
        /// <param name="doc">The documentation to write.</param>
        /// <param name="prefix">The function name's prefix.</param>
        public static void Write(Interface @interface, ProfileDocumentation doc, string prefix)
        {
            foreach (var function in @interface.Functions)
            {
                if (NameTrimmer.GetNameVariations(function.NativeName, prefix).Any(doc.Functions.ContainsKey))
                {
                    doc.Functions
                    [
                        NameTrimmer.GetNameVariations(function.NativeName, prefix).First(doc.Functions.ContainsKey)
                    ]
                    .Write(function);
                }
                else
                {
                    var sb = new StringBuilder();
                    sb.AppendLine("/// <summary>");
                    sb.AppendLine("/// To be added.");
                    sb.AppendLine("/// </summary>");
                    foreach (var parameter in function.Parameters)
                    {
                        sb.AppendLine($"/// <param name=\"{parameter.Name}\">");
                        sb.AppendLine("/// To be added.");
                        if (!(parameter.Count is null))
                        {
                            if (parameter.Count.IsStatic)
                            {
                                sb.AppendLine($"/// This parameter contains {parameter.Count.StaticCount} elements.");
                            }

                            if (parameter.Count.IsComputed)
                            {
                                var parameterList = parameter.Count.ComputedFromNames.Humanize();
                                sb.AppendLine($"/// This parameter's element count is computed from {parameterList}.");
                            }

                            if (parameter.Count.IsReference)
                            {
                                // ReSharper disable once PossibleNullReferenceException
                                sb.AppendLine
                                (
                                    $"/// This parameter's element count is taken from {parameter.Count.ValueReference}."
                                );
                            }
                        }

                        sb.AppendLine("/// </param>");
                    }

                    if (function.ReturnType.ToString() != "void")
                    {
                        sb.AppendLine("/// <returns>See summary.</returns>");
                    }

                    function.Doc = sb.ToString();
                }
            }
        }
Пример #3
0
        private Dictionary <string, Function> ConvertFunctions(VulkanSpecification spec, BindTask task)
        {
            var ret = new Dictionary <string, Function>();

            foreach (var function in spec.Commands)
            {
                ret.Add
                (
                    function.Name, new Function
                {
                    Name       = Naming.Translate(NameTrimmer.Trim(TrimName(function.Name, task), task.FunctionPrefix), task.FunctionPrefix),
                    Parameters = function.Parameters.Select
                                 (
                        x => new Parameter
                    {
                        Count = x.IsNullTerminated ? null :
                                x.ElementCountSymbolic != null ?
                                function.Parameters.Any(y => y.Name == x.ElementCountSymbolic)
                                            ? new(x.ElementCountSymbolic)
                                            : new(x.ElementCountSymbolic.Split(',')) :
                                new(x.ElementCount),
                        Flow = ConvertFlow(x.Modifier), Name = x.Name, Type = ConvertType(x.Type)
                    }
Пример #4
0
        ////////////////////////////////////////////////////////////////////////////////////////
        // Function Parsing
        ////////////////////////////////////////////////////////////////////////////////////////

        /// <inheritdoc />
        public IEnumerable <Function> ReadFunctions(object obj, BindTask task)
        {
            var doc = obj as XDocument;

            Debug.Assert(doc != null, nameof(doc) + " != null");

            var registry = doc.Element("registry");

            Debug.Assert(registry != null, $"{nameof(registry)} != null");

            var allFunctions = registry
                               .Elements("commands")
                               .Elements("command")
                               .Select(x => TranslateCommand(x, task))
                               .ToDictionary(x => x.Attribute("name")?.Value, x => x);

            Debug.Assert(allFunctions != null, nameof(allFunctions) + " != null");

            var apis = registry.Elements("feature")
                       .Concat(registry
                               .Elements("extensions")
                               .Elements("extension") ?? throw new InvalidDataException());

            Debug.Assert(apis != null, nameof(apis) + " != null");

            var removals = registry.Elements("feature")
                           .Elements("remove")
                           .Elements("command")
                           .Attributes("name")
                           .Select(x => x.Value)
                           .ToList();

            Debug.Assert(removals != null, nameof(removals) + " != null");

            foreach (var api in apis)
            {
                foreach (var requirement in api.Elements("require"))
                {
                    var apiName = requirement.Attribute("api")?.Value ??
                                  api.Attribute("api")?.Value ??
                                  api.Attribute("supported")?.Value ??
                                  "opencl";
                    var apiVersion = api.Attribute("number") != null
                        ? Version.Parse(api.Attribute("number")?.Value ?? throw new InvalidDataException())
                        : null;

                    foreach (var name in apiName.Split('|'))
                    {
                        foreach (var function in requirement.Elements("command")
                                 .Attributes("name")
                                 .Select(x => x.Value))
                        {
                            var xf = allFunctions[TrimName(function, task)];

                            var ret = new Function
                            {
                                Attributes = removals.Contains(function)
                                    ? new List <Attribute>
                                {
                                    new Attribute
                                    {
                                        Name      = "System.Obsolete",
                                        Arguments = new List <string>
                                        {
                                            $"\"Deprecated in version {apiVersion?.ToString(2)}\""
                                        }
                                    }
                                }
                                    : new List <Attribute>(),
                                Categories = new List <string> {
                                    ExtensionName(api.Attribute("name")?.Value, task)
                                },
                                Doc                   = string.Empty,
                                ExtensionName         = api.Name == "feature" ? "Core" : ExtensionName(api.Attribute("name")?.Value, task),
                                GenericTypeParameters = new List <GenericTypeParameter>(),
                                Name                  = Naming.Translate(NameTrimmer.Trim(TrimName(xf.Attribute("name")?.Value, task), task.FunctionPrefix), task.FunctionPrefix),
                                NativeName            = function,
                                Parameters            = ParseParameters(xf),
                                ProfileName           = name,
                                ProfileVersion        = apiVersion,
                                ReturnType            = ParseTypeSignature(xf.Element("returns") ?? throw new InvalidDataException())
                            };

                            yield return(ret);

                            allFunctions.Remove(function);
                        }
                    }
                }
            }
        }
Пример #5
0
        ////////////////////////////////////////////////////////////////////////////////////////
        // Function Parsing
        ////////////////////////////////////////////////////////////////////////////////////////

        public IEnumerable <Function> ReadFunctions(object obj, ProfileConverterOptions opts)
        {
            var doc          = obj as XDocument;
            var allFunctions = doc.Element("registry").Elements("commands")
                               .Elements("command")
                               .Select(x => TranslateCommand(x, opts))
                               .ToDictionary(x => x.Attribute("name")?.Value, x => x);
            var apis     = doc.Element("registry").Elements("feature").Concat(doc.Element("registry").Elements("extensions").Elements("extension"));
            var removals = doc.Element("registry").Elements("feature")
                           .Elements("remove")
                           .Elements("command")
                           .Attributes("name")
                           .Select(x => x.Value)
                           .ToList();

            foreach (var api in apis)
            {
                foreach (var requirement in api.Elements("require"))
                {
                    var apiName = requirement.Attribute("api")?.Value ??
                                  api.Attribute("api")?.Value ??
                                  api.Attribute("supported")?.Value ??
                                  "gl";
                    var apiVersion = api.Attribute("number") != null
                        ? Version.Parse(api.Attribute("number").Value)
                        : null;

                    foreach (var name in apiName.Split('|'))
                    {
                        foreach (var function in requirement.Elements("command")
                                 .Attributes("name")
                                 .Select(x => x.Value))
                        {
                            var xf = allFunctions[TrimName(function, opts)];

                            var ret = new Function
                            {
                                Attributes = removals.Contains(function)
                                    ? new List <Attribute>
                                {
                                    new Attribute
                                    {
                                        Name      = "System.Obsolete",
                                        Arguments = new List <string>
                                        {
                                            $"\"Deprecated in version {apiVersion?.ToString(2)}\""
                                        }
                                    }
                                }
                                    : new List <Attribute>(),
                                Categories = new List <string> {
                                    TrimName(api.Attribute("name")?.Value, opts)
                                },
                                Doc                   = string.Empty,
                                ExtensionName         = api.Name == "feature" ? "Core" : TrimName(api.Attribute("name")?.Value, opts),
                                GenericTypeParameters = new List <GenericTypeParameter>(),
                                Name                  = Naming.Translate(NameTrimmer.Trim(TrimName(xf.Attribute("name")?.Value, opts), opts.Prefix), opts.Prefix),
                                NativeName            = function,
                                Parameters            = ParseParameters(xf),
                                ProfileName           = name,
                                ProfileVersion        = apiVersion,
                                ReturnType            = ParseTypeSignature(xf.Element("returns"))
                            };

                            yield return(ret);

                            if (api.Name == "feature" && name == "gl" && ret.Attributes.Count == 0)
                            {
                                yield return(new Function
                                {
                                    Attributes = new List <Attribute>(),
                                    Categories = ret.Categories,
                                    Doc = ret.Doc,
                                    ExtensionName = ret.ExtensionName,
                                    GenericTypeParameters = new List <GenericTypeParameter>(),
                                    Name = ret.Name,
                                    NativeName = ret.NativeName,
                                    Parameters = ret.Parameters,
                                    ProfileName = "glcore",
                                    ProfileVersion = apiVersion,
                                    ReturnType = ret.ReturnType
                                });
                            }

                            allFunctions.Remove(function);
                        }
                    }
                }
            }
        }