Ejemplo n.º 1
0
        public IEnumerable <IQuerySuggestion> Compute(SuggestionState state)
        {
            var expected = state.Expected.Find(item =>
                                               item.RuleIndices[0] == QueryParser.RULE_source);

            // make sure we are in the select part of a query
            if (expected == null)
            {
                return(Enumerable.Empty <IQuerySuggestion>());
            }

            // make sure we are in a path pattern
            if (state.Caret.ParentToken == null ||
                state.Caret.ParentToken.Type != QueryLexer.STRING)
            {
                return(Enumerable.Empty <IQuerySuggestion>());
            }

            // make sure the caret is in the pattern (not after the last quote)
            if (state.Caret.ParentOffset >= state.Caret.ParentToken.Text.Length &&
                state.Caret.ParentToken.Text[state.Caret.ParentOffset - 1] == '\"')
            {
                return(Enumerable.Empty <IQuerySuggestion>());
            }

            var patternParts = Split(state.Caret.ParentPrefix);

            // if the directory name at the caret is a pattern, don't suggest anything
            if (PathPattern.ContainsSpecialCharacters(patternParts.LastPart))
            {
                return(Enumerable.Empty <IQuerySuggestion>());
            }

            if (patternParts.LastPart.Length == 0)
            {
                patternParts.LastPart = "*";
            }
            else
            {
                patternParts.LastPart = "*" + patternParts.LastPart + "*";
            }

            try
            {
                var pattern = Path.Combine(patternParts.Prefix, patternParts.LastPart);
                var finder  = _fileSystem.CreateFileFinder(pattern);
                var result  = finder
                              .GetDirectories()
                              .Select(PathUtils.GetLastPart)
                              .Distinct()
                              .Select(name => new DirectorySuggestion(state.Caret, name));
                return(result);
            }
            catch (ArgumentException) // the pattern contains invalid characters
            {
                // suggestions should not throw for invalid input
                return(Enumerable.Empty <IQuerySuggestion>());
            }
        }