private void ReadEnum(XElement @enum) { var name = @enum.Attribute("name")?.Value; Debug.Assert(name != null); var enumType = @enum.Attribute("type")?.Value; var comment = @enum.Attribute("comment")?.Value; var fields = new List <VkConstant>(); foreach (var child in @enum.Elements("enum")) { var cname = child.Attribute("name")?.Value; Debug.Assert(cname != name); var ccomment = child.Attribute("comment")?.Value; var bitpos = child.Attribute("bitpos")?.Value; var value = child.Attribute("value")?.Value; Debug.Assert(value != null || bitpos != null); var result = bitpos != null ? VkConstant.AsBitPosition(cname, ccomment, bitpos) : VkConstant.AsValue(cname, ccomment, value); fields.Add(result); _spec.Add(result); } if (enumType == null) { return; // not an enum, just constants. } var isBitmask = enumType == "bitmask"; if (!isBitmask) { Debug.Assert(enumType == "enum"); } _spec.Add(new VkEnum(name, isBitmask, comment, fields.ToArray())); }
private void ReadExtension(XElement e) { string name = e.Attribute("name")?.Value; Debug.Assert(name != null); string numberStr = e.Attribute("number")?.Value; Debug.Assert(int.TryParse(numberStr, out int number)); var requiresExtensions = e.Attribute("requires")?.Value?.Split(','); var extension = new VkExtension(name, e.Attribute("type")?.Value, e.Attribute("comment")?.Value, number, requiresExtensions ?? new string[0]); foreach (var req in e.Elements("require")) { foreach (var en in req.Elements("enum")) { var cname = en.Attribute("name")?.Value; Debug.Assert(cname != null); var extends = en.Attribute("extends")?.Value; var offset = en.Attribute("offset")?.Value; var dir = en.Attribute("dir")?.Value ?? "+"; var value = en.Attribute("value")?.Value; var bitpos = en.Attribute("bitpos")?.Value; var comment = en.Attribute("comment")?.Value; var valueWasString = false; VkConstant cstType; if (bitpos == null && value == null) { if (offset != null) { Debug.Assert(dir == "+" || dir == "-"); value = (ExtBase + (ExtBlockSize * (number - 1)) + int.Parse(offset)).ToString(); if (dir == "-") { value = "-(" + value + ")"; } } else { cstType = _spec.Constants[cname]; extension.ProvidedConstants.Add(cstType); continue; } } if (value != null && value.StartsWith("\"") && value.EndsWith("\"")) { value = value.Substring(1, value.Length - 2); valueWasString = true; } if (bitpos != null) { cstType = VkConstant.AsBitPosition(cname, comment, bitpos); } else { Debug.Assert(value != null); cstType = VkConstant.AsValue(cname, comment, value); } if (extends != null) { var enumType = (VkEnum)_spec.TypeDefs[extends]; ((IList <VkConstant>)enumType.Values).Add(cstType); } else if (cstType.Name.EndsWith("_EXTENSION_NAME", StringComparison.OrdinalIgnoreCase)) { extension.Name = value; continue; } else if (cstType.Name.EndsWith("_SPEC_VERSION", StringComparison.OrdinalIgnoreCase)) { extension.Version = long.Parse(value); continue; } if (!valueWasString) { _spec.Add(cstType); extension.ProvidedConstants.Add(cstType); } } foreach (var en in req.Elements("type")) { extension.ProvidedTypes.Add(_spec.TypeDefs[en.Attribute("name")?.Value]); } foreach (var en in req.Elements("command")) { extension.ProvidedTypes.Add((VkCommand)_spec.TypeDefs[en.Attribute("name")?.Value]); } } _spec.Add(extension); }