示例#1
0
        /// <summary>
        /// Generate completions for the "current" token in the specified input
        /// text.
        /// </summary>
        /// <param name="inputText">The input text string.</param>
        /// <param name="cursorIndex">The current cursor index into the string.
        /// </param>
        /// <param name="tokenCompleter">Token completion handler to invoke.
        /// </param>
        /// <returns>The generated completion set.</returns>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="tokenCompleter" />
        /// is null.</exception>
        public static TokenCompletionSet Create(string inputText, int cursorIndex, ITokenCompleter tokenCompleter)
        {
            if (tokenCompleter == null)
            {
                throw new ArgumentNullException(nameof(tokenCompleter));
            }

            var completions   = Create(inputText, cursorIndex, tokenCompleter, out int tokenStartIndex, out int tokenLength);
            var originalToken = new Token(new Substring(inputText, tokenStartIndex, tokenLength));

            return(new TokenCompletionSet(inputText, originalToken, completions));
        }
        private ConsoleLineInput CreateInput(IConsoleOutput consoleOutput = null, ITokenCompleter tokenCompleter = null)
        {
            consoleOutput = consoleOutput ?? Substitute.For <IConsoleOutput>();
            var buffer  = new ConsoleInputBuffer();
            var history = new ConsoleHistory();
            var input   = new ConsoleLineInput(consoleOutput, buffer, history)
            {
                TokenCompleter = tokenCompleter
            };

            input.ConsoleOutput.Should().BeSameAs(consoleOutput);
            input.Buffer.Should().BeSameAs(buffer);
            input.History.Should().BeSameAs(history);
            input.TokenCompleter.Should().BeSameAs(tokenCompleter);
            input.InsertMode.Should().BeTrue();

            return(input);
        }
        private static ConsoleReader CreateReader(IEnumerable <ConsoleKeyInfo> keyStream, ITokenCompleter tokenCompleter = null)
        {
            var consoleOutput = new SimulatedConsoleOutput();
            var consoleInput  = new SimulatedConsoleInput(keyStream);
            var input         = new ConsoleLineInput(consoleOutput, new ConsoleInputBuffer(), new ConsoleHistory())
            {
                TokenCompleter = tokenCompleter
            };

            return(new ConsoleReader(input, consoleInput, consoleOutput, null));
        }
 private static string Process(IEnumerable <ConsoleKeyInfo> keyInfo, ITokenCompleter tokenCompleter = null) =>
 CreateReader(keyInfo.Concat(ConsoleKey.Enter), tokenCompleter).ReadLine();
 private static string Process(ITokenCompleter tokenCompleter, params IEnumerable <ConsoleKeyInfo>[] keyInfo) =>
 Process(keyInfo.SelectMany(x => x), tokenCompleter: tokenCompleter);
示例#6
0
        /// <summary>
        /// Generate completions for the "current" token in the specified input
        /// text.
        /// </summary>
        /// <param name="inputText">The input text string.</param>
        /// <param name="cursorIndex">The current cursor index into the string.
        /// </param>
        /// <param name="tokenCompleter">Token completion handler to invoke.
        /// </param>
        /// <param name="existingTokenStartIndex">Receives the start index of
        /// the current token.</param>
        /// <param name="existingTokenLength">Receives the length of the current
        /// token.</param>
        /// <returns>The generated completions.</returns>
        private static IReadOnlyList <string> Create(string inputText, int cursorIndex, ITokenCompleter tokenCompleter, out int existingTokenStartIndex, out int existingTokenLength)
        {
            const TokenizerOptions tokenizerOptions =
                TokenizerOptions.AllowPartialInput |
                TokenizerOptions.HandleDoubleQuoteAsTokenDelimiter;

            //
            // Try to parse the line.  If we fail to parse it, then just
            // return immediately.
            //

            var tokens = StringUtilities.Tokenize(inputText, tokenizerOptions).ToList();

            //
            // Figure out which token we're in
            //

            int tokenIndex;

            for (tokenIndex = 0; tokenIndex < tokens.Count; ++tokenIndex)
            {
                var token = tokens[tokenIndex];
                if (cursorIndex > token.OuterEndingOffset)
                {
                    continue;
                }

                if (cursorIndex >= token.OuterStartingOffset)
                {
                    break;
                }

                // Insert an empty token here.
                tokens.Insert(
                    tokenIndex,
                    new Token(new Substring(inputText, cursorIndex, 0)));

                break;
            }

            if (tokenIndex < tokens.Count)
            {
                var token = tokens[tokenIndex];

                existingTokenStartIndex = token.OuterStartingOffset;
                existingTokenLength     = token.OuterLength;
            }
            else
            {
                existingTokenStartIndex = cursorIndex;
                existingTokenLength     = 0;
            }

            //
            // Ask for completions.
            //

            var tokenStrings = tokens.Select(token => RemoveQuotes(token.ToString())).ToArray();

            var completions = tokenCompleter.GetCompletions(tokenStrings, tokenIndex).ToList();

            // If necessary quote!
            for (var j = 0; j < completions.Count; j++)
            {
                var completion = completions[j];
                if (!completion.StartsWith(QuoteStr, StringComparison.OrdinalIgnoreCase))
                {
                    completions[j] = StringUtilities.QuoteIfNeeded(completions[j], QuoteChar);
                }
            }

            return(completions);
        }
        private ConsoleLineInput CreateInputWithText(IConsoleOutput consoleOutput, string text, ITokenCompleter tokenCompleter = null)
        {
            var input = CreateInput(consoleOutput, tokenCompleter);

            input.Insert(text);
            input.MoveCursorToEnd();

            return(input);
        }