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; }
public TypeName(string @namespace, string name, TypeName[] genericTypes) { this.name = name; this.genericTypes = genericTypes; this.@namespace = @namespace; }