private TypeName BuildName(string name, TypeName[] genericTypes)
		{
			var typeStartsHere = name.LastIndexOf('.');
			string typeName;
			string @namespace = null;

			if (typeStartsHere > -1 && typeStartsHere < (name.Length - 1))
			{
				typeName = name.Substring(typeStartsHere + 1);
				@namespace = name.Substring(0, typeStartsHere);
			}
			else
			{
				typeName = name;
			}
			return new TypeName(@namespace, typeName, genericTypes);
		}
		public TypeName Parse(string name)
		{
			var isPotentiallyFullyQualifiedName = false;
			if (name.IndexOf(',') != -1)
			{
				isPotentiallyFullyQualifiedName = true;
			}
			var genericIndex = name.IndexOf('`');
			var genericTypes = new TypeName[] { };
			if (genericIndex > -1)
			{
				var start = name.IndexOf("[[", genericIndex);
				if (start != -1)
				{
					int count;
					var countString = name.Substring(genericIndex + 1, start - genericIndex - 1);
					if (int.TryParse(countString, out count) == false)
					{
						return null;
					}
					genericTypes = ParseNames(name.Substring(start + 2, name.LastIndexOf("]]") - 2 - start), count);
					if (genericTypes == null)
					{
						return null;
					}
					isPotentiallyFullyQualifiedName = false;
					name = name.Substring(0, start);
				}
			}
			if(isPotentiallyFullyQualifiedName)
			{
				//well at this point it either is a fully qualified name, or invalid string
				return new TypeName(name);
			}
			// at this point we assume we have just the type name, probably prefixed with namespace so let's see which one is it
			return BuildName(name, genericTypes);
		}
		private TypeName[] ParseNames(string substring, int count)
		{
			if (count == 1)
			{
				var name = Parse(substring);
				if (name == null)
				{
					return new TypeName[0];
				}
				return new[] { name };
			}
			var names = new TypeName[count];

			var location = 0;
			for (var i = 0; i < count; i++)
			{
				var newLocation = MoveToEnd(location,substring);
				names[i] = Parse(substring.Substring(location, newLocation - location));
				location = MoveToBeginning(newLocation, substring) + 1;
			}
			return names;
		}
Пример #4
0
 public TypeName(string @namespace, string name, TypeName[] genericTypes)
 {
     this.name = name;
     this.genericTypes = genericTypes;
     this.@namespace = @namespace;
 }