Browse Source

Merge pull request #8067 from pr8x/devtools-crash-exceptions

DevTools: Fix crash when property getter throws
pull/8083/head
Max Katz 4 years ago
committed by GitHub
parent
commit
57da055952
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 64
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/AvaloniaPropertyViewModel.cs
  2. 41
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/ClrPropertyViewModel.cs

64
src/Avalonia.Diagnostics/Diagnostics/ViewModels/AvaloniaPropertyViewModel.cs

@ -1,13 +1,17 @@
using System;
using Avalonia.Data;
using Avalonia.Media;
namespace Avalonia.Diagnostics.ViewModels
{
internal class AvaloniaPropertyViewModel : PropertyViewModel
{
private readonly AvaloniaObject _target;
private System.Type _assignedType;
private Type _assignedType;
private object? _value;
private string _priority;
private string _group;
private readonly System.Type _propertyType;
private readonly Type _propertyType;
#nullable disable
// Remove "nullable disable" after MemberNotNull will work on our CI.
@ -28,13 +32,9 @@ namespace Avalonia.Diagnostics.ViewModels
public AvaloniaProperty Property { get; }
public override object Key => Property;
public override string Name { get; }
public override bool? IsAttached =>
Property.IsAttached;
public override string Priority =>
_priority;
public override System.Type AssignedType => _assignedType;
public override bool? IsAttached => Property.IsAttached;
public override string Priority => _priority;
public override Type AssignedType => _assignedType;
public override string? Value
{
@ -53,30 +53,58 @@ namespace Avalonia.Diagnostics.ViewModels
public override string Group => _group;
public override System.Type? DeclaringType { get; }
public override System.Type PropertyType => _propertyType;
public override Type? DeclaringType { get; }
public override Type PropertyType => _propertyType;
// [MemberNotNull(nameof(_type), nameof(_group), nameof(_priority))]
public override void Update()
{
if (Property.IsDirect)
{
RaiseAndSetIfChanged(ref _value, _target.GetValue(Property), nameof(Value));
RaiseAndSetIfChanged(ref _assignedType,_value?.GetType() ?? Property.PropertyType, nameof(AssignedType));
object? value;
Type? valueType = null;
try
{
value = _target.GetValue(Property);
valueType = value?.GetType();
}
catch (Exception e)
{
value = e.GetBaseException();
}
RaiseAndSetIfChanged(ref _value, value, nameof(Value));
RaiseAndSetIfChanged(ref _assignedType, valueType ?? Property.PropertyType, nameof(AssignedType));
RaiseAndSetIfChanged(ref _priority, "Direct", nameof(Priority));
_group = "Properties";
}
else
{
var val = _target.GetDiagnostic(Property);
object? value;
Type? valueType = null;
BindingPriority? priority = null;
try
{
var diag = _target.GetDiagnostic(Property);
value = diag.Value;
valueType = value?.GetType();
priority = diag.Priority;
}
catch (Exception e)
{
value = e.GetBaseException();
}
RaiseAndSetIfChanged(ref _value, val?.Value, nameof(Value));
RaiseAndSetIfChanged(ref _assignedType, _value?.GetType() ?? Property.PropertyType, nameof(AssignedType));
RaiseAndSetIfChanged(ref _value, value, nameof(Value));
RaiseAndSetIfChanged(ref _assignedType, valueType ?? Property.PropertyType, nameof(AssignedType));
if (val != null)
if (priority != null)
{
RaiseAndSetIfChanged(ref _priority, val.Priority.ToString(), nameof(Priority));
RaiseAndSetIfChanged(ref _priority, priority.ToString()!, nameof(Priority));
RaiseAndSetIfChanged(ref _group, IsAttached == true ? "Attached Properties" : "Properties", nameof(Group));
}
else

41
src/Avalonia.Diagnostics/Diagnostics/ViewModels/ClrPropertyViewModel.cs

@ -1,13 +1,15 @@
using System.Reflection;
using System;
using System.Reflection;
using Avalonia.Media;
namespace Avalonia.Diagnostics.ViewModels
{
internal class ClrPropertyViewModel : PropertyViewModel
{
private readonly object _target;
private System.Type _assignedType;
private Type _assignedType;
private object? _value;
private readonly System.Type _propertyType;
private readonly Type _propertyType;
#nullable disable
// Remove "nullable disable" after MemberNotNull will work on our CI.
@ -25,6 +27,7 @@ namespace Avalonia.Diagnostics.ViewModels
{
Name = property.DeclaringType.Name + '.' + property.Name;
}
DeclaringType = property.DeclaringType;
_propertyType = property.PropertyType;
@ -36,10 +39,10 @@ namespace Avalonia.Diagnostics.ViewModels
public override string Name { get; }
public override string Group => "CLR Properties";
public override System.Type AssignedType => _assignedType;
public override System.Type PropertyType => _propertyType;
public override Type AssignedType => _assignedType;
public override Type PropertyType => _propertyType;
public override string? Value
public override string? Value
{
get => ConvertToString(_value);
set
@ -54,20 +57,30 @@ namespace Avalonia.Diagnostics.ViewModels
}
}
public override string Priority =>
string.Empty;
public override string Priority => string.Empty;
public override bool? IsAttached =>
default;
public override bool? IsAttached => default;
public override System.Type? DeclaringType { get; }
public override Type? DeclaringType { get; }
// [MemberNotNull(nameof(_type))]
public override void Update()
{
var val = Property.GetValue(_target);
RaiseAndSetIfChanged(ref _value, val, nameof(Value));
RaiseAndSetIfChanged(ref _assignedType, _value?.GetType() ?? Property.PropertyType, nameof(AssignedType));
object? value;
Type? valueType = null;
try
{
value = Property.GetValue(_target);
valueType = value?.GetType();
}
catch (Exception e)
{
value = e.GetBaseException();
}
RaiseAndSetIfChanged(ref _value, value, nameof(Value));
RaiseAndSetIfChanged(ref _assignedType, valueType ?? Property.PropertyType, nameof(AssignedType));
RaisePropertyChanged(nameof(Type));
}
}

Loading…
Cancel
Save