Browse Source
Do not resolve markup extensions when resolving selector types (#20903)
* Do not resolve markup extensions when resolving selector types
* Added commen
* Added unit test
pull/17825/merge
Compunet
1 week ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with
28 additions and
1 deletions
-
src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs
-
tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs
-
tests/Avalonia.Markup.Xaml.UnitTests/Xaml/TestSelectorControl.cs
|
|
@ -209,8 +209,10 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers |
|
|
throw new XamlSelectorsTransformException("Unable to parse selector: " + e.Message, node, e); |
|
|
throw new XamlSelectorsTransformException("Unable to parse selector: " + e.Message, node, e); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Selectors should resolve control types only.
|
|
|
|
|
|
// isMarkupExtension = false to prevent resolving selector types to XExtension.
|
|
|
var selector = Create(parsed, (p, n) |
|
|
var selector = Create(parsed, (p, n) |
|
|
=> TypeReferenceResolver.ResolveType(context, $"{p}:{n}", true, node, true)); |
|
|
=> TypeReferenceResolver.ResolveType(context, $"{p}:{n}", false, node, true)); |
|
|
pn.Values[0] = selector; |
|
|
pn.Values[0] = selector; |
|
|
|
|
|
|
|
|
var templateType = GetLastTemplateTypeFromSelector(selector); |
|
|
var templateType = GetLastTemplateTypeFromSelector(selector); |
|
|
|
|
|
@ -788,5 +788,25 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml |
|
|
|
|
|
|
|
|
Assert.Equal("Cannot add a Style without selector to a ControlTheme. Line 5, position 14.", exception.Message); |
|
|
Assert.Equal("Cannot add a Style without selector to a ControlTheme. Line 5, position 14.", exception.Message); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[Fact] |
|
|
|
|
|
public void Selector_Should_Not_Resolve_To_MarkupExtension_Type() |
|
|
|
|
|
{ |
|
|
|
|
|
using var _ = UnitTestApplication.Start(TestServices.StyledWindow); |
|
|
|
|
|
|
|
|
|
|
|
var style = (Style)AvaloniaRuntimeXamlLoader.Load( |
|
|
|
|
|
$"""
|
|
|
|
|
|
<Style xmlns='https://github.com/avaloniaui'
|
|
|
|
|
|
xmlns:u='using:Avalonia.Markup.Xaml.UnitTests.Xaml' |
|
|
|
|
|
Selector='u|TestSelectorControl'> |
|
|
|
|
|
</Style> |
|
|
|
|
|
""");
|
|
|
|
|
|
|
|
|
|
|
|
Assert.NotNull(style.Selector); |
|
|
|
|
|
|
|
|
|
|
|
var targetType = style.Selector.TargetType; |
|
|
|
|
|
|
|
|
|
|
|
Assert.NotEqual(typeof(TestSelectorControlExtension), targetType); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
@ -0,0 +1,5 @@ |
|
|
|
|
|
namespace Avalonia.Markup.Xaml.UnitTests.Xaml; |
|
|
|
|
|
|
|
|
|
|
|
public class TestSelectorControl; |
|
|
|
|
|
|
|
|
|
|
|
public class TestSelectorControlExtension; |