Skip to content

Commit df8aa54

Browse files
[X] Fix TargetType simplification bug (#21764)
* Add unit test * Simplify TargetType=x:Type before setting resources
1 parent 5d33bf3 commit df8aa54

File tree

4 files changed

+75
-3
lines changed

4 files changed

+75
-3
lines changed

src/Controls/src/Build.Tasks/XamlCTask.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,8 +364,8 @@ bool TryCoreCompile(MethodDefinition initComp, ILRootNode rootnode, string xamlF
364364
rootnode.Accept(new CreateObjectVisitor(visitorContext), null);
365365
rootnode.Accept(new SetNamescopesAndRegisterNamesVisitor(visitorContext), null);
366366
rootnode.Accept(new SetFieldVisitor(visitorContext), null);
367-
rootnode.Accept(new SetResourcesVisitor(visitorContext), null);
368367
rootnode.Accept(new SimplifyTypeExtensionVisitor(), null);
368+
rootnode.Accept(new SetResourcesVisitor(visitorContext), null);
369369
rootnode.Accept(new SetPropertiesVisitor(visitorContext, true), null);
370370

371371
il.Emit(Ret);

src/Controls/src/Xaml/XamlLoader.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ public static IResourceDictionary LoadResources(string xaml, IResourcesProvider
187187
resources.Accept(new NamescopingVisitor(visitorContext), null); //set namescopes for {x:Reference}
188188
resources.Accept(new CreateValuesVisitor(visitorContext), null);
189189
resources.Accept(new RegisterXNamesVisitor(visitorContext), null);
190-
resources.Accept(new FillResourceDictionariesVisitor(visitorContext), null);
191190
resources.Accept(new SimplifyTypeExtensionVisitor(), null);
191+
resources.Accept(new FillResourceDictionariesVisitor(visitorContext), null);
192192
resources.Accept(new ApplyPropertiesVisitor(visitorContext, true), null);
193193

194194
return visitorContext.Values[resources] as IResourceDictionary;
@@ -207,8 +207,8 @@ static void Visit(RootNode rootnode, HydrationContext visitorContext, bool useDe
207207
rootnode.Accept(new NamescopingVisitor(visitorContext), null); //set namescopes for {x:Reference}
208208
rootnode.Accept(new CreateValuesVisitor(visitorContext), null);
209209
rootnode.Accept(new RegisterXNamesVisitor(visitorContext), null);
210-
rootnode.Accept(new FillResourceDictionariesVisitor(visitorContext), null);
211210
rootnode.Accept(new SimplifyTypeExtensionVisitor(), null);
211+
rootnode.Accept(new FillResourceDictionariesVisitor(visitorContext), null);
212212
rootnode.Accept(new ApplyPropertiesVisitor(visitorContext, true), null);
213213
}
214214

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ResourceDictionary xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
4+
x:Class="Microsoft.Maui.Controls.Xaml.UnitTests.Maui21757">
5+
<Color x:Key="Gray-200">#C8C8C8</Color>
6+
<Style x:Key="A" TargetType="BoxView">
7+
<Setter Property="Color" Value="{StaticResource Gray-200}" />
8+
</Style>
9+
<Style x:Key="B" TargetType="{x:Type BoxView}">
10+
<Setter Property="Color" Value="{StaticResource Gray-200}" />
11+
</Style>
12+
</ResourceDictionary>
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics;
4+
using System.Globalization;
5+
using System.Linq;
6+
using Microsoft.Maui.ApplicationModel;
7+
using Microsoft.Maui.Controls.Core.UnitTests;
8+
using Microsoft.Maui.Controls.Shapes;
9+
using Microsoft.Maui.Devices;
10+
using Microsoft.Maui.Dispatching;
11+
12+
using Microsoft.Maui.Graphics;
13+
using Microsoft.Maui.UnitTests;
14+
using NUnit.Framework;
15+
16+
namespace Microsoft.Maui.Controls.Xaml.UnitTests;
17+
18+
public partial class Maui21757
19+
{
20+
public Maui21757()
21+
{
22+
InitializeComponent();
23+
}
24+
25+
public Maui21757(bool useCompiledXaml)
26+
{
27+
//this stub will be replaced at compile time
28+
}
29+
30+
[TestFixture]
31+
class Test
32+
{
33+
[SetUp]
34+
public void Setup()
35+
{
36+
Application.SetCurrentApplication(new MockApplication());
37+
DispatcherProvider.SetCurrent(new DispatcherProviderStub());
38+
}
39+
40+
[TearDown] public void TearDown() => AppInfo.SetCurrent(null);
41+
42+
[Test]
43+
public void TypeLiteralAndXTypeCanBeUsedInterchangeably([Values(false, true)] bool useCompiledXaml)
44+
{
45+
var resourceDictionary = new Maui21757(useCompiledXaml);
46+
47+
var styleA = resourceDictionary["A"] as Style;
48+
Assert.NotNull(styleA);
49+
Assert.That(styleA.TargetType, Is.EqualTo(typeof(BoxView)));
50+
Assert.That(styleA.Setters[0].Property, Is.EqualTo(BoxView.ColorProperty));
51+
Assert.That(styleA.Setters[0].Value, Is.EqualTo(Color.FromArgb("#C8C8C8")));
52+
53+
var styleB = resourceDictionary["B"] as Style;
54+
Assert.NotNull(styleB);
55+
Assert.That(styleB.TargetType, Is.EqualTo(typeof(BoxView)));
56+
Assert.That(styleB.Setters[0].Property, Is.EqualTo(BoxView.ColorProperty));
57+
Assert.That(styleB.Setters[0].Value, Is.EqualTo(Color.FromArgb("#C8C8C8")));
58+
}
59+
}
60+
}

0 commit comments

Comments
 (0)