public EvaluationRequest(RHost host, string expression, REvaluationKind kind, out JArray message)
            {
                Expression = expression;
                Kind       = kind;

                var nameBuilder = new StringBuilder("=");

                if (kind.HasFlag(REvaluationKind.Reentrant))
                {
                    nameBuilder.Append('@');
                }
                if (kind.HasFlag(REvaluationKind.Cancelable))
                {
                    nameBuilder.Append('/');
                }
                if (kind.HasFlag(REvaluationKind.BaseEnv))
                {
                    nameBuilder.Append('B');
                }
                if (kind.HasFlag(REvaluationKind.EmptyEnv))
                {
                    nameBuilder.Append('E');
                }
                if (kind.HasFlag(REvaluationKind.NoResult))
                {
                    nameBuilder.Append('0');
                }
                MessageName = nameBuilder.ToString();

                expression = expression.Replace("\r\n", "\n");

                message = host.CreateMessage(out Id, MessageName, expression);
            }
Exemple #2
0
 public Task<REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, CancellationToken ct = default(CancellationToken)) {
     LastExpression = expression;
     if (kind.HasFlag(REvaluationKind.Mutating)) {
         Mutated?.Invoke(this, EventArgs.Empty);
     }
     return Task.FromResult(new REvaluationResult());
 }
Exemple #3
0
        private async Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, bool waitUntilInitialized, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (!IsHostRunning)
            {
                throw new RHostDisconnectedException();
            }

            if (waitUntilInitialized)
            {
                await _initializedTcs.Task;
            }

            try {
                var result = await _host.EvaluateAsync(expression, kind, cancellationToken);

                if (kind.HasFlag(REvaluationKind.Mutating))
                {
                    OnMutated();
                }
                return(result);
            } catch (MessageTransportException) when(!IsHostRunning)
            {
                throw new RHostDisconnectedException();
            }
        }
Exemple #4
0
 public Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, CancellationToken ct = default(CancellationToken))
 {
     if (kind.HasFlag(REvaluationKind.Mutating))
     {
         Mutated?.Invoke(this, EventArgs.Empty);
     }
     return(Task.FromResult(new REvaluationResult()));
 }
 public Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind = REvaluationKind.Normal, CancellationToken ct = default(CancellationToken))
 {
     if (kind.HasFlag(REvaluationKind.Mutating))
     {
         IsMutating = true;
     }
     return(Task.FromResult(new REvaluationResult()));
 }
Exemple #6
0
        public Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, CancellationToken ct)
        {
            if (kind.HasFlag(REvaluationKind.Mutating))
            {
                IsMutating = true;
            }

            ct.Register(() => _tcs.TrySetCanceled());
            return(_evaluator.EvaluateAsync(expression, kind, ct));
        }
Exemple #7
0
        public Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, CancellationToken ct)
        {
            if (_cancelEvaluationAfterRunTask == null)
            {
                throw new InvalidOperationException("Host was not started");
            }
            else if (_cancelEvaluationAfterRunTask.IsCompleted)
            {
                return(RhostDisconnectedEvaluationResult);
            }

            if (ct.IsCancellationRequested)
            {
                return(Task.FromCanceled <REvaluationResult>(ct));
            }

            return(Task.WhenAny(EvaluateAsyncWorker(expression, kind, ct), _cancelEvaluationAfterRunTask).Unwrap());
        }
Exemple #8
0
        public async Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, CancellationToken cancellationToken)
        {
            if (_runTask == null)
            {
                throw new InvalidOperationException("Host was not started");
            }

            using (CancellationTokenUtilities.Link(ref cancellationToken, _cts.Token)) {
                try {
                    await TaskUtilities.SwitchToBackgroundThread();

                    var request = await EvaluationRequest.SendAsync(this, expression, kind, cancellationToken);

                    return(await request.Task);
                } catch (OperationCanceledException ex) when(_cts.IsCancellationRequested)
                {
                    throw new RHostDisconnectedException(Resources.Error_RHostIsStopped, ex);
                }
            }
        }
