Skip to content

Commit 291fc7b

Browse files
[X] global xmlns
Allow aggregating multiple xmlns into a single new global http://schemas.microsoft.com/dotnet/maui/global using XmlnsDefinition attribute, like this ```csharp [assembly: XmlnsDefinition("http://schemas.microsoft.com/dotnet/maui/global", "http://schemas.microsoft.com/dotnet/2021/maui")] ``` the x: xmlns can not be aggregated, as it serves important purposes for the parsers this also brings #28090 to fix #28150 - fixes #28150 - fixes #28843 - closes #28090
1 parent acd2a94 commit 291fc7b

29 files changed

+905
-77
lines changed

Microsoft.Maui-vscode.sln

Lines changed: 603 additions & 0 deletions
Large diffs are not rendered by default.

src/Controls/docs/Microsoft.Maui.Controls/XmlnsDefinitionAttribute.xml

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
</Docs>
2525
<Members>
2626
<Member MemberName=".ctor">
27-
<MemberSignature Language="C#" Value="public XmlnsDefinitionAttribute (string xmlNamespace, string clrNamespace);" />
28-
<MemberSignature Language="ILAsm" Value=".method public hidebysig specialname rtspecialname instance void .ctor(string xmlNamespace, string clrNamespace) cil managed" />
27+
<MemberSignature Language="C#" Value="public XmlnsDefinitionAttribute (string xmlNamespace, string target);" />
28+
<MemberSignature Language="ILAsm" Value=".method public hidebysig specialname rtspecialname instance void .ctor(string xmlNamespace, string target) cil managed" />
2929
<MemberSignature Language="DocId" Value="M:Microsoft.Maui.Controls.XmlnsDefinitionAttribute.#ctor(System.String,System.String)" />
3030
<MemberSignature Language="F#" Value="new Microsoft.Maui.Controls.XmlnsDefinitionAttribute : string * string -&gt; Microsoft.Maui.Controls.XmlnsDefinitionAttribute" Usage="new Microsoft.Maui.Controls.XmlnsDefinitionAttribute (xmlNamespace, clrNamespace)" />
3131
<MemberType>Constructor</MemberType>
@@ -35,11 +35,11 @@
3535
</AssemblyInfo>
3636
<Parameters>
3737
<Parameter Name="xmlNamespace" Type="System.String" />
38-
<Parameter Name="clrNamespace" Type="System.String" />
38+
<Parameter Name="target" Type="System.String" />
3939
</Parameters>
4040
<Docs>
4141
<param name="xmlNamespace">To be added.</param>
42-
<param name="clrNamespace">To be added.</param>
42+
<param name="target">To be added.</param>
4343
</Docs>
4444
</Member>
4545
<Member MemberName="AssemblyName">
@@ -74,6 +74,22 @@
7474
<Docs>
7575
</Docs>
7676
</Member>
77+
<Member MemberName="Target">
78+
<MemberSignature Language="C#" Value="public string Target { get; }" />
79+
<MemberSignature Language="ILAsm" Value=".property instance string Target" />
80+
<MemberSignature Language="DocId" Value="P:Microsoft.Maui.Controls.XmlnsDefinitionAttribute.ClrNamespace" />
81+
<MemberSignature Language="F#" Value="member this.ClrNamespace : string" Usage="Microsoft.Maui.Controls.XmlnsDefinitionAttribute.Target" />
82+
<MemberType>Property</MemberType>
83+
<AssemblyInfo>
84+
<AssemblyName>Microsoft.Maui.Controls.Core</AssemblyName>
85+
<AssemblyVersion>2.0.0.0</AssemblyVersion>
86+
</AssemblyInfo>
87+
<ReturnValue>
88+
<ReturnType>System.String</ReturnType>
89+
</ReturnValue>
90+
<Docs>
91+
</Docs>
92+
</Member>
7793
<Member MemberName="XmlNamespace">
7894
<MemberSignature Language="C#" Value="public string XmlNamespace { get; }" />
7995
<MemberSignature Language="ILAsm" Value=".property instance string XmlNamespace" />

src/Controls/src/Build.Tasks/XmlTypeExtensions.cs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ namespace Microsoft.Maui.Controls.Build.Tasks
1010
{
1111
static class XmlTypeExtensions
1212
{
13+
static readonly string _xmlnsDefinitionName = typeof(XmlnsDefinitionAttribute).FullName;
14+
1315
static IList<XmlnsDefinitionAttribute> GatherXmlnsDefinitionAttributes(ModuleDefinition module)
1416
{
1517
var xmlnsDefinitions = new List<XmlnsDefinitionAttribute>();
@@ -18,17 +20,12 @@ static IList<XmlnsDefinitionAttribute> GatherXmlnsDefinitionAttributes(ModuleDef
1820
{
1921
// Search for the attribute in the assemblies being
2022
// referenced.
23+
GatherXmlnsDefinitionAttributes(xmlnsDefinitions, module.Assembly, module.Assembly);
24+
2125
foreach (var asmRef in module.AssemblyReferences)
2226
{
2327
var asmDef = module.AssemblyResolver.Resolve(asmRef);
24-
foreach (var ca in asmDef.CustomAttributes)
25-
{
26-
if (ca.AttributeType.FullName == typeof(XmlnsDefinitionAttribute).FullName)
27-
{
28-
var attr = GetXmlnsDefinition(ca, asmDef);
29-
xmlnsDefinitions.Add(attr);
30-
}
31-
}
28+
GatherXmlnsDefinitionAttributes(xmlnsDefinitions, asmDef, module.Assembly);
3229
}
3330
}
3431
else
@@ -50,6 +47,22 @@ static IList<XmlnsDefinitionAttribute> GatherXmlnsDefinitionAttributes(ModuleDef
5047
return xmlnsDefinitions;
5148
}
5249

50+
static void GatherXmlnsDefinitionAttributes(List<XmlnsDefinitionAttribute> xmlnsDefinitions, AssemblyDefinition asmDef, AssemblyDefinition currentAssembly)
51+
{
52+
foreach (var ca in asmDef.CustomAttributes)
53+
{
54+
if (ca.AttributeType.FullName == _xmlnsDefinitionName)
55+
{
56+
var attr = GetXmlnsDefinition(ca, asmDef);
57+
//only add globalxmlns definition from the current assembly
58+
if ( attr.XmlNamespace == XamlParser.MauiGlobal
59+
&& asmDef != currentAssembly)
60+
continue;
61+
xmlnsDefinitions.Add(attr);
62+
}
63+
}
64+
}
65+
5366
public static TypeReference GetTypeReference(XamlCache cache, string typeName, ModuleDefinition module, BaseNode node, bool expandToExtension = true)
5467
{
5568
try
@@ -76,6 +89,8 @@ public static bool TryGetTypeReference(this XmlType xmlType, XamlCache cache, Mo
7689

7790
TypeReference type = xmlType.GetTypeReference(xmlnsDefinitions, module.Assembly.Name.Name, (typeInfo) =>
7891
{
92+
if (typeInfo.clrNamespace.StartsWith("http")) //aggregated xmlns, might result in a typeload exception
93+
return null;
7994
string typeName = typeInfo.typeName.Replace('+', '/'); //Nested types
8095
var type = module.GetTypeDefinition(cache, (typeInfo.assemblyName, typeInfo.clrNamespace, typeName));
8196
if (type is not null && type.IsPublicOrVisibleInternal(module))
@@ -97,7 +112,7 @@ public static TypeReference GetTypeReference(this XmlType xmlType, XamlCache cac
97112
throw new BuildException(BuildExceptionCode.TypeResolution, xmlInfo, null, $"{xmlType.NamespaceUri}:{xmlType.Name}");
98113
}
99114

100-
public static XmlnsDefinitionAttribute GetXmlnsDefinition(this CustomAttribute ca, AssemblyDefinition asmDef)
115+
static XmlnsDefinitionAttribute GetXmlnsDefinition(this CustomAttribute ca, AssemblyDefinition asmDef)
101116
{
102117
var attr = new XmlnsDefinitionAttribute(
103118
ca.ConstructorArguments[0].Value as string,

src/Controls/src/Core/PublicAPI/net-android/PublicAPI.Shipped.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1907,7 +1907,7 @@
19071907
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.AssemblyName.set -> void
19081908
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.ClrNamespace.get -> string
19091909
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlNamespace.get -> string
1910-
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlnsDefinitionAttribute(string xmlNamespace, string clrNamespace) -> void
1910+
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlnsDefinitionAttribute(string xmlNamespace, string target) -> void
19111911
~Microsoft.Maui.Controls.XmlnsPrefixAttribute.Prefix.get -> string
19121912
~Microsoft.Maui.Controls.XmlnsPrefixAttribute.XmlNamespace.get -> string
19131913
~Microsoft.Maui.Controls.XmlnsPrefixAttribute.XmlnsPrefixAttribute(string xmlNamespace, string prefix) -> void

src/Controls/src/Core/PublicAPI/net-android/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,4 +150,5 @@ static readonly Microsoft.Maui.Controls.TitleBar.SubtitleProperty -> Microsoft.M
150150
static readonly Microsoft.Maui.Controls.TitleBar.TitleProperty -> Microsoft.Maui.Controls.BindableProperty!
151151
static readonly Microsoft.Maui.Controls.TitleBar.TrailingContentProperty -> Microsoft.Maui.Controls.BindableProperty!
152152
static readonly Microsoft.Maui.Controls.Window.TitleBarProperty -> Microsoft.Maui.Controls.BindableProperty!
153-
virtual Microsoft.Maui.Controls.Application.ActivateWindow(Microsoft.Maui.Controls.Window! window) -> void
153+
virtual Microsoft.Maui.Controls.Application.ActivateWindow(Microsoft.Maui.Controls.Window! window) -> void
154+
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.Target.get -> string

src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Shipped.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1866,7 +1866,7 @@
18661866
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.AssemblyName.set -> void
18671867
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.ClrNamespace.get -> string
18681868
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlNamespace.get -> string
1869-
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlnsDefinitionAttribute(string xmlNamespace, string clrNamespace) -> void
1869+
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlnsDefinitionAttribute(string xmlNamespace, string target) -> void
18701870
~Microsoft.Maui.Controls.XmlnsPrefixAttribute.Prefix.get -> string
18711871
~Microsoft.Maui.Controls.XmlnsPrefixAttribute.XmlNamespace.get -> string
18721872
~Microsoft.Maui.Controls.XmlnsPrefixAttribute.XmlnsPrefixAttribute(string xmlNamespace, string prefix) -> void

src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,3 +349,4 @@ virtual Microsoft.Maui.Controls.Handlers.Items2.ItemsViewHandler2<TItemsView>.Up
349349
*REMOVED*override Microsoft.Maui.Controls.Handlers.Compatibility.FrameRenderer.SetNeedsLayout() -> void
350350
*REMOVED*override Microsoft.Maui.Controls.Handlers.Compatibility.FrameRenderer.MovedToWindow() -> void
351351
override Microsoft.Maui.Controls.Handlers.Compatibility.VisualElementRenderer<TElement>.MovedToWindow() -> void
352+
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.Target.get -> string

src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Shipped.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1866,7 +1866,7 @@
18661866
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.AssemblyName.set -> void
18671867
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.ClrNamespace.get -> string
18681868
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlNamespace.get -> string
1869-
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlnsDefinitionAttribute(string xmlNamespace, string clrNamespace) -> void
1869+
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlnsDefinitionAttribute(string xmlNamespace, string target) -> void
18701870
~Microsoft.Maui.Controls.XmlnsPrefixAttribute.Prefix.get -> string
18711871
~Microsoft.Maui.Controls.XmlnsPrefixAttribute.XmlNamespace.get -> string
18721872
~Microsoft.Maui.Controls.XmlnsPrefixAttribute.XmlnsPrefixAttribute(string xmlNamespace, string prefix) -> void

src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,4 +348,5 @@ virtual Microsoft.Maui.Controls.Handlers.Items2.ItemsViewDelegator2<TItemsView,
348348
virtual Microsoft.Maui.Controls.Handlers.Items2.ItemsViewHandler2<TItemsView>.UpdateLayout() -> void
349349
*REMOVED*override Microsoft.Maui.Controls.Handlers.Compatibility.FrameRenderer.SetNeedsLayout() -> void
350350
*REMOVED*override Microsoft.Maui.Controls.Handlers.Compatibility.FrameRenderer.MovedToWindow() -> void
351-
override Microsoft.Maui.Controls.Handlers.Compatibility.VisualElementRenderer<TElement>.MovedToWindow() -> void
351+
override Microsoft.Maui.Controls.Handlers.Compatibility.VisualElementRenderer<TElement>.MovedToWindow() -> void
352+
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.Target.get -> string

src/Controls/src/Core/PublicAPI/net-tizen/PublicAPI.Shipped.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1685,7 +1685,7 @@
16851685
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.AssemblyName.set -> void
16861686
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.ClrNamespace.get -> string
16871687
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlNamespace.get -> string
1688-
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlnsDefinitionAttribute(string xmlNamespace, string clrNamespace) -> void
1688+
~Microsoft.Maui.Controls.XmlnsDefinitionAttribute.XmlnsDefinitionAttribute(string xmlNamespace, string target) -> void
16891689
~Microsoft.Maui.Controls.XmlnsPrefixAttribute.Prefix.get -> string
16901690
~Microsoft.Maui.Controls.XmlnsPrefixAttribute.XmlNamespace.get -> string
16911691
~Microsoft.Maui.Controls.XmlnsPrefixAttribute.XmlnsPrefixAttribute(string xmlNamespace, string prefix) -> void

0 commit comments

Comments
 (0)