maui-linux/Xamarin.Forms.Xaml/TypeArgumentsParser.cs

54 строки
1.4 KiB
C#

using System.Collections.Generic;
using System.Xml;
namespace Xamarin.Forms.Xaml
{
internal static class TypeArgumentsParser
{
public static IList<XmlType> ParseExpression(string expression, IXmlNamespaceResolver resolver, IXmlLineInfo lineInfo)
{
var typeList = new List<XmlType>();
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<XmlType> 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);
}
}
}