Skip to content

Commit 68524c8

Browse files
[X] Ignore Parent DataType on collection (#24530)
* [X] Ignore Parent DataType on collection Picker.ItemDisplayBinding for example shouldn't inherit parent DataType - fixes #23989 * fixtrimming * suppresswarning * Update src/TestUtils/src/Microsoft.Maui.IntegrationTests/Utilities/BuildWarningsUtilities.cs
1 parent 7005a68 commit 68524c8

File tree

3 files changed

+58
-6
lines changed

3 files changed

+58
-6
lines changed

src/Controls/src/Xaml/XamlServiceProvider.cs

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
22
using System.Collections.Generic;
33
using System.ComponentModel;
4+
using System.Diagnostics.CodeAnalysis;
5+
using System.Linq;
46
using System.Reflection;
57
using System.Xml;
68
using Microsoft.Maui.Controls.Internals;
@@ -29,7 +31,7 @@ internal XamlServiceProvider(INode node, HydrationContext context)
2931
IValueConverterProvider = new ValueConverterProvider();
3032

3133
if (node is IElementNode elementNode)
32-
Add(typeof(IXamlDataTypeProvider), new XamlDataTypeProvider(elementNode));
34+
Add(typeof(IXamlDataTypeProvider), new XamlDataTypeProvider(elementNode, context));
3335
}
3436

3537
public XamlServiceProvider() => IValueConverterProvider = new ValueConverterProvider();
@@ -268,8 +270,15 @@ public string LookupNamespace(string prefix)
268270

269271
class XamlDataTypeProvider : IXamlDataTypeProvider
270272
{
271-
public XamlDataTypeProvider(IElementNode node)
273+
[RequiresUnreferencedCode("XamlDataTypeProvider is not trim and AOT-compatible.")]
274+
#if !NETSTANDARD
275+
[RequiresDynamicCode("XamlDataTypeProvider is not trim and AOT-compatible.")]
276+
#endif
277+
public XamlDataTypeProvider(IElementNode node, HydrationContext context)
272278
{
279+
Context = context;
280+
281+
273282
static IElementNode GetParent(IElementNode node)
274283
{
275284
return node switch
@@ -289,6 +298,21 @@ static bool IsBindingContextBinding(IElementNode node)
289298
return false;
290299
}
291300

301+
static bool IsBindingBaseProperty(IElementNode node, HydrationContext context)
302+
{
303+
if ( ApplyPropertiesVisitor.TryGetPropertyName(node, node.Parent, out XmlName name)
304+
&& node.Parent is IElementNode parent
305+
&& XamlParser.GetElementType(parent.XmlType,
306+
new XmlLineInfo(((IXmlLineInfo)node).LineNumber, ((IXmlLineInfo)node).LinePosition),
307+
context.RootElement.GetType().Assembly, out var xpe) is Type parentType
308+
&& parentType.GetRuntimeProperties().FirstOrDefault(p => p.Name == name.LocalName) is PropertyInfo propertyInfo
309+
&& propertyInfo.PropertyType == typeof(BindingBase))
310+
{
311+
return true;
312+
}
313+
return false;
314+
}
315+
292316
INode dataTypeNode = null;
293317
IElementNode n = node as IElementNode;
294318

@@ -305,17 +329,21 @@ static bool IsBindingContextBinding(IElementNode node)
305329

306330
while (n != null)
307331
{
332+
308333
if (n != skipNode && n.Properties.TryGetValue(XmlName.xDataType, out dataTypeNode))
309334
{
310335
break;
311336
}
312-
337+
if (IsBindingBaseProperty(n, context))
338+
{
339+
break;
340+
}
313341
n = GetParent(n);
314342
}
315343
if (dataTypeNode is ValueNode valueNode)
316344
BindingDataType = valueNode.Value as string;
317-
318345
}
319346
public string BindingDataType { get; }
347+
public HydrationContext Context { get; }
320348
}
321-
}
349+
}

src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<AssemblyName>Microsoft.Maui.Controls.Xaml.UnitTests</AssemblyName>
77
<WarningLevel>4</WarningLevel>
88
<NoWarn>$(NoWarn);0672;0219;0414;CS0436;CS0618</NoWarn>
9-
<WarningsNotAsErrors>$(WarningsNotAsErrors);XC0618;XC0022,XC0023</WarningsNotAsErrors>
9+
<WarningsNotAsErrors>$(WarningsNotAsErrors);XC0618;XC0022;XC0023</WarningsNotAsErrors>
1010
<IsPackable>false</IsPackable>
1111
<DisableMSBuildAssemblyCopyCheck>true</DisableMSBuildAssemblyCopyCheck>
1212
</PropertyGroup>

src/TestUtils/src/Microsoft.Maui.IntegrationTests/Utilities/BuildWarningsUtilities.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,30 @@ public static void AssertWarnings(this List<WarningsPerFile> actualWarnings, Lis
454454
},
455455
}
456456
},
457+
new WarningsPerFile
458+
{
459+
File = "src/Controls/src/Xaml/XamlServiceProvider.cs",
460+
WarningsPerCode = new List<WarningsPerCode>
461+
{
462+
new WarningsPerCode
463+
{
464+
Code = "IL2026",
465+
Messages = new List<string>
466+
{
467+
"Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider.XamlServiceProvider(INode,HydrationContext): Using member 'Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider.XamlDataTypeProvider(IElementNode,HydrationContext)' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. XamlDataTypeProvider is not trim and AOT-compatible.",
468+
}
469+
},
470+
new WarningsPerCode
471+
{
472+
Code = "IL3050",
473+
Messages = new List<string>
474+
{
475+
"Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider.XamlServiceProvider(INode,HydrationContext): Using member 'Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider.XamlDataTypeProvider(IElementNode,HydrationContext)' which has 'RequiresDynamicCodeAttribute' can break functionality when AOT compiling. XamlDataTypeProvider is not trim and AOT-compatible.",
476+
}
477+
},
478+
479+
}
480+
},
457481
};
458482

459483
#region Utility methods for generating the list of expected warnings

0 commit comments

Comments
 (0)