Exemple #9
0
        public async Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind = REvaluationKind.Normal, CancellationToken ct = default(CancellationToken))
        {
            if (!IsHostRunning)
            {
                return(await CanceledEvaluateTask);
            }

            try {
                var result = await _host.EvaluateAsync(expression, kind, ct);

                if (kind.HasFlag(REvaluationKind.Mutating))
                {
                    OnMutated();
                }
                return(result);
            } catch (MessageTransportException) when(!IsHostRunning)
            {
                return(await CanceledEvaluateTask);
            }
        }
Exemple #10
0
        public async Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind = REvaluationKind.Normal, CancellationToken ct = default(CancellationToken))
        {
            if (!IsHostRunning)
            {
                throw new RHostDisconnectedException();
            }

            await _afterHostStartedTask;

            try {
                var result = await _host.EvaluateAsync(expression, kind, ct);

                if (kind.HasFlag(REvaluationKind.Mutating))
                {
                    OnMutated();
                }
                return(result);
            } catch (MessageTransportException) when(!IsHostRunning)
            {
                throw new RHostDisconnectedException();
            }
        }
Exemple #11
0
        /// <summary>
        /// <para>
        /// Like <see cref="IRExpressionEvaluator.EvaluateAsync"/>, but after obtaining the result, deserializes it.
        /// </para>
        /// <para>
        /// If <typeparamref name="T"/> is an array of bytes, <see cref="REvaluationKind.RawResult"/> is implicitly added to <paramref name="kind"/>,
        /// and <see cref="REvaluationResult.RawResult"/> produced by the evaluation is returned as is.
        /// </para>
        /// <para>
        /// If <typeparamref name="T"/> is any other type, <see cref="JToken.ToObject{T}"/> is used to convert <see cref="REvaluationResult.Result"/>
        /// to <typeparamref name="T"/>.
        /// </para>
        /// <para>
        /// If evaluation fails, returned task will be <see cref="TaskStatus.Faulted"/> with <see cref="REvaluationException"/>.
        /// </para>
        /// </summary>
        /// <returns>
        /// A task that represents evaluation. If evaluation is completed successfully, <see cref="Task.Result"/> will return
        /// deserialized object that represents response from R host process. If R Host get terminated or connection
        /// to the remote host is lost, task will be <see cref="TaskStatus.Canceled"/> with <see cref="RHostDisconnectedException"/>.
        /// If <paramref name="cancellationToken"/> become canceled before method is completed, task will be <see cref="TaskStatus.Canceled"/>
        /// with <see cref="OperationCanceledException"/>. If <see cref="REvaluationResult.ParseStatus"/> was not <see cref="RParseStatus.OK"/>, or
        /// <see cref="REvaluationResult.Error"/> was not <see langword="null"/>, task will be <see cref="TaskStatus.Faulted"/> with <see cref="REvaluationException"/>.
        /// </returns>
        public static async Task <T> EvaluateAsync <T>(this IRExpressionEvaluator evaluator, string expression, REvaluationKind kind, CancellationToken cancellationToken = default(CancellationToken))
        {
            bool isRaw = typeof(T) == typeof(byte[]);

            if (isRaw)
            {
                kind |= REvaluationKind.RawResult;
            }

            var res = await evaluator.EvaluateAsync(expression, kind, cancellationToken);

            ThrowOnError(expression, res);

            if (isRaw)
            {
                Trace.Assert(res.RawResult != null);
                return((T)(object)res.RawResult);
            }
            else
            {
                Trace.Assert(res.Result != null);
                return(res.Result.ToObject <T>());
            }
        }
Exemple #12
0
 /// <summary>
 /// Like <see cref="IRExpressionEvaluator.EvaluateAsync"/>, but takes a <see cref="FormattableString"/> for the expression,
 /// and uses <see cref="CultureInfo.InvariantCulture"/> to format it.
 /// </summary>
 public static Task <REvaluationResult> EvaluateAsync(this IRExpressionEvaluator evaluator, FormattableString expression, REvaluationKind kind, CancellationToken cancellationToken = default(CancellationToken)) =>
 evaluator.EvaluateAsync(Invariant(expression), kind, cancellationToken);
