Esempio n. 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"));
        }
Esempio n. 2
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()));
        }