using System.Collections.Generic; using System.Xml; namespace Xamarin.Forms.Xaml { internal static class TypeArgumentsParser { public static IList ParseExpression(string expression, IXmlNamespaceResolver resolver, IXmlLineInfo lineInfo) { var typeList = new List(); while (!string.IsNullOrWhiteSpace(expression)) { var match = expression; typeList.Add(Parse(match, ref expression, resolver, lineInfo)); } return typeList; } static XmlType Parse(string match, ref string remaining, IXmlNamespaceResolver resolver, IXmlLineInfo lineinfo) { remaining = null; int parensCount = 0; int pos = 0; bool isGeneric = false; for (pos = 0; pos < match.Length; pos++) { if (match[pos] == '(') { parensCount++; isGeneric = true; } else if (match[pos] == ')') parensCount--; else if (match[pos] == ',' && parensCount == 0) { remaining = match.Substring(pos + 1); break; } } var type = match.Substring(0, pos).Trim(); IList typeArguments = null; if (isGeneric) { typeArguments = ParseExpression( type.Substring(type.IndexOf('(') + 1, type.LastIndexOf(')') - type.IndexOf('(') - 1), resolver, lineinfo); type = type.Substring(0, type.IndexOf('(')); } var namespaceuri = type.Contains(":") ? resolver.LookupNamespace(type.Split(':')[0].Trim()) : ""; return new XmlType(namespaceuri, type, typeArguments); } } }