12 changed files with 82 additions and 33 deletions
@ -0,0 +1,47 @@ |
|||
using System.Linq; |
|||
using XamlIl.Ast; |
|||
using XamlIl.Transform; |
|||
using XamlIl.TypeSystem; |
|||
|
|||
namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers |
|||
{ |
|||
public class AvaloniaXamlIlConstructorServiceProviderTransformer : IXamlIlAstTransformer |
|||
{ |
|||
public IXamlIlAstNode Transform(XamlIlAstTransformationContext context, IXamlIlAstNode node) |
|||
{ |
|||
if (node is XamlIlAstObjectNode on && on.Arguments.Count == 0) |
|||
{ |
|||
var ctors = on.Type.GetClrType().Constructors; |
|||
if (!ctors.Any(c => c.IsPublic && !c.IsStatic && c.Parameters.Count == 0)) |
|||
{ |
|||
var sp = context.Configuration.TypeMappings.ServiceProvider; |
|||
if (ctors.Any(c => |
|||
c.IsPublic && !c.IsStatic && c.Parameters.Count == 1 && c.Parameters[0] |
|||
.Equals(sp))) |
|||
{ |
|||
on.Arguments.Add(new InjectServiceProviderNode(sp, on)); |
|||
} |
|||
} |
|||
} |
|||
|
|||
return node; |
|||
} |
|||
|
|||
class InjectServiceProviderNode : XamlIlAstNode, IXamlIlAstValueNode,IXamlIlAstNodeNeedsParentStack, |
|||
IXamlIlAstEmitableNode |
|||
{ |
|||
public InjectServiceProviderNode(IXamlIlType type, IXamlIlLineInfo lineInfo) : base(lineInfo) |
|||
{ |
|||
Type = new XamlIlAstClrTypeReference(lineInfo, type, false); |
|||
} |
|||
|
|||
public IXamlIlAstTypeReference Type { get; } |
|||
public bool NeedsParentStack => true; |
|||
public XamlIlNodeEmitResult Emit(XamlIlEmitContext context, IXamlIlEmitter codeGen) |
|||
{ |
|||
codeGen.Ldloc(context.ContextLocal); |
|||
return XamlIlNodeEmitResult.Type(0, Type.GetClrType()); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1 +1 @@ |
|||
Subproject commit b318b6dcc67370f7ebea1e3c6741a0b6d4dd5db1 |
|||
Subproject commit 1b3fda73e4cece31a4fec22ce146640ed5f2fd4c |
|||
Loading…
Reference in new issue