Пример #1
0
        internal override Instruction ToInstruction()
        {
            var enumerated      = _enumerated.ToInstruction();
            var block           = _block.ToInstruction();
            var enumeratedParam = _block.Parameters[0];
            var enumeratedType  = enumeratedParam.VariableType;

            var enumeratorType = typeof(IEnumerator <>).MakeGenericType(enumeratedType);
            var enumeratorVar  = E.CreateVariable("Enumerator", enumeratorType);

            var getEnumerator    = E.MethodCall(enumerated, "GetEnumerator");
            var assignEnumerator = E.Assign(enumeratorVar, getEnumerator);
            var moveNextCall     = E.MethodCall(enumeratorVar, typeof(IEnumerator).GetMethod("MoveNext"));
            var current          = E.MethodCall(enumeratorVar, "get_Current");
            var assignCurrent    = E.Assign(enumeratedParam, current);

            var loopSequence = E.Sequence(new[] {
                assignCurrent,

                block
            });


            var result = E.Sequence(new[] {
                assignEnumerator,

                E.While(moveNextCall,
                        loopSequence
                        )
            });

            return(result);
        }
Пример #2
0
        private Instruction createAttributes()
        {
            Instruction attributes;
            var         idConstant    = E.Constant("id");
            var         classConstant = E.Constant("class");

            if (Attributes == null)
            {
                var pairs = new List <Instruction>();

                if (ExplicitID != null)
                {
                    pairs.Add(E.Pair(idConstant, ExplicitID.ToInstruction()));
                }

                if (ExplicitClass != null)
                {
                    pairs.Add(E.Pair(classConstant, ExplicitClass.ToInstruction()));
                }

                if (pairs.Count == 0)
                {
                    return(null);
                }

                attributes = E.Container(pairs);
            }
            else
            {
                attributes = Attributes.ToInstruction();
                if (ExplicitID != null)
                {
                    attributes = E.SetValue(attributes, idConstant, ExplicitID.ToInstruction());
                }

                if (ExplicitClass != null)
                {
                    attributes = E.SetValue(attributes, classConstant, ExplicitClass.ToInstruction());
                }
            }

            return(attributes);
        }
Пример #3
0
        internal override Instruction ToInstruction()
        {
            var tag        = E.Tag(TagName.ToInstruction());
            var attributes = createAttributes();

            tag.SetAttributes(attributes);
            tag.SetContent(_content);

            return(tag);
        }
Пример #4
0
        internal override Instruction ToInstruction()
        {
            var valueInstruction = Value.ToInstruction();
            var valueType        = valueInstruction.ReturnType;
            var defaultValue     = E.DefaultValue(valueType);

            switch (valueType.FullName)
            {
            case "System.Double":
                return(E.Call("DoubleToBool", new[] { valueInstruction }));

            default:
                return(E.Not(E.IsEqual(valueInstruction, defaultValue)));
            }
        }
Пример #5
0
        internal override Instruction ToInstruction()
        {
            //keep correct order because of side effects
            var thisObj = ThisObj.ToInstruction();

            var argExprs = new List <Instruction>();

            foreach (var arg in Args)
            {
                argExprs.Add(arg.ToInstruction());
            }

            if (Field == null)
            {
                return(E.MethodCall(thisObj, Method, argExprs.ToArray()));
            }
            else
            {
                return(E.Field(thisObj, Field));
            }
        }
Пример #6
0
 internal override Instruction ToInstruction()
 {
     return(E.Pair(Key.ToInstruction(), Value.ToInstruction()));
 }
Пример #7
0
        internal override Instruction ToInstruction()
        {
            var identifierInstr = Identifier == null ? null : Identifier.ToInstruction();

            return(E.Yield(identifierInstr));
        }
Пример #8
0
 internal override Instruction ToInstruction()
 {
     return(E.CreateObject <HAMLInterval>(_from.ToInstruction(), _to.ToInstruction()));
 }