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); }
/// <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(); } } }
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) }
//////////////////////////////////////////////////////////////////////////////////////// // 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); } } } } }
//////////////////////////////////////////////////////////////////////////////////////// // 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); } } } } }