示例#1
0
        public async Task <EvaluationResult> EvaluateExpressionAsync()
        {
            VsExpression vsExpression =
                await _vsExpressionCreator.CreateAsync(_text, EvaluateSizeSpecifierExpressionAsync);

            IDebugProperty2 result;

            if (vsExpression.Value.StartsWith("."))
            {
                EvaluateCommand(vsExpression.Value, out result);
                return(EvaluationResult.FromResult(result));
            }

            RemoteValue remoteValue = await CreateValueFromExpressionAsync(vsExpression.Value);

            if (remoteValue == null)
            {
                return(EvaluationResult.Fail());
            }

            string displayName           = vsExpression.ToString();
            IVariableInformation varInfo =
                _varInfoBuilder.Create(remoteValue, displayName, vsExpression.FormatSpecifier);

            result = _createPropertyDelegate.Invoke(varInfo);

            return(EvaluationResult.FromResult(result));
        }
        /// <summary>
        /// Evaluates a Natvis expression in the context of a variable asynchronously.
        ///
        /// Examples:
        ///   "myData[0] == true"
        ///   "myData[$i]"
        ///   "MyContainer<$T1, $T2>",
        ///   "(char*)myData,[myLength]s"
        /// </summary>
        /// <param name="expression">The expression to evaluate. Natvis tokens are resolved prior to
        /// evaluation, ex. $i, $Tx. </param>
        /// <param name="variable"></param>
        /// <param name="scopedNames">The Natvis tokens to resolve in expression.</param>
        /// <param name="displayName">The display name given to the result. If null the underlying
        /// debugger's context specific name is used.</param>
        /// <returns>The expression result.</returns>
        public async Task <IVariableInformation> EvaluateExpressionAsync(
            string expression, IVariableInformation variable, NatvisScope natvisScope,
            string displayName)
        {
            var vsExpression = await _vsExpressionCreator.CreateAsync(
                expression, async (sizeExpression) =>
            {
                IVariableInformation value = await EvaluateLldbExpressionAsync(
                    _vsExpressionCreator.Create(sizeExpression, ""), variable, natvisScope,
                    displayName);
                uint size;
                if (!uint.TryParse(await value.ValueAsync(), out size))
                {
                    throw new ExpressionEvaluationFailed("Expression isn't a uint");
                }

                return(size);
            });

            return(await EvaluateLldbExpressionAsync(vsExpression, variable, natvisScope,
                                                     displayName));
        }
        public async Task CreateWhenExpressionIsEmptyAsync()
        {
            var expression = await _expressionCreator.CreateAsync("", _evaluateSize);

            Assert.That(expression.Value, Is.EqualTo(""));
            Assert.That(expression.FormatSpecifier.Expression, Is.EqualTo(""));
            Assert.That(expression.FormatSpecifier.Size, Is.Null);
            await _evaluateSize.DidNotReceiveWithAnyArgs().Invoke(Arg.Any <string>());
        }