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)); }
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));
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]; } }
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))); }
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);