Browse Source

Fix nits.

pull/1667/head
Jeremy Koritzinsky 8 years ago
parent
commit
f6fc30665e
  1. 85
      src/Avalonia.Base/Data/Core/ExpressionObserver.cs
  2. 32
      src/Avalonia.Base/Data/Core/IndexerExpressionNode.cs
  3. 11
      src/Avalonia.Base/Data/Core/Parsers/ExpressionTreeParser.cs
  4. 10
      src/Avalonia.Base/Data/Core/Parsers/ExpressionVisitorNodeBuilder.cs

85
src/Avalonia.Base/Data/Core/ExpressionObserver.cs

@ -82,24 +82,6 @@ namespace Avalonia.Data.Core
_root = new WeakReference(root);
}
/// <summary>
/// Creates a new instance of the <see cref="ExpressionObserver"/> class.
/// </summary>
/// <param name="root">The root object.</param>
/// <param name="expression">The expression.</param>
/// <param name="enableDataValidation">Whether or not to track data validation</param>
/// <param name="description">
/// A description of the expression. If null, <paramref name="expression"/>'s string representation will be used.
/// </param>
public static ExpressionObserver Create<T, U>(
T root,
Expression<Func<T, U>> expression,
bool enableDataValidation = false,
string description = null)
{
return new ExpressionObserver(root, Parse(expression, enableDataValidation), description ?? expression.ToString());
}
/// <summary>
/// Initializes a new instance of the <see cref="ExpressionObserver"/> class.
/// </summary>
@ -119,29 +101,6 @@ namespace Avalonia.Data.Core
Description = description;
_root = rootObservable;
}
/// <summary>
/// Creates a new instance of the <see cref="ExpressionObserver"/> class.
/// </summary>
/// <param name="rootObservable">An observable which provides the root object.</param>
/// <param name="expression">The expression.</param>
/// <param name="enableDataValidation">Whether or not to track data validation</param>
/// <param name="description">
/// A description of the expression. If null, <paramref name="expression"/>'s string representation will be used.
/// </param>
public static ExpressionObserver Create<T, U>(
IObservable<T> rootObservable,
Expression<Func<T, U>> expression,
bool enableDataValidation = false,
string description = null)
{
Contract.Requires<ArgumentNullException>(rootObservable != null);
return new ExpressionObserver(
rootObservable.Select(o => (object)o),
Parse(expression, enableDataValidation),
description ?? expression.ToString());
}
/// <summary>
/// Initializes a new instance of the <see cref="ExpressionObserver"/> class.
@ -166,6 +125,47 @@ namespace Avalonia.Data.Core
_root = update.Select(x => rootGetter());
}
/// <summary>
/// Creates a new instance of the <see cref="ExpressionObserver"/> class.
/// </summary>
/// <param name="root">The root object.</param>
/// <param name="expression">The expression.</param>
/// <param name="enableDataValidation">Whether or not to track data validation</param>
/// <param name="description">
/// A description of the expression. If null, <paramref name="expression"/>'s string representation will be used.
/// </param>
public static ExpressionObserver Create<T, U>(
T root,
Expression<Func<T, U>> expression,
bool enableDataValidation = false,
string description = null)
{
return new ExpressionObserver(root, Parse(expression, enableDataValidation), description ?? expression.ToString());
}
/// <summary>
/// Creates a new instance of the <see cref="ExpressionObserver"/> class.
/// </summary>
/// <param name="rootObservable">An observable which provides the root object.</param>
/// <param name="expression">The expression.</param>
/// <param name="enableDataValidation">Whether or not to track data validation</param>
/// <param name="description">
/// A description of the expression. If null, <paramref name="expression"/>'s string representation will be used.
/// </param>
public static ExpressionObserver Create<T, U>(
IObservable<T> rootObservable,
Expression<Func<T, U>> expression,
bool enableDataValidation = false,
string description = null)
{
Contract.Requires<ArgumentNullException>(rootObservable != null);
return new ExpressionObserver(
rootObservable.Select(o => (object)o),
Parse(expression, enableDataValidation),
description ?? expression.ToString());
}
/// <summary>
/// Creates a new instance of the <see cref="ExpressionObserver"/> class.
/// </summary>
@ -278,8 +278,7 @@ namespace Avalonia.Data.Core
private static ExpressionNode Parse(LambdaExpression expression, bool enableDataValidation)
{
var parser = new ExpressionTreeParser(enableDataValidation);
return parser.Parse(expression);
return ExpressionTreeParser.Parse(expression, enableDataValidation);
}
private void StartRoot()

32
src/Avalonia.Base/Data/Core/IndexerExpressionNode.cs

@ -10,35 +10,35 @@ namespace Avalonia.Data.Core
{
class IndexerExpressionNode : IndexerNodeBase
{
private readonly ParameterExpression parameter;
private readonly IndexExpression expression;
private readonly Delegate setDelegate;
private readonly Delegate getDelegate;
private readonly Delegate firstArgumentDelegate;
private readonly ParameterExpression _parameter;
private readonly IndexExpression _expression;
private readonly Delegate _setDelegate;
private readonly Delegate _getDelegate;
private readonly Delegate _firstArgumentDelegate;
public IndexerExpressionNode(IndexExpression expression)
{
parameter = Expression.Parameter(expression.Object.Type);
this.expression = expression.Update(parameter, expression.Arguments);
_parameter = Expression.Parameter(expression.Object.Type);
_expression = expression.Update(_parameter, expression.Arguments);
getDelegate = Expression.Lambda(this.expression, parameter).Compile();
_getDelegate = Expression.Lambda(_expression, _parameter).Compile();
var valueParameter = Expression.Parameter(expression.Type);
setDelegate = Expression.Lambda(Expression.Assign(this.expression, valueParameter), parameter, valueParameter).Compile();
_setDelegate = Expression.Lambda(Expression.Assign(_expression, valueParameter), _parameter, valueParameter).Compile();
firstArgumentDelegate = Expression.Lambda(this.expression.Arguments[0], parameter).Compile();
_firstArgumentDelegate = Expression.Lambda(_expression.Arguments[0], _parameter).Compile();
}
public override Type PropertyType => expression.Type;
public override Type PropertyType => _expression.Type;
public override string Description => expression.ToString();
public override string Description => _expression.ToString();
protected override bool SetTargetValueCore(object value, BindingPriority priority)
{
try
{
setDelegate.DynamicInvoke(Target.Target, value);
_setDelegate.DynamicInvoke(Target.Target, value);
return true;
}
catch (Exception)
@ -51,7 +51,7 @@ namespace Avalonia.Data.Core
{
try
{
return getDelegate.DynamicInvoke(target);
return _getDelegate.DynamicInvoke(target);
}
catch (TargetInvocationException e) when (e.InnerException is ArgumentOutOfRangeException
|| e.InnerException is IndexOutOfRangeException
@ -63,9 +63,9 @@ namespace Avalonia.Data.Core
protected override bool ShouldUpdate(object sender, PropertyChangedEventArgs e)
{
return expression.Indexer == null || expression.Indexer.Name == e.PropertyName;
return _expression.Indexer == null || _expression.Indexer.Name == e.PropertyName;
}
protected override int? TryGetFirstArgumentAsInt() => firstArgumentDelegate.DynamicInvoke(Target.Target) as int?;
protected override int? TryGetFirstArgumentAsInt() => _firstArgumentDelegate.DynamicInvoke(Target.Target) as int?;
}
}

11
src/Avalonia.Base/Data/Core/Parsers/ExpressionTreeParser.cs

@ -6,16 +6,9 @@ using System.Text;
namespace Avalonia.Data.Core.Parsers
{
class ExpressionTreeParser
static class ExpressionTreeParser
{
private readonly bool enableDataValidation;
public ExpressionTreeParser(bool enableDataValidation)
{
this.enableDataValidation = enableDataValidation;
}
public ExpressionNode Parse(Expression expr)
public static ExpressionNode Parse(Expression expr, bool enableDataValidation)
{
var visitor = new ExpressionVisitorNodeBuilder(enableDataValidation);

10
src/Avalonia.Base/Data/Core/Parsers/ExpressionVisitorNodeBuilder.cs

@ -14,7 +14,7 @@ namespace Avalonia.Data.Core.Parsers
private static PropertyInfo AvaloniaObjectIndexer;
private static MethodInfo CreateDelegateMethod;
private readonly bool enableDataValidation;
private readonly bool _enableDataValidation;
static ExpressionVisitorNodeBuilder()
{
@ -26,7 +26,7 @@ namespace Avalonia.Data.Core.Parsers
public ExpressionVisitorNodeBuilder(bool enableDataValidation)
{
this.enableDataValidation = enableDataValidation;
_enableDataValidation = enableDataValidation;
Nodes = new List<ExpressionNode>();
}
@ -62,7 +62,7 @@ namespace Avalonia.Data.Core.Parsers
protected override Expression VisitMember(MemberExpression node)
{
var visited = base.VisitMember(node);
Nodes.Add(new PropertyAccessorNode(node.Member.Name, enableDataValidation));
Nodes.Add(new PropertyAccessorNode(node.Member.Name, _enableDataValidation));
return visited;
}
@ -73,7 +73,7 @@ namespace Avalonia.Data.Core.Parsers
if (node.Indexer == AvaloniaObjectIndexer)
{
var property = GetArgumentExpressionValue<AvaloniaProperty>(node.Arguments[0]);
Nodes.Add(new AvaloniaPropertyAccessorNode(property, enableDataValidation));
Nodes.Add(new AvaloniaPropertyAccessorNode(property, _enableDataValidation));
}
else
{
@ -164,7 +164,7 @@ namespace Avalonia.Data.Core.Parsers
if (node.Method == CreateDelegateMethod)
{
var visited = Visit(node.Arguments[1]);
Nodes.Add(new PropertyAccessorNode(GetArgumentExpressionValue<MethodInfo>(node.Object).Name, enableDataValidation));
Nodes.Add(new PropertyAccessorNode(GetArgumentExpressionValue<MethodInfo>(node.Object).Name, _enableDataValidation));
return node;
}
else if (node.Method.Name == StreamBindingExtensions.StreamBindingName || node.Method.Name.StartsWith(StreamBindingExtensions.StreamBindingName + '`'))

Loading…
Cancel
Save