Skip to content

Commit 97a39e4

Browse files
move IsAnyOfType
1 parent 61b4999 commit 97a39e4

File tree

10 files changed

+264
-214
lines changed

10 files changed

+264
-214
lines changed

src/Controls/src/Build.Tasks/CompiledConverters/BindablePropertyConverter.cs

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,6 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
2525
yield return Instruction.Create(OpCodes.Ldsfld, bpRef);
2626
}
2727

28-
static bool IsOfAnyType(XmlType xmlType, params string[] types)
29-
{
30-
if (types == null || types.Length == 0)
31-
return false;
32-
if (xmlType == null)
33-
return false;
34-
if (xmlType.NamespaceUri != XamlParser.MauiUri && xmlType.NamespaceUri != XamlParser.MauiGlobalUri)
35-
return false;
36-
if (types.Contains(xmlType.Name))
37-
return true;
38-
return false;
39-
}
40-
4128
public FieldReference GetBindablePropertyFieldReference(string value, ILContext context, ModuleDefinition module, BaseNode node)
4229
{
4330
FieldReference bpRef = null;
@@ -48,18 +35,18 @@ public FieldReference GetBindablePropertyFieldReference(string value, ILContext
4835
if (parts.Length == 1)
4936
{
5037
var parent = node.Parent?.Parent as IElementNode ?? (node.Parent?.Parent as IListNode)?.Parent as IElementNode;
51-
if (IsOfAnyType((node.Parent as ElementNode)?.XmlType, nameof(Setter), nameof(PropertyCondition)))
38+
if ((node.Parent as ElementNode)?.XmlType is XmlType xt && xt.IsOfAnyType(nameof(Setter), nameof(PropertyCondition)))
5239
{
53-
if (IsOfAnyType(parent.XmlType, nameof(Trigger), nameof(DataTrigger), nameof(MultiTrigger), nameof(Style)))
40+
if (parent.XmlType.IsOfAnyType(nameof(Trigger), nameof(DataTrigger), nameof(MultiTrigger), nameof(Style)))
5441
{
5542
typeName = GetTargetTypeName(parent);
5643
}
57-
else if (IsOfAnyType(parent.XmlType, nameof(VisualState)))
44+
else if (parent.XmlType.IsOfAnyType(nameof(VisualState)))
5845
{
5946
typeName = FindTypeNameForVisualState(parent, node, context);
6047
}
6148
}
62-
else if (IsOfAnyType((node.Parent as ElementNode)?.XmlType, nameof(Trigger)))
49+
else if ((node.Parent as ElementNode)?.XmlType is XmlType xt1 && xt1.IsOfAnyType(nameof(Trigger)))
6350
{
6451
typeName = GetTargetTypeName(node.Parent);
6552
}
@@ -99,18 +86,18 @@ static XmlType FindTypeNameForVisualState(IElementNode parent, IXmlLineInfo line
9986

10087
//2. check that the VS is in a VSG
10188
// if (!(parent.Parent is IElementNode target) || target.XmlType.NamespaceUri != XamlParser.MauiUri || target.XmlType.Name != nameof(VisualStateGroup))
102-
if (!(parent.Parent is IElementNode target) || !IsOfAnyType(target.XmlType, nameof(VisualStateGroup)))
89+
if (!(parent.Parent is IElementNode target) || !target.XmlType.IsOfAnyType(nameof(VisualStateGroup)))
10390
throw new XamlParseException($"Expected {nameof(VisualStateGroup)} but found {parent.Parent}", lineInfo);
10491

10592
//3. if the VSG is in a VSGL, skip that as it could be implicit
106-
if (target.Parent is ListNode
107-
|| IsOfAnyType((target.Parent as IElementNode)?.XmlType, nameof(VisualStateGroupList)))
93+
if ( target.Parent is ListNode
94+
|| target.Parent is IElementNode { XmlType: XmlType xt } && xt.IsOfAnyType(nameof(VisualStateGroupList)))
10895
target = target.Parent.Parent as IElementNode;
10996
else
11097
target = target.Parent as IElementNode;
11198

11299
//4. target is now a Setter in a Style, or a VE
113-
if (IsOfAnyType(target.XmlType, nameof(Setter)))
100+
if (target.XmlType.IsOfAnyType(nameof(Setter)))
114101
{
115102
var targetType = ((target?.Parent as IElementNode)?.Properties[new XmlName("", "TargetType")] as ValueNode)?.Value as string;
116103
return TypeArgumentsParser.ParseSingle(targetType, parent.NamespaceResolver, lineInfo);
@@ -121,8 +108,7 @@ static XmlType FindTypeNameForVisualState(IElementNode parent, IXmlLineInfo line
121108

122109
public static FieldReference GetBindablePropertyFieldReference(XamlCache cache, TypeReference typeRef, string propertyName, ModuleDefinition module)
123110
{
124-
TypeReference declaringTypeReference;
125-
FieldReference bpRef = typeRef.GetField(cache, fd => fd.Name == $"{propertyName}Property" && fd.IsStatic && fd.IsPublic, out declaringTypeReference);
111+
FieldReference bpRef = typeRef.GetField(cache, fd => fd.Name == $"{propertyName}Property" && fd.IsStatic && fd.IsPublic, out TypeReference declaringTypeReference);
126112
if (bpRef != null)
127113
{
128114
bpRef = module.ImportReference(bpRef.ResolveGenericParameters(declaringTypeReference));

src/Controls/src/SourceGen/Controls.SourceGen.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<Compile Include="..\Xaml\MarkupExpressionParser.cs" Link="MarkupExpressionParser.cs" />
3434
<Compile Include="..\Xaml\PruneIgnoredNodesVisitor.cs" Link="PruneIgnoredNodesVisitor.cs" />
3535
<Compile Include="..\Xaml\RemoveDuplicateDesignNodes.cs" Link="RemoveDuplicateDesignNodes.cs" />
36+
<Compile Include="..\Xaml\SimplifyOnPlatformVisitor.cs" Link="SimplifyOnPlatformVisitor.cs" />
3637
<Compile Include="..\Xaml\SimplifyTypeExtensionVisitor.cs" Link="SimplifyTypeExtensionVisitor.cs" />
3738
<Compile Include="..\Xaml\TypeArgumentsParser.cs" Link="TypeArgumentsParser.cs" />
3839
<Compile Include="..\Xaml\XamlInflator.cs" Link="XamlInflator.cs" />
@@ -42,6 +43,7 @@
4243
<Compile Include="..\Xaml\XamlParser.cs" Link="XamlParser.Namespaces.cs" />
4344
<Compile Include="..\Xaml\XamlParser.Namespaces.cs" Link="XamlParser.Namespaces.cs" />
4445
<Compile Include="..\Xaml\XmlName.cs" Link="XmlName.cs" />
46+
<Compile Include="..\Xaml\XmlType.cs" Link="XmlType.cs" />
4547
<Compile Include="..\Xaml\XmlnsHelper.cs" Link="XmlnsHelper.cs" />
4648
<Compile Include="..\Xaml\XmlTypeXamlExtensions.cs" Link="XmlTypeXamlExtensions.cs" />
4749
<Compile Include="..\..\..\Core\src\Services\Crc64.cs">

src/Controls/src/SourceGen/InitializeComponentCodeWriter.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ PrePost newblock() =>
9191
FilePath = xamlItem.ProjectItem.RelativePath,
9292
EnableLineInfo = xamlItem.ProjectItem.EnableLineInfo,
9393
EnableDiagnostics = xamlItem.ProjectItem.EnableDiagnostics,
94+
TargetPlatform = xamlItem.ProjectItem.TargetFramework ?? "",
9495
};
9596
using (newblock())
9697
{
@@ -123,6 +124,8 @@ static void Visit(RootNode rootnode, SourceGenContext visitorContext, bool useDe
123124
if (useDesignProperties)
124125
rootnode.Accept(new RemoveDuplicateDesignNodes(), null);
125126
rootnode.Accept(new SimplifyTypeExtensionVisitor(), null);
127+
if (!string.IsNullOrEmpty(visitorContext.TargetPlatform))
128+
rootnode.Accept(new SimplifyOnPlatformVisitor(visitorContext.TargetPlatform), null);
126129
rootnode.Accept(new CreateValuesVisitor(visitorContext), null);
127130
rootnode.Accept(new SetNamescopesAndRegisterNamesVisitor(visitorContext), null); //set namescopes for {x:Reference} and FindByName
128131
rootnode.Accept(new SetFieldsForXNamesVisitor(visitorContext), null);

src/Controls/src/SourceGen/NodeSGExtensions.cs

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -551,19 +551,6 @@ public static void RegisterSourceInfo(this INode node, SourceGenContext context,
551551
writer.Indent--;
552552
}
553553

554-
static bool IsOfAnyType(XmlType xmlType, params string[] types)
555-
{
556-
if (types == null || types.Length == 0)
557-
return false;
558-
if (xmlType == null)
559-
return false;
560-
if (xmlType.NamespaceUri != XamlParser.MauiUri && xmlType.NamespaceUri != XamlParser.MauiGlobalUri)
561-
return false;
562-
if (types.Contains(xmlType.Name))
563-
return true;
564-
return false;
565-
}
566-
567554
public static IFieldSymbol GetBindableProperty(this ValueNode node, SourceGenContext context)
568555
{
569556
static ITypeSymbol? GetTargetTypeSymbol(INode node, SourceGenContext context)
@@ -584,14 +571,14 @@ public static IFieldSymbol GetBindableProperty(this ValueNode node, SourceGenCon
584571
{
585572
ITypeSymbol? typeSymbol = null;
586573
var parent = node.Parent?.Parent as IElementNode ?? (node.Parent?.Parent as IListNode)?.Parent as IElementNode;
587-
if (IsOfAnyType((node.Parent as ElementNode)?.XmlType!, "Setter", "PropertyCondition"))
574+
if ((node.Parent as ElementNode)!.XmlType!.IsOfAnyType( "Setter", "PropertyCondition"))
588575
{
589-
if (IsOfAnyType(parent!.XmlType, "Trigger", "DataTrigger", "MultiTrigger", "Style"))
576+
if (parent!.XmlType.IsOfAnyType("Trigger", "DataTrigger", "MultiTrigger", "Style"))
590577
typeSymbol = GetTargetTypeSymbol(parent, context);
591-
else if (IsOfAnyType(parent.XmlType, "VisualState"))
578+
else if (parent.XmlType.IsOfAnyType("VisualState"))
592579
typeSymbol = FindTypeSymbolForVisualState(parent, context, node);
593580
}
594-
else if (IsOfAnyType((node.Parent as ElementNode)?.XmlType!, "Trigger"))
581+
else if ((node.Parent as ElementNode)!.XmlType!.IsOfAnyType("Trigger"))
595582
typeSymbol = GetTargetTypeSymbol(node.Parent!, context);
596583

597584
var propertyName = parts[0];
@@ -615,19 +602,19 @@ public static IFieldSymbol GetBindableProperty(this ValueNode node, SourceGenCon
615602
//1. parent is VisualState, don't check that
616603

617604
//2. check that the VS is in a VSG
618-
if (!(parent.Parent is IElementNode target) || !IsOfAnyType(target.XmlType, "VisualStateGroup"))
605+
if (!(parent.Parent is IElementNode target) || !target.XmlType.IsOfAnyType("VisualStateGroup"))
619606
throw new Exception($"Expected VisualStateGroup but found {parent.Parent}");
620607

621608
//3. if the VSG is in a VSGL, skip that as it could be implicit
622-
if (target.Parent is ListNode
623-
|| IsOfAnyType((target.Parent as IElementNode)?.XmlType!, "VisualStateGroupList"))
609+
if ( target.Parent is ListNode
610+
|| (target.Parent as IElementNode)!.XmlType!.IsOfAnyType( "VisualStateGroupList"))
624611
target = (IElementNode)target.Parent.Parent;
625612
else
626613
target = (IElementNode)target.Parent;
627614

628615
XmlType? typeName = null;
629616
//4. target is now a Setter in a Style, or a VE
630-
if (IsOfAnyType(target.XmlType, "Setter"))
617+
if (target.XmlType.IsOfAnyType("Setter"))
631618
{
632619
var targetType = ((target?.Parent as IElementNode)?.Properties[new XmlName("", "TargetType")] as ValueNode)?.Value as string;
633620
typeName = TypeArgumentsParser.ParseSingle(targetType, parent.NamespaceResolver, lineInfo);
@@ -639,7 +626,5 @@ public static IFieldSymbol GetBindableProperty(this ValueNode node, SourceGenCon
639626
}
640627

641628
public static bool RepresentsType(this INode node, string namespaceUri, string name)
642-
{
643-
return node is IElementNode elementNode && elementNode.XmlType.RepresentsType(namespaceUri, name);
644-
}
629+
=> node is IElementNode elementNode && elementNode.XmlType.RepresentsType(namespaceUri, name);
645630
}

src/Controls/src/SourceGen/SourceGenContext.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class SourceGenContext(IndentedTextWriter writer, Compilation compilation, Sourc
3232
public IList<string> LocalMethods { get; } = new List<string>();
3333
public bool EnableLineInfo { get; set; }
3434
public bool EnableDiagnostics { get; internal set; }
35+
public string TargetPlatform { get; internal set; } = "";
3536

3637
public void AddLocalMethod(string code)
3738
{

0 commit comments

Comments
 (0)