// Return null to allow other providers a chance. If we throw EvaluatorException, it will be presented to the
        // user. OperationCancelledException will be logged and we move on to the next presenter. Any other exception
        // will leak
        public override IValuePresentation PresentValue(IObjectValueRole <TValue> valueRole,
                                                        IMetadataTypeLite instanceType,
                                                        IPresentationOptions options,
                                                        IUserDataHolder dataHolder,
                                                        CancellationToken token)
        {
            var debuggerDisplayString = dataHolder.GetData(ourDebuggerDisplayStringKey);

            try
            {
                var valueReference    = valueRole.ValueReference;
                var thisObj           = valueReference.GetValue(options);
                var evaluationOptions =
                    valueReference.OriginatingFrame.DebuggerSession.Options.EvaluationOptions.Apply(options);

                // This can throw if there are members missing, which is entirely possible when debugging on a device,
                // due to stripping. It will throw EvaluatorException. Anything else is logged and thrown as a new
                // EvaluatorException. We can also get InvalidOperationException, but only if no other evaluators can
                // handle the current context, which is unlikely
                var displayString =
                    ExpressionEvaluators.EvaluateDisplayString(valueReference.OriginatingFrame, thisObj,
                                                               debuggerDisplayString, evaluationOptions, token);

                var flags = valueReference.DefaultFlags;
                if (valueReference is CalculatedValueReferenceDecorator <TValue> reference &&
                    !reference.AllowDefaultTypePresentation)
                {
                    flags |= ValueFlags.IsDefaultTypePresentation;
                }

                return(SimplePresentation.CreateSuccess(
                           ValuePresentationPart.Default(DisplayStringUtil.EscapeString(displayString)),
                           flags, instanceType, displayString));
            }
            catch (Exception ex)
            {
                // Log as warning, not error - there's nothing the user can do, and we're likely to encounter this with
                // device builds
                myLogger.Warn(ex,
                              comment: $"Unable to evaluate debugger display string for type {instanceType.GetGenericTypeDefinition().FullName}: {debuggerDisplayString}. " +
                              "Expected behaviour on devices due to stripping");
                return(null);
            }
        }
예제 #2
0
 public T GetData <T>(Key <T> key) where T : class
 {
     return(_dataHolder.GetData(key));
 }
예제 #3
0
 public T GetData <T>(Key <T> key)
     where T : class
 => _dataHolder.GetData(key);
        public override bool IsAvailable(IUserDataHolder cache)
        {
            var hasFix = cache.GetData(IntroduceAndInitializePrivateAutoPropertyFix.InstanceKey) != null;

            return(!hasFix && base.IsAvailable(cache));
        }
 public override bool IsAvailable(IUserDataHolder cache)
 {
     var hasFix = cache.GetData(IntroduceAndInitializePrivateAutoPropertyFix.InstanceKey) != null;
     return !hasFix && base.IsAvailable(cache);
 }