protected override void DoEmit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen) { if (_selectors.Count == 0) { throw new XamlLoadException("Invalid selector count", this); } if (_selectors.Count == 1) { _selectors[0].Emit(context, codeGen); return; } var listType = context.Configuration.TypeSystem.FindType("System.Collections.Generic.List`1") .MakeGenericType(base.Type.GetClrType()); var add = listType.FindMethod("Add", context.Configuration.WellKnownTypes.Void, false, Type.GetClrType()); codeGen .Newobj(listType.FindConstructor()); foreach (var s in _selectors) { codeGen.Dup(); context.Emit(s, codeGen, Type.GetClrType()); codeGen.EmitCall(add, true); } EmitCall(context, codeGen, m => m.Name == "Or" && m.Parameters.Count == 1 && m.Parameters[0].Name.StartsWith("IReadOnlyList")); }
public virtual XamlILNodeEmitResult Emit( XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen) { codeGen.Newobj(_constructor); return(XamlILNodeEmitResult.Type(0, Type.GetClrType())); }
public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen) { foreach (var value in _values) { codeGen.Ldc_R8(value); } codeGen.Newobj(_constructor); return(XamlILNodeEmitResult.Type(0, Type.GetClrType())); }
private IXamlType EmitCreateAccessorFactoryDelegate(XamlIlEmitContext context, IXamlILEmitter codeGen) { var types = context.GetAvaloniaTypes(); var weakReferenceType = context.Configuration.TypeSystem.GetType("System.WeakReference`1").MakeGenericType(context.Configuration.WellKnownTypes.Object); var funcType = context.Configuration.TypeSystem.GetType("System.Func`3").MakeGenericType( weakReferenceType, types.IPropertyInfo, types.IPropertyAccessor); codeGen.Newobj(funcType.Constructors.First(c => c.Parameters.Count == 2 && c.Parameters[0].Equals(context.Configuration.WellKnownTypes.Object))); return(funcType); }
public IXamlType EmitLoadIndexerAccessorFactory(XamlIlEmitContext context, IXamlILEmitter codeGen, IXamlAstValueNode value) { var intType = context.Configuration.TypeSystem.GetType("System.Int32"); if (_indexerClosureType is null) { _indexerClosureType = InitializeClosureType(context); } context.Emit(value, codeGen, intType); codeGen.Newobj(_indexerClosureType.FindConstructor(new List <IXamlType> { intType })); EmitLoadPropertyAccessorFactory(context, codeGen, _indexerClosureType, IndexerClosureFactoryMethodName, isStatic: false); return(EmitCreateAccessorFactoryDelegate(context, codeGen)); }
public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen) { codeGen.Newobj(_constructor); codeGen .Dup() .Ldc_I4(_values.Count) .EmitCall(_listSetCapacityMethod); foreach (var value in _values) { codeGen.Dup(); context.Emit(value, codeGen, _elementType); codeGen.EmitCall(_listAddMethod); } return(XamlILNodeEmitResult.Type(0, Type.GetClrType())); }