internal ReturnType FindReturnType(string name, string apiGroupName = null, string subPart = null, string typeName = null) { // find return type or null ReturnType returnItem = null; // handle different namespaces int dotPosition = name.LastIndexOf('.'); if (dotPosition > 0) { var ns = name.Substring(0, dotPosition); int dotPosition2 = ns.LastIndexOf('.'); if (dotPosition2 > 0) { ns = ns.Substring(0, dotPosition2); } if (apiGroupName != null) { apiGroupName = ns; } name = name.Substring(dotPosition + 1); } foreach (var group in this.Root.ApiGroups.Where(g => apiGroupName == null || g.Name == apiGroupName)) { if (returnItem != null) { break; } foreach (var item in group.ReturnTypes) { if (returnItem != null) { break; } if (item.Name == name || item.ClassName == name) { returnItem = item; } } } // create return type in specified API group if (apiGroupName != null && returnItem == null) { var item = new ReturnType { Name = name, ClassName = typeName ?? CSharpGenerator.Namify(name, NameTransformation.CamelCase), Fields = new List <Field>(), }; var group = this.Root.ApiGroups.Single(g => g.Name == apiGroupName); group.ReturnTypes.Add(item); returnItem = item; } if (returnItem != null) { if (subPart != null && subPart.First() == '(' && subPart.Last() == ')') { // subPart = "main:(sub)" // subPart = "main:(sub:(woot))" Field newField = null; { var parts = subPart.Substring(1, subPart.Length - 2).Split(new char[] { ':', }, 2); newField = new Field { Name = parts[0], ReturnType = name, Type = parts.Length > 1 && parts[1].Length > 2 ? CSharpGenerator.Namify(parts[0]) : null, }; returnItem.Fields.Add(newField); } { // split "main:(sub:(woot))" var parts = subPart.Substring(1, subPart.Length - 2).Split(new char[] { ':', '/', }, 2); var mainPart = parts.Length == 1 ? parts[0] : parts[0]; var subPart1 = parts.Length == 2 ? parts[1] : null; if (parts.Length > 1) { // "(sub:(woot))" var subReturnType = this.FindReturnType(mainPart, apiGroupName, subPart: subPart1); } } } else if (subPart != null) { // "main/sub" var parts = subPart.Split(new char[] { ':', '/', }, 2); returnItem.Fields.Add(new Field { Name = parts[0], ReturnType = name, }); } } return(returnItem); }
public static FieldName[] GetNameParts(string name, string propertyName) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException("The value cannot be empty", "name"); } string originalName = name; // strip enclosing paranthesis if (name[0] == '(' && name[name.Length - 1] == ')') { name = name.Substring(1, name.Length - 2); throw new ArgumentException("This method does not support subfields: '" + name + "'"); } else { var parts = name.Split(new char[] { ':', '/', }, 2); if (parts.Length == 0) { return(null); } if (parts.Length == 1) { return(new FieldName[] { new FieldName { ApiName = name, PropertyName = propertyName ?? (propertyName = CSharpGenerator.Namify(name, NameTransformation.CamelCase)), ClassName = null, }, }); } var currentField = new FieldName { ApiName = parts[0], PropertyName = CSharpGenerator.Namify(parts[0], NameTransformation.CamelCase), }; currentField.ClassName = currentField.PropertyName; // handle subfields or sub-property names FieldName[] subFields = null; if (IsFieldList(parts[1])) { currentField.SubNames = GetFieldList(parts[1]); if (currentField.SubNames.Length == 1) { subFields = GetNameParts(currentField.SubNames[0], null); } } else { subFields = GetNameParts(parts[1], null); } // create result array FieldName[] result; if (subFields != null && subFields.Length > 0) { result = new FieldName[subFields.Length + 1]; Array.Copy(subFields, 0, result, 1, subFields.Length); } else { result = new FieldName[1]; } result[0] = currentField; return(result); } }