diff --git a/src/Avalonia.Base/Styling/ChildSelector.cs b/src/Avalonia.Base/Styling/ChildSelector.cs index 9512dc34df..a6093bf026 100644 --- a/src/Avalonia.Base/Styling/ChildSelector.cs +++ b/src/Avalonia.Base/Styling/ChildSelector.cs @@ -27,11 +27,11 @@ namespace Avalonia.Styling /// public override Type? TargetType => null; - public override string ToString() + public override string ToString(Style? owner) { if (_selectorString == null) { - _selectorString = _parent.ToString() + " > "; + _selectorString = _parent.ToString(owner) + " > "; } return _selectorString; diff --git a/src/Avalonia.Base/Styling/ControlTheme.cs b/src/Avalonia.Base/Styling/ControlTheme.cs index 8fd94297b6..46a3267f70 100644 --- a/src/Avalonia.Base/Styling/ControlTheme.cs +++ b/src/Avalonia.Base/Styling/ControlTheme.cs @@ -52,13 +52,7 @@ namespace Avalonia.Styling return result; } - public override string ToString() - { - if (TargetType is not null) - return "ControlTheme: " + TargetType.Name; - else - return "ControlTheme"; - } + public override string ToString() => TargetType?.Name ?? "ControlTheme"; internal override void SetParent(StyleBase? parent) { diff --git a/src/Avalonia.Base/Styling/DescendentSelector.cs b/src/Avalonia.Base/Styling/DescendentSelector.cs index 677a924189..728dd08301 100644 --- a/src/Avalonia.Base/Styling/DescendentSelector.cs +++ b/src/Avalonia.Base/Styling/DescendentSelector.cs @@ -25,11 +25,11 @@ namespace Avalonia.Styling /// public override Type? TargetType => null; - public override string ToString() + public override string ToString(Style? owner) { if (_selectorString == null) { - _selectorString = _parent.ToString() + ' '; + _selectorString = _parent.ToString(owner) + ' '; } return _selectorString; diff --git a/src/Avalonia.Base/Styling/NestingSelector.cs b/src/Avalonia.Base/Styling/NestingSelector.cs index 77c5b719c6..dd627a7db9 100644 --- a/src/Avalonia.Base/Styling/NestingSelector.cs +++ b/src/Avalonia.Base/Styling/NestingSelector.cs @@ -11,7 +11,7 @@ namespace Avalonia.Styling public override bool IsCombinator => false; public override Type? TargetType => null; - public override string ToString() => "^"; + public override string ToString(Style? owner) => owner?.Parent?.ToString() ?? "^"; protected override SelectorMatch Evaluate(IStyleable control, IStyle? parent, bool subscribe) { diff --git a/src/Avalonia.Base/Styling/NotSelector.cs b/src/Avalonia.Base/Styling/NotSelector.cs index c7727bb6b8..4491762b8f 100644 --- a/src/Avalonia.Base/Styling/NotSelector.cs +++ b/src/Avalonia.Base/Styling/NotSelector.cs @@ -35,11 +35,11 @@ namespace Avalonia.Styling public override Type? TargetType => _previous?.TargetType; /// - public override string ToString() + public override string ToString(Style? owner) { if (_selectorString == null) { - _selectorString = $"{_previous?.ToString()}:not({_argument})"; + _selectorString = $"{_previous?.ToString(owner)}:not({_argument})"; } return _selectorString; diff --git a/src/Avalonia.Base/Styling/NthChildSelector.cs b/src/Avalonia.Base/Styling/NthChildSelector.cs index f473791664..f772f58c42 100644 --- a/src/Avalonia.Base/Styling/NthChildSelector.cs +++ b/src/Avalonia.Base/Styling/NthChildSelector.cs @@ -107,10 +107,10 @@ namespace Avalonia.Styling protected override Selector? MovePrevious() => _previous; protected override Selector? MovePreviousOrParent() => _previous; - public override string ToString() + public override string ToString(Style? owner) { var expectedCapacity = NthLastChildSelectorName.Length + 8; - var stringBuilder = new StringBuilder(_previous?.ToString(), expectedCapacity); + var stringBuilder = new StringBuilder(_previous?.ToString(owner), expectedCapacity); stringBuilder.Append(':'); stringBuilder.Append(_reversed ? NthLastChildSelectorName : NthChildSelectorName); diff --git a/src/Avalonia.Base/Styling/OrSelector.cs b/src/Avalonia.Base/Styling/OrSelector.cs index af9249864f..0c48b76ded 100644 --- a/src/Avalonia.Base/Styling/OrSelector.cs +++ b/src/Avalonia.Base/Styling/OrSelector.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Avalonia.Styling.Activators; #nullable enable @@ -55,11 +56,11 @@ namespace Avalonia.Styling } /// - public override string ToString() + public override string ToString(Style? owner) { if (_selectorString == null) { - _selectorString = string.Join(", ", _selectors); + _selectorString = string.Join(", ", _selectors.Select(x => x.ToString(owner))); } return _selectorString; diff --git a/src/Avalonia.Base/Styling/PropertyEqualsSelector.cs b/src/Avalonia.Base/Styling/PropertyEqualsSelector.cs index 48136ba2de..3e50ee5522 100644 --- a/src/Avalonia.Base/Styling/PropertyEqualsSelector.cs +++ b/src/Avalonia.Base/Styling/PropertyEqualsSelector.cs @@ -38,7 +38,7 @@ namespace Avalonia.Styling public override Type? TargetType => _previous?.TargetType; /// - public override string ToString() + public override string ToString(Style? owner) { if (_selectorString == null) { @@ -46,7 +46,7 @@ namespace Avalonia.Styling if (_previous != null) { - builder.Append(_previous.ToString()); + builder.Append(_previous.ToString(owner)); } builder.Append('['); diff --git a/src/Avalonia.Base/Styling/Selector.cs b/src/Avalonia.Base/Styling/Selector.cs index 7ce17518dd..7f5ee48351 100644 --- a/src/Avalonia.Base/Styling/Selector.cs +++ b/src/Avalonia.Base/Styling/Selector.cs @@ -67,6 +67,15 @@ namespace Avalonia.Styling return match; } + public override string ToString() => ToString(null); + + /// + /// Gets a string representing the selector, with the nesting separator (`^`) replaced with + /// the parent selector. + /// + /// The owner style. + public abstract string ToString(Style? owner); + /// /// Evaluates the selector for a match. /// diff --git a/src/Avalonia.Base/Styling/Style.cs b/src/Avalonia.Base/Styling/Style.cs index 9f8b290132..913c437bc4 100644 --- a/src/Avalonia.Base/Styling/Style.cs +++ b/src/Avalonia.Base/Styling/Style.cs @@ -68,17 +68,7 @@ namespace Avalonia.Styling /// Returns a string representation of the style. /// /// A string representation of the style. - public override string ToString() - { - if (Selector != null) - { - return "Style: " + Selector.ToString(); - } - else - { - return "Style"; - } - } + public override string ToString() => Selector?.ToString(this) ?? "Style"; internal override void SetParent(StyleBase? parent) { diff --git a/src/Avalonia.Base/Styling/TemplateSelector.cs b/src/Avalonia.Base/Styling/TemplateSelector.cs index 278e24a203..82d934ee34 100644 --- a/src/Avalonia.Base/Styling/TemplateSelector.cs +++ b/src/Avalonia.Base/Styling/TemplateSelector.cs @@ -26,11 +26,11 @@ namespace Avalonia.Styling /// public override Type? TargetType => null; - public override string ToString() + public override string ToString(Style? owner) { if (_selectorString == null) { - _selectorString = _parent.ToString() + " /template/ "; + _selectorString = _parent.ToString(owner) + " /template/ "; } return _selectorString; diff --git a/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs b/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs index 94a6db41f6..8e45e1770e 100644 --- a/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs +++ b/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs @@ -84,11 +84,11 @@ namespace Avalonia.Styling public IList Classes => _classes.Value; /// - public override string ToString() + public override string ToString(Style? owner) { if (_selectorString == null) { - _selectorString = BuildSelectorString(); + _selectorString = BuildSelectorString(owner); } return _selectorString; @@ -143,13 +143,13 @@ namespace Avalonia.Styling protected override Selector? MovePrevious() => _previous; protected override Selector? MovePreviousOrParent() => _previous; - private string BuildSelectorString() + private string BuildSelectorString(Style? owner) { var builder = new StringBuilder(); if (_previous != null) { - builder.Append(_previous.ToString()); + builder.Append(_previous.ToString(owner)); } if (TargetType != null)