Example #1
0
        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));
        }
Example #6
0
        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()));
        }