Exemple #13
0
        /// <summary>
        /// Like <see cref="EvaluateAsync{T}(IRExpressionEvaluator, string, REvaluationKind, CancellationToken)"/>, but suppresses
        /// the result, such that it is not transmitted between the host and the client, and is not serialized or deserialized.
        /// </summary>
        /// <remarks>
        /// Use in lieu of <see cref="EvaluateAsync{T}(IRExpressionEvaluator, string, REvaluationKind, CancellationToken)"/> for
        /// evaluations that are performed solely for their side effects, when the result is not inspected.
        /// </remarks>
        public static async Task ExecuteAsync(this IRExpressionEvaluator evaluator, string expression, REvaluationKind kind, CancellationToken cancellationToken = default(CancellationToken))
        {
            var res = await evaluator.EvaluateAsync(expression, kind | REvaluationKind.NoResult, cancellationToken);

            ThrowOnError(expression, res);
            Trace.Assert(res.Result == null);
        }
 public Task<REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind = REvaluationKind.Normal) {
     return Task.FromResult(new REvaluationResult());
 }
Exemple #15
0
 public Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind)
 {
     return(_evaluator.EvaluateAsync(expression, kind, _ct));
 }
 public Task<REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind) {
     return _evaluator.EvaluateAsync(expression, kind, _ct);
 }
Exemple #17
0
 public Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, CancellationToken cancellationToken = new CancellationToken())
 => _session.EvaluateAsync(expression, kind, false, cancellationToken);
Exemple #18
0
 public Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind = REvaluationKind.Normal, CancellationToken cancellationToken = default(CancellationToken))
 {
     _processingChangeDirectoryCommand = expression.StartsWithOrdinal("setwd");
     return(EvaluateAsync(expression, kind, true, cancellationToken));
 }
Exemple #19
0
 public Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, CancellationToken ct)
 {
     return(ct.IsCancellationRequested || _runTask == null || _runTask.IsCompleted
         ? Task.FromCanceled <REvaluationResult>(new CancellationToken(true))
         : EvaluateAsyncBackground(expression, kind, ct));
 }
        public static Task <JArray> PackageAllFunctionsNamesAsync(this IRExpressionEvaluator evaluation, string packageName, REvaluationKind kind = REvaluationKind.Normal, CancellationToken cancellationToken = default)
        {
            var script = Invariant($"rtvs:::package.all.functions.names({packageName.ToRStringLiteral()})");

            return(evaluation.EvaluateAsync <JArray>(script, kind, cancellationToken));
        }
        public static Task <JArray> InstalledPackagesFunctionsAsync(this IRExpressionEvaluator evaluation, REvaluationKind kind = REvaluationKind.Normal, CancellationToken cancellationToken = default)
        {
            var script = "rtvs:::packages.installed.functions()";

            return(evaluation.EvaluateAsync <JArray>(script, kind, cancellationToken));
        }
Exemple #22
0
 public async Task<REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, CancellationToken cancellationToken) {
     if (_runTask == null) {
         throw new InvalidOperationException("Host was not started");
     }
     
     using (CancellationTokenUtilities.Link(ref cancellationToken, _cts.Token)) {
         try {
             await TaskUtilities.SwitchToBackgroundThread();
             var request = await EvaluationRequest.SendAsync(this, expression, kind, cancellationToken);
             return await request.Task;
         } catch(OperationCanceledException ex) when (_cts.IsCancellationRequested) {
             throw new RHostDisconnectedException(Resources.Error_RHostIsStopped, ex);
         }
     }
 }
 public Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind = REvaluationKind.Normal)
 {
     return(Task.FromResult(new REvaluationResult()));
 }
Exemple #24
0
            public static async Task <EvaluationRequest> SendAsync(RHost host, string expression, REvaluationKind kind, CancellationToken cancellationToken)
            {
                var nameBuilder = new StringBuilder("?=");

                if (kind.HasFlag(REvaluationKind.Reentrant))
                {
                    nameBuilder.Append('@');
                }
                if (kind.HasFlag(REvaluationKind.Cancelable))
                {
                    nameBuilder.Append('/');
                }
                if (kind.HasFlag(REvaluationKind.BaseEnv))
                {
                    nameBuilder.Append('B');
                }
                if (kind.HasFlag(REvaluationKind.EmptyEnv))
                {
                    nameBuilder.Append('E');
                }
                if (kind.HasFlag(REvaluationKind.NoResult))
                {
                    nameBuilder.Append('0');
                }
                if (kind.HasFlag(REvaluationKind.RawResult))
                {
                    nameBuilder.Append('r');
                }
                string messageName = nameBuilder.ToString();

                expression = expression.Replace("\r\n", "\n");

                var message = host.CreateMessage(messageName, ulong.MaxValue, new JArray {
                    expression
                });
                var request = new EvaluationRequest(host, message, kind, cancellationToken);

                await host.SendAsync(message, cancellationToken);

                return(request);
            }
Exemple #25
0
        /// <summary>
        /// Like <see cref="IRExpressionEvaluator.EvaluateAsync"/>, but after obtaining the result, deserializes it using
        /// <see cref="JToken.ToObject{T}"/>. If evaluation fails, throws <see cref="REvaluationException"/>.
        /// </summary>
        /// <exception cref="REvaluationException">
        /// <see cref="REvaluationResult.ParseStatus"/> was not <see cref="RParseStatus.OK"/>, or
        /// <see cref="REvaluationResult.Error"/> was not <see langword="null"/>.
        /// </exception>
        public static async Task <T> EvaluateAsync <T>(this IRExpressionEvaluator evaluator, string expression, REvaluationKind kind, CancellationToken cancellationToken = default(CancellationToken))
        {
            var res = await evaluator.EvaluateAsync(expression, kind, cancellationToken);

            ThrowOnError(expression, res);
            Trace.Assert(res.Result != null);
            return(res.Result.ToObject <T>());
        }
Exemple #26
0
        private async Task <REvaluationResult> EvaluateAsyncBackground(string expression, REvaluationKind kind, CancellationToken ct)
        {
            await TaskUtilities.SwitchToBackgroundThread();

            if (!_canEval)
            {
                throw new InvalidOperationException("EvaluateAsync can only be called while ReadConsole or YesNoCancel is pending.");
            }

            bool reentrant = false, jsonResult = false;

            var nameBuilder = new StringBuilder("=");

            if (kind.HasFlag(REvaluationKind.Reentrant))
            {
                nameBuilder.Append('@');
                reentrant = true;
            }
            if (kind.HasFlag(REvaluationKind.Cancelable))
            {
                nameBuilder.Append('/');
                reentrant = true;
            }
            if (kind.HasFlag(REvaluationKind.Json))
            {
                nameBuilder.Append('j');
                jsonResult = true;
            }
            if (kind.HasFlag(REvaluationKind.BaseEnv))
            {
                nameBuilder.Append('B');
            }
            if (kind.HasFlag(REvaluationKind.EmptyEnv))
            {
                nameBuilder.Append('E');
            }
            if (kind.HasFlag(REvaluationKind.NewEnv))
            {
                nameBuilder.Append("N");
            }
            var name = nameBuilder.ToString();

            _canEval = false;
            try {
                expression = expression.Replace("\r\n", "\n");
                var id = await SendAsync(name, ct, expression);

                var response = await RunLoop(ct, reentrant);

                if (response == null)
                {
                    throw new OperationCanceledException("Evaluation canceled because host process has been terminated.");
                }

                if (response.RequestId != id || response.Name != name)
                {
                    throw ProtocolError($"Mismatched host response ['{response.Id}',':','{response.Name}',...] to evaluation request ['{id}','{name}','{expression}']");
                }

                response.ExpectArguments(1, 3);
                var firstArg = response[0] as JValue;
                if (firstArg != null && firstArg.Value == null)
                {
                    throw new OperationCanceledException(Invariant($"Evaluation canceled: {expression}"));
                }

                response.ExpectArguments(3);
                var parseStatus = response.GetEnum <RParseStatus>(0, "parseStatus", parseStatusNames);
                var error       = response.GetString(1, "error", allowNull: true);

                if (jsonResult)
                {
                    return(new REvaluationResult(response[2], error, parseStatus));
                }
                else
                {
                    return(new REvaluationResult(response.GetString(2, "value", allowNull: true), error, parseStatus));
                }
            } finally {
                _canEval = true;
            }
        }
Exemple #27
0
        private async Task <REvaluationResult> EvaluateAsyncWorker(string expression, REvaluationKind kind, CancellationToken cancellationToken)
        {
            await TaskUtilities.SwitchToBackgroundThread();

            var request = await EvaluationRequest.SendAsync(this, expression, kind, cancellationToken);

            return(await request.Task);
        }
Exemple #28
0
 public Task<REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, CancellationToken ct) {
     return ct.IsCancellationRequested || _runTask == null || _runTask.IsCompleted
         ? Task.FromCanceled<REvaluationResult>(new CancellationToken(true))
         : EvaluateAsyncBackground(expression, kind, ct);
 }
Exemple #29
0
 private EvaluationRequest(RHost host, Message message, REvaluationKind kind, CancellationToken cancellationToken)
     : base(host, message, cancellationToken)
 {
     Kind = kind;
 }
Exemple #30
0
        private async Task<REvaluationResult> EvaluateAsyncBackground(string expression, REvaluationKind kind, CancellationToken ct) { 
            await TaskUtilities.SwitchToBackgroundThread();

            if (!_canEval) {
                throw new InvalidOperationException("EvaluateAsync can only be called while ReadConsole or YesNoCancel is pending.");
            }

            bool reentrant = false, jsonResult = false;

            var nameBuilder = new StringBuilder("=");
            if (kind.HasFlag(REvaluationKind.Reentrant)) {
                nameBuilder.Append('@');
                reentrant = true;
            }
            if (kind.HasFlag(REvaluationKind.Cancelable)) {
                nameBuilder.Append('/');
                reentrant = true;
            }
            if (kind.HasFlag(REvaluationKind.Json)) {
                nameBuilder.Append('j');
                jsonResult = true;
            }
            if (kind.HasFlag(REvaluationKind.BaseEnv)) {
                nameBuilder.Append('B');
            }
            if (kind.HasFlag(REvaluationKind.EmptyEnv)) {
                nameBuilder.Append('E');
            }
            if (kind.HasFlag(REvaluationKind.NewEnv)) {
                nameBuilder.Append("N");
            }
            var name = nameBuilder.ToString();

            _canEval = false;
            try {
                expression = expression.Replace("\r\n", "\n");
                var id = await SendAsync(name, ct, expression);

                var response = await RunLoop(ct, reentrant);
                if (response == null) {
                    throw new OperationCanceledException("Evaluation canceled because host process has been terminated.");
                }

                if (response.RequestId != id || response.Name != name) {
                    throw ProtocolError($"Mismatched host response ['{response.Id}',':','{response.Name}',...] to evaluation request ['{id}','{name}','{expression}']");
                }

                response.ExpectArguments(1, 3);
                var firstArg = response[0] as JValue;
                if (firstArg != null && firstArg.Value == null) {
                    throw new OperationCanceledException(Invariant($"Evaluation canceled: {expression}"));
                }

                response.ExpectArguments(3);
                var parseStatus = response.GetEnum<RParseStatus>(0, "parseStatus", parseStatusNames);
                var error = response.GetString(1, "error", allowNull: true);

                if (jsonResult) {
                    return new REvaluationResult(response[2], error, parseStatus);
                } else {
                    return new REvaluationResult(response.GetString(2, "value", allowNull: true), error, parseStatus);
                }
            } finally {
                _canEval = true;
            }
        }
Exemple #31
0
 public Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, CancellationToken cancellationToken = new CancellationToken())
 {
     return(_evaluation.EvaluateAsync(expression, kind, cancellationToken));
 }
Exemple #32
0
        private async Task <REvaluationResult> EvaluateAsyncBackground(string expression, REvaluationKind kind, CancellationToken ct)
        {
            await TaskUtilities.SwitchToBackgroundThread();

            JArray message;
            var    request = new EvaluationRequest(this, expression, kind, out message);

            _evalRequests[request.Id] = request;

            await SendAsync(message, ct);

            return(await request.CompletionSource.Task);
        }