Пример #1
0
        DbgDotNetValueNode CreateValue(DbgEvaluationInfo evalInfo, DbgDotNetText name, DbgDotNetValue value, ReadOnlyCollection <string>?formatSpecifiers, DbgValueNodeEvaluationOptions options, string expression, string imageName, bool isReadOnly, bool causesSideEffects, DmdType expectedType, bool isRootExpression, ColumnFormatter?columnFormatter)
        {
            // Could be a by-ref property, local, or parameter.
            if (expectedType.IsByRef)
            {
                if (value.Type.IsByRef)
                {
                    var newValue = value.LoadIndirect();
                    value.Dispose();
                    if (newValue.HasError)
                    {
                        return(CreateError(evalInfo, name, newValue.ErrorMessage !, expression, causesSideEffects));
                    }
                    value = newValue.Value !;
                }
                expectedType = expectedType.GetElementType() !;
            }

            options = PredefinedFormatSpecifiers.GetValueNodeEvaluationOptions(formatSpecifiers, options);
            var  nodeInfo  = new DbgDotNetValueNodeInfo(value, expression);
            bool addParens = isRootExpression && NeedsParentheses(expression);
            DbgDotNetValueNodeProviderResult info;
            bool useProvider        = false;
            var  specialViewOptions = (options & ~(DbgValueNodeEvaluationOptions.ResultsView | DbgValueNodeEvaluationOptions.DynamicView));

            if ((options & DbgValueNodeEvaluationOptions.ResultsView) != 0)
            {
                info        = valueNodeProviderFactory.CreateResultsView(evalInfo, addParens, expectedType, nodeInfo, specialViewOptions);
                useProvider = !(info.ErrorMessage is null);
            }
            else if ((options & DbgValueNodeEvaluationOptions.DynamicView) != 0)
            {
                info        = valueNodeProviderFactory.CreateDynamicView(evalInfo, addParens, expectedType, nodeInfo, specialViewOptions);
                useProvider = true;
            }
            else
            {
                info = valueNodeProviderFactory.Create(evalInfo, addParens, expectedType, nodeInfo, options);
            }
            if (useProvider)
            {
                if (!(info.ErrorMessage is null))
                {
                    return(new DbgDotNetValueNodeImpl(this, info.Provider, name, nodeInfo, expression, PredefinedDbgValueNodeImageNames.Error, true, false, null, null, info.ErrorMessage, new DbgDotNetText(new DbgDotNetTextPart(DbgTextColor.Error, info.ErrorMessage)), formatSpecifiers, columnFormatter));
                }
                Debug2.Assert(!(info.Provider is null));
                return(new DbgDotNetValueNodeImpl(this, info.Provider, name, nodeInfo, expression, info.Provider?.ImageName ?? imageName, true, false, null, null, info.ErrorMessage, info.Provider?.ValueText ?? default, formatSpecifiers, columnFormatter));
            }
            return(new DbgDotNetValueNodeImpl(this, info.Provider, name, nodeInfo, expression, imageName, isReadOnly, causesSideEffects, expectedType, value.Type, info.ErrorMessage, default, formatSpecifiers, columnFormatter));
        bool InitializeListDebugView(DbgEvaluationInfo evalInfo)
        {
            var info = EnumerableDebugViewHelper.GetListEnumerableMethods(instanceValue.Type, enumerableType);

            if ((object)info.ctor == null)
            {
                return(false);
            }

            DbgDotNetValueResult collTypeResult = default;
            DbgDotNetValueResult toArrayResult  = default;
            bool error = true;

            try {
                var runtime = evalInfo.Runtime.GetDotNetRuntime();

                collTypeResult = runtime.CreateInstance(evalInfo, info.ctor, new[] { instanceValue }, DbgDotNetInvokeOptions.None);
                if (!collTypeResult.IsNormalResult)
                {
                    return(false);
                }
                var expr = valueNodeProviderFactory.GetNewObjectExpression(info.ctor, valueExpression, expectedType);

                toArrayResult = runtime.Call(evalInfo, collTypeResult.Value, info.toArrayMethod, Array.Empty <object>(), DbgDotNetInvokeOptions.None);
                if (toArrayResult.HasError)
                {
                    return(false);
                }
                expr = valueNodeProviderFactory.GetCallExpression(info.toArrayMethod, expr);

                var result = valueNodeProviderFactory.Create(evalInfo, false, toArrayResult.Value.Type, new DbgDotNetValueNodeInfo(toArrayResult.Value, expr), evalOptions);
                if (result.Provider == null)
                {
                    return(false);
                }
                realProvider = result.Provider;
                error        = false;
                return(true);
            }
            finally {
                collTypeResult.Value?.Dispose();
                if (error)
                {
                    toArrayResult.Value?.Dispose();
                }
            }
        }