private IGlobToken ReadDirectoryWildcardToken(GlobStringReader reader, PathSeparatorToken leadingPathSeparatorToken) { reader.ReadChar(); if (GlobStringReader.IsPathSeparator(reader.PeekChar())) { reader.ReadChar(); var trailingSeparator = ReadPathSeparatorToken(reader); return(new WildcardDirectoryToken(leadingPathSeparatorToken, trailingSeparator)); } return(new WildcardDirectoryToken(leadingPathSeparatorToken, null)); // this shouldn't happen unless a pattern ends with ** which is weird. **sometext is not legal. }
public IList <IGlobToken> Tokenise(string globText) { var tokens = new List <IGlobToken>(); using (var reader = new GlobStringReader(globText)) { while (reader.ReadChar()) { if (reader.IsBeginningOfRangeOrList) { tokens.Add(ReadRangeOrListToken(reader)); } else if (reader.IsSingleCharacterMatch) { tokens.Add(ReadSingleCharacterMatchToken()); } else if (reader.IsWildcardCharacterMatch) { tokens.Add(ReadWildcardToken()); } else if (reader.IsPathSeparator()) { var sepToken = ReadPathSeparatorToken(reader); tokens.Add(sepToken); } else if (reader.IsBeginningOfDirectoryWildcard) { if (tokens.Count > 0) { if (tokens[tokens.Count - 1] is PathSeparatorToken lastToken) { tokens.Remove(lastToken); tokens.Add(ReadDirectoryWildcardToken(reader, lastToken)); continue; } } tokens.Add(ReadDirectoryWildcardToken(reader, null)); } else { tokens.Add(ReadLiteralToken(reader)); } } } _currentBufferText.Clear(); return(tokens); }