public bool Apply(XElement typeXml, TypeElement type, IServiceCollection target) { if (type.Category != TypeCategory.funcpointer) { return(false); } string returnType = ((XText)typeXml.Nodes().First()).Value.Split(' ')[1]; if (returnType.EndsWith("*")) { returnType = returnType.TrimEnd('*'); type.IsTypePointer = true; } type.Type = returnType; type.NameParts = this.nameParser.ParseFunctionPointer(type.VkName, out type.ExtensionNamespace); var functionTail = typeXml.Element("name").NodesAfterSelf(); foreach (var typeElement in functionTail.Where(x => x.NodeType == XmlNodeType.Element).Cast <XElement>()) { string pre = ((XText)typeElement.PreviousNode).Value.Split(',').Last().Trim('(', ')', ';').TrimStart(); string post = ((XText)typeElement.NextNode).Value.Split(',').First().Trim('(', ')', ';').TrimEnd(); string paramName = new string(post.Reverse().TakeWhile(char.IsLetterOrDigit).Reverse().ToArray()); string typeString = pre + "@" + (post.Substring(0, post.Length - paramName.Length).Trim()); string paramType = typeElement.Value; PointerType pointerType = PointerTypeUtil.Map(typeString); var paramNameParts = this.nameParser.GetNameParts(paramName, out string paramExtension); type.Members.Add(new MemberElement { VkName = paramName, Type = paramType, PointerType = pointerType, NameParts = paramNameParts }); } return(true); }
public bool Apply(XElement typeXml, TypeElement type, IServiceCollection target) { if (type.Category == TypeCategory.include || type.Category == TypeCategory.None || type.Category == TypeCategory.define) { return(false); } type.NameParts = this.nameParser.GetNameParts(type.VkName, out type.ExtensionNamespace); foreach (var vkMember in typeXml.Elements("member")) { var nameElement = vkMember.Element("name"); string vkName = nameElement.Value; string memberType = vkMember.Element("type").Value; bool.TryParse(vkMember.Attribute("optional")?.Value, out bool isOptional); bool.TryParse(vkMember.Attribute("noautovalidity")?.Value, out bool noAutoValidity); PointerType pointerType = PointerTypeUtil.GetFrom(nameElement.NodesBeforeSelf()); var fixedLength = new FixedLengthDeclaration(); if (nameElement.NodesAfterSelf().Any()) { string enumName = vkMember.Element("enum")?.Value; if (enumName != null) { fixedLength.Value = enumName; fixedLength.Type = FixedLengthType.EnumReference; } else if (nameElement.NextNode.NodeType == System.Xml.XmlNodeType.Text) { fixedLength.Value = SimpleParser.ParseFixedLength(nameElement.NextNode.ToString()); fixedLength.Type = FixedLengthType.IntegerLiteral; } } else { int fixedLengthIndex = vkName.IndexOf('['); if (fixedLengthIndex >= 0) { string fixedLengthString = vkName.Substring(fixedLengthIndex); vkName = vkName.Substring(0, fixedLengthIndex); fixedLength.Value = SimpleParser.ParseFixedLength(fixedLengthString); fixedLength.Type = FixedLengthType.IntegerLiteral; } } var lenField = vkMember.Attribute("len"); var dimensions = lenField != null ? SimpleParser.ParsedLenField(lenField.Value) : null; string[] memberNameParts = this.nameParser.ParseParamName(vkName, pointerType, out string memberExtension); string values = vkMember.Attribute("values")?.Value; if (vkName == "sType" && values == null) { if (vkMember.NextNode != null) { // Split on spaces and skip "Must" & "be" //values = ((XComment)vkMember.NextNode).Value.Trim().Split(' ')[2]; System.Console.WriteLine(vkMember); } } var newMember = new MemberElement { VkName = vkName, Type = memberType, IsOptional = isOptional, NoAutoValidity = noAutoValidity, FixedLength = fixedLength, PointerType = pointerType, NameParts = memberNameParts, ExtensionNamespace = memberExtension, Dimensions = dimensions, Values = values }; type.Members.Add(newMember); } return(true); }