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