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
parent
commit
12b7a5615a
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs
  2. 20
      tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs
  3. 5
      tests/Avalonia.Markup.Xaml.UnitTests/Xaml/TestSelectorControl.cs

4
src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.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);

20
tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs

@ -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);
}
} }
} }

5
tests/Avalonia.Markup.Xaml.UnitTests/Xaml/TestSelectorControl.cs

@ -0,0 +1,5 @@
namespace Avalonia.Markup.Xaml.UnitTests.Xaml;
public class TestSelectorControl;
public class TestSelectorControlExtension;
Loading…
Cancel
Save