示例#1
0
        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));
        }
示例#2
0
 private ParsedTypeName(ParsedTypeName baseType, List <IParsedToken> parts)
 {
 }