private static ParsedTypeName ParseCSharp(string name, int startIndex, out int endIndex) { char[] splitAt = new char[] { '.', '<', '[', '*', ',', '>' }; List <IParsedToken> parts = new List <IParsedToken>(); ParsedTypeName baseType = null; endIndex = startIndex; while (startIndex < name.Length && (endIndex = name.IndexOfAny(splitAt, startIndex)) >= 0) { switch (name[endIndex]) { case '.': ParsedName n; if (!ParsedName.TryCreate(name.Substring(startIndex, endIndex - startIndex), out n)) { throw new FormatException("Invalid name at index " + startIndex.ToString()); } parts.Add(n); break; case '>': case ',': return(new ParsedTypeName(baseType, parts)); case '<': List <ParsedTypeName> genericArgs = new List <ParsedTypeName>(); do { endIndex++; while (endIndex < name.Length && Char.IsWhiteSpace(name[endIndex])) { endIndex++; } if (endIndex == name.Length) { throw new FormatException("Unexpected end of string"); } genericArgs.Add(ParseCSharp(name, endIndex, out endIndex)); if (endIndex == name.Length) { throw new FormatException("Unexpected end of string"); } } while (name[endIndex] == ','); if (name[endIndex] != '>') { throw new FormatException("Invalid character at index " + endIndex.ToString()); } break; case '*': if (parts.Count == 0) { throw new FormatException("Invalid character at index " + endIndex.ToString()); } baseType = new ParsedTypeName(baseType, parts); parts = new List <IParsedToken>(); parts.Add(new ParsedPointer()); break; case '[': int rank = 0; do { rank++; endIndex++; while (endIndex < name.Length && Char.IsWhiteSpace(name[endIndex])) { endIndex++; } if (endIndex == name.Length) { throw new FormatException("Unexpected end of string"); } } while (name[endIndex] == ','); if (name[endIndex] != ']') { throw new FormatException("Invalid character at index " + endIndex.ToString()); } baseType = new ParsedTypeName(baseType, parts); parts = new List <IParsedToken>(); parts.Add(new ParsedIndexer(rank)); break; } startIndex = endIndex + 1; } endIndex = name.Length; return(new ParsedTypeName(baseType, parts)); }
private ParsedTypeName(ParsedTypeName baseType, List <IParsedToken> parts) { }