|
|
|
@ -1,8 +1,6 @@ |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Text; |
|
|
|
using XamlX; |
|
|
|
using XamlX.Ast; |
|
|
|
using XamlX.Transform; |
|
|
|
using XamlX.TypeSystem; |
|
|
|
@ -28,6 +26,71 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers |
|
|
|
|
|
|
|
case XamlMarkupExtensionNode extension: |
|
|
|
startType = extension.Type?.GetClrType(); |
|
|
|
|
|
|
|
//let's try to infer StaticResource type from parent resources in xaml
|
|
|
|
if (extension.Value.Type.GetClrType().FullName == "Avalonia.Markup.Xaml.MarkupExtensions.StaticResourceExtension" && |
|
|
|
extension.Value is XamlAstConstructableObjectNode cn && |
|
|
|
cn.Arguments.Count == 1 && cn.Arguments[0] is XamlAstTextNode keyNode) |
|
|
|
{ |
|
|
|
bool matchProperty(IXamlAstNode node, IXamlType styledElementType, string propertyName) |
|
|
|
{ |
|
|
|
return (node is XamlPropertyAssignmentNode p && |
|
|
|
p.Property.DeclaringType == styledElementType && p.Property.Name == propertyName) |
|
|
|
|| |
|
|
|
(node is XamlManipulationGroupNode m && m.Children.Count > 0 && |
|
|
|
m.Children[0] is XamlPropertyAssignmentNode pm && |
|
|
|
pm.Property.DeclaringType == styledElementType && pm.Property.Name == propertyName); |
|
|
|
} |
|
|
|
|
|
|
|
string getResourceValue_xKey(XamlPropertyAssignmentNode node) |
|
|
|
=> node.Values.Count == 2 && node.Values[0] is XamlAstTextNode t ? t.Text : ""; |
|
|
|
|
|
|
|
IXamlType getResourceValue_Type(XamlPropertyAssignmentNode node, IXamlType xamlType) |
|
|
|
=> node.Values.Count == 2 ? node.Values[1].Type.GetClrType() : xamlType; |
|
|
|
|
|
|
|
IEnumerable<XamlPropertyAssignmentNode> getResourceValues(IXamlAstNode node) |
|
|
|
{ |
|
|
|
if (node is XamlPropertyAssignmentNode propertyNode) |
|
|
|
{ |
|
|
|
if (propertyNode.Values.Count == 1 && |
|
|
|
propertyNode.Values[0] is XamlAstConstructableObjectNode obj && |
|
|
|
obj.Type.GetClrType().FullName == "Avalonia.Controls.ResourceDictionary") |
|
|
|
{ |
|
|
|
foreach (var r in obj.Children.SelectMany(c => getResourceValues(c))) |
|
|
|
{ |
|
|
|
yield return r; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
yield return propertyNode; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (node is XamlManipulationGroupNode m) |
|
|
|
{ |
|
|
|
foreach (var r in m.Children.OfType<XamlPropertyAssignmentNode>()) |
|
|
|
{ |
|
|
|
yield return r; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
string key = keyNode.Text; |
|
|
|
|
|
|
|
var styledElement = context.GetAvaloniaTypes().StyledElement; |
|
|
|
var resource = context.ParentNodes() |
|
|
|
.OfType<XamlAstConstructableObjectNode>() |
|
|
|
.Where(o => styledElement.IsAssignableFrom(o.Type.GetClrType())) |
|
|
|
.Select(o => o.Children.FirstOrDefault(p => matchProperty(p, styledElement, "Resources"))) |
|
|
|
.Where(r => r != null) |
|
|
|
.SelectMany(r => getResourceValues(r)) |
|
|
|
.FirstOrDefault(r => getResourceValue_xKey(r) == key); |
|
|
|
|
|
|
|
if (resource != null) |
|
|
|
{ |
|
|
|
startType = getResourceValue_Type(resource, startType); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case XamlStaticExtensionNode staticExtension: |
|
|
|
|