static Func <object?, PredictionResult?> GetCallBack(
     PredictionClient client,
     PredictionContext context,
     CancellationTokenSource cancellationSource)
 {
     return(state =>
     {
         var predictor = (ICommandPredictor)state !;
         SuggestionPackage pkg = predictor.GetSuggestion(client, context, cancellationSource.Token);
         return pkg.SuggestionEntries?.Count > 0 ? new PredictionResult(predictor.Id, predictor.Name, pkg.Session, pkg.SuggestionEntries) : null;
     });
 }
        public static async Task <List <PredictionResult>?> PredictInputAsync(PredictionClient client, Ast ast, Token[] astTokens, int millisecondsTimeout)
        {
            Requires.Condition(millisecondsTimeout > 0, nameof(millisecondsTimeout));

            var predictors = SubsystemManager.GetSubsystems <ICommandPredictor>();

            if (predictors.Count == 0)
            {
                return(null);
            }

            var context = new PredictionContext(ast, astTokens);
            var tasks   = new Task <PredictionResult?> [predictors.Count];

            using var cancellationSource = new CancellationTokenSource();

            Func <object?, PredictionResult?> callBack = GetCallBack(client, context, cancellationSource);

            for (int i = 0; i < predictors.Count; i++)
            {
                ICommandPredictor predictor = predictors[i];
                tasks[i] = Task.Factory.StartNew(
                    callBack,
                    predictor,
                    cancellationSource.Token,
                    TaskCreationOptions.DenyChildAttach,
                    TaskScheduler.Default);
            }

            await Task.WhenAny(
                Task.WhenAll(tasks),
                Task.Delay(millisecondsTimeout, cancellationSource.Token)).ConfigureAwait(false);

            cancellationSource.Cancel();

            var resultList = new List <PredictionResult>(predictors.Count);

            foreach (Task <PredictionResult?> task in tasks)
            {
                if (task.IsCompletedSuccessfully)
                {
                    PredictionResult?result = task.Result;
                    if (result != null)
                    {
                        resultList.Add(result);
                    }
                }
            }

            return(resultList);
 public static Task <List <PredictionResult>?> PredictInputAsync(PredictionClient client, Ast ast, Token[] astTokens)
 {
     return(PredictInputAsync(client, ast, astTokens, millisecondsTimeout: 20));
 }
Пример #4
0
 public static void OnSuggestionAccepted(PredictionClient client, Guid predictorId, uint session, string suggestionText)
 {
 }
Пример #5
0
 public static void OnSuggestionDisplayed(PredictionClient client, Guid predictorId, uint session, int countOrIndex)
 {
 }
Пример #6
0
 public static void OnCommandLineExecuted(PredictionClient client, string commandLine, bool success)
 {
 }
Пример #7
0
 public static void OnCommandLineAccepted(PredictionClient client, IReadOnlyList <string> history)
 {
 }
Пример #8
0
 public static Task <List <PredictionResult> > PredictInputAsync(PredictionClient client, Ast ast, Token[] astTokens, int millisecondsTimeout)
 {
     return(null);
 }
Пример #9
0
 public static Task <List <PredictionResult> > PredictInputAsync(PredictionClient client, Ast ast, Token[] astTokens)
 {
     return(null);
 }