예제 #1
0
 public TupleValueNodeProvider(bool addParens, DmdType slotType, DbgDotNetValueNodeInfo nodeInfo, TupleField[] tupleFields)
 {
     this.addParens   = addParens;
     this.slotType    = slotType;
     this.nodeInfo    = nodeInfo;
     this.tupleFields = tupleFields;
 }
        TypeState GetTypeState(DbgDotNetValueNodeInfo nodeInfo)
        {
            var type = nodeInfo.Value.Type;

            if (type.IsByRef)
            {
                type = type.GetElementType() !;
            }
            return(GetOrCreateTypeState(type));
        }
예제 #3
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));
예제 #4
0
        public ArrayValueNodeProvider(DbgDotNetValueNodeProviderFactory owner, bool addParens, DmdType slotType, DbgDotNetValueNodeInfo valueInfo)
        {
            this.owner     = owner;
            this.addParens = addParens;
            this.slotType  = slotType;
            this.valueInfo = valueInfo;

            bool b = valueInfo.Value.GetArrayInfo(out arrayCount, out dimensionInfos !) && dimensionInfos.Length != 0;

            Debug.Assert(b);
            if (!b)
            {
                dimensionInfos = new[] { new DbgDotNetArrayDimensionInfo(0, arrayCount) }
            }
            ;
            if (dimensionInfos.Length > 1)
            {
                indexes = new int[dimensionInfos.Length];
            }
        }
예제 #5
0
 public DbgDotNetValueNodeImpl(LanguageValueNodeFactory valueNodeFactory, DbgDotNetValueNodeProvider childNodeProvider, DbgDotNetText name, DbgDotNetValueNodeInfo nodeInfo, string expression, string imageName, bool isReadOnly, bool causesSideEffects, DmdType expectedType, DmdType actualType, string errorMessage, DbgDotNetText valueText, ReadOnlyCollection <string> formatSpecifiers, ColumnFormatter columnFormatter)
 {
     if (name.Parts == null && columnFormatter == null)
     {
         throw new ArgumentException();
     }
     this.valueNodeFactory  = valueNodeFactory ?? throw new ArgumentNullException(nameof(valueNodeFactory));
     this.childNodeProvider = childNodeProvider;
     this.nodeInfo          = nodeInfo;
     Name                  = name;
     Value                 = nodeInfo?.DisplayValue;
     Expression            = expression ?? throw new ArgumentNullException(nameof(expression));
     ImageName             = imageName ?? throw new ArgumentNullException(nameof(imageName));
     IsReadOnly            = isReadOnly;
     CausesSideEffects     = causesSideEffects;
     ExpectedType          = expectedType;
     ActualType            = actualType;
     ErrorMessage          = errorMessage;
     this.valueText        = valueText;
     this.formatSpecifiers = formatSpecifiers;
     this.columnFormatter  = columnFormatter;
 }
 void Create(DbgEvaluationInfo evalInfo, List <DbgDotNetValueNodeProvider> providers, bool addParens, DmdType slotType, DbgDotNetValueNodeInfo nodeInfo, DbgValueNodeEvaluationOptions options, CreationOptions creationOptions) =>
 CreateCore(evalInfo, providers, addParens, slotType, nodeInfo, GetTypeState(nodeInfo), options, creationOptions);
        public DbgDotNetValueNodeProviderResult CreateResultsView(DbgEvaluationInfo evalInfo, bool addParens, DmdType slotType, DbgDotNetValueNodeInfo nodeInfo, DbgValueNodeEvaluationOptions options)
        {
            var state    = GetTypeState(nodeInfo);
            var provider = TryCreateResultsView(state, nodeInfo.Expression, nodeInfo.Value, slotType, options);

            if (!(provider is null))
            {
                return(new DbgDotNetValueNodeProviderResult(provider));
            }
            return(new DbgDotNetValueNodeProviderResult(dnSpy_Roslyn_Resources.ResultsView_MustBeEnumerableType));
        }
        public DbgDotNetValueNodeProviderResult Create(DbgEvaluationInfo evalInfo, bool addParens, DmdType slotType, DbgDotNetValueNodeInfo nodeInfo, DbgValueNodeEvaluationOptions options)
        {
            var providers = new List <DbgDotNetValueNodeProvider>(2);

            Create(evalInfo, providers, addParens, slotType, nodeInfo, options, CreationOptions.None);
            return(new DbgDotNetValueNodeProviderResult(DbgDotNetValueNodeProvider.Create(providers)));
        }
예제 #9
0
 internal DbgDotNetValueNode Create(DbgDotNetValueNodeProvider provider, DbgDotNetText name, DbgDotNetValueNodeInfo nodeInfo, string expression, string imageName, bool isReadOnly, bool causesSideEffects, DmdType expectedType, DmdType actualType, string?errorMessage, DbgDotNetText valueText, ReadOnlyCollection <string>?formatSpecifiers) =>
 new DbgDotNetValueNodeImpl(this, provider, name, nodeInfo, expression, imageName, isReadOnly, causesSideEffects, expectedType, actualType, errorMessage, valueText, formatSpecifiers, null);