コード例 #1
0
        // Public Methods 

        public void Emit(PySourceCodeEmiter emiter, PySourceCodeWriter writer, PyEmitStyle style)
        {
            foreach (var i in NestedClasses)
            {
                i.Emit(emiter, writer, style);
            }
            var saveStyleCurrentClass     = style.CurrentClass;
            var saveStyleCurrentNamespace = style.CurrentNamespace;

            try
            {
                if (IsEmpty)
                {
                    return;
                }
                if (style.CurrentNamespace == null)
                {
                    style.CurrentNamespace = PyNamespace.Root;
                }
                if (style.CurrentNamespace != Name.Namespace)
                {
                    throw new Exception("Unable to emit class into different namespace");
                }
                var e = "";
                if (!_baseTypeName.IsEmpty)
                {
                    e = " extends " + _baseTypeName.NameForEmit(style);
                }
                writer.OpenLnF("class {0}{1}:", Name.ShortName, e);
                style.CurrentClass = Name; // do not move this before "class XXX" is emited
                for (var orderGroup = 0; orderGroup < 3; orderGroup++)
                {
                    foreach (var field in Fields.Where(_ => FieldOrderGroup(_) == orderGroup))
                    {
                        field.Emit(emiter, writer, style);
                    }
                }
                foreach (var me in Methods)
                {
                    me.Emit(emiter, writer, style);
                }
                writer.CloseLn("");
            }
            finally
            {
                style.CurrentClass     = saveStyleCurrentClass;
                style.CurrentNamespace = saveStyleCurrentNamespace;
            }
        }
コード例 #2
0
        // Public Methods 

        public override void Emit(PySourceCodeEmiter emiter, PySourceCodeWriter writer, PyEmitStyle style)
        {
            writer.OpenLnF("switch ({0}) {{", Expression.GetPyCode(style));
            foreach (var sec in Sections)
            {
                foreach (var l in sec.Labels)
                {
                    writer.WriteLnF("{0}{1}:",
                                    l.IsDefault ? "" : "case ",
                                    l.IsDefault ? "default" : l.Value.GetPyCode(style));
                }
                writer.IncIndent();
                sec.Statement.Emit(emiter, writer, style);
                writer.DecIndent();
            }

            writer.CloseLn("}");
        }
コード例 #3
0
        public virtual void Emit(PySourceCodeEmiter emiter, PySourceCodeWriter code, PyEmitStyle style)
        {
            // public function addFunction($function, $namespace = '')
            var argumentsCode = Arguments.Select(u => u.GetPyCode(style)).ToList();
            var mk            = GetPyMethodKind();

            switch (mk)
            {
            case PyMethodKind.ClassStatic:
                code.WriteLn("@staticmethod");
                argumentsCode.Insert(0, GetCurrentClassAlias());
                break;

            case PyMethodKind.OutOfClass:
                break;

            case PyMethodKind.ClassInstance:
                argumentsCode.Insert(0, "self");
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            var param = Arguments == null ? "" : string.Join(", ", argumentsCode);

            code.OpenLnF("def {0}({1}):", Name, param);
            {
                var g = GetGlobals();
                if (!string.IsNullOrEmpty(g))
                {
                    code.WriteLnF("global {0};", g);
                }
            }
            foreach (var statement in Statements)
            {
                var g = PyEmitStyle.xClone(style);
                g.Brackets      = ShowBracketsEnum.Never;
                g.CurrentMethod = this;
                statement.Emit(emiter, code, g);
            }

            code.CloseLn("");
        }
コード例 #4
0
        // Public Methods 

        public override void Emit(PySourceCodeEmiter emiter, PySourceCodeWriter writer, PyEmitStyle style)
        {
            var isBeauty = style == null || style.Compression == EmitStyleCompression.Beauty;

            var ifTrueAny  = PyCodeBlock.HasAny(_ifTrue);
            var ifFalseAny = PyCodeBlock.HasAny(_ifFalse);

            if (!ifTrueAny && !ifFalseAny)
            {
                return;
            }

            writer.OpenLnF("if{1}({0}){2}",
                           Condition.GetPyCode(style),
                           isBeauty ? " " : "",
                           ifTrueAny ? "" : "{}");
            if (ifTrueAny)
            {
                var iStyle = PyEmitStyle.xClone(style, ShowBracketsEnum.IfManyItems_OR_IfStatement);
                if (style != null && style.UseBracketsEvenIfNotNecessary)
                {
                    iStyle.Brackets = ShowBracketsEnum.Always;
                }
                var bound = PyCodeBlock.Bound(_ifTrue);
                bound.Emit(emiter, writer, iStyle);
            }

            writer.DecIndent();
            if (!ifFalseAny)
            {
                return;
            }
            var oneLine   = _ifFalse is PyIfStatement;
            var oldIndent = writer.Intent;

            {
                if (oneLine)
                {
                    writer.Write("else ");
                    writer.SkipIndent = true;
                }
                else
                {
                    writer.OpenLn("else");
                }

                var myBracket = style != null && style.UseBracketsEvenIfNotNecessary;

                var iStyle = PyEmitStyle.xClone(style,
                                                myBracket
                        ? ShowBracketsEnum.Never
                        : ShowBracketsEnum.IfManyItems_OR_IfStatement);

                if (!myBracket)
                {
                    var gf = _ifFalse.GetStatementEmitInfo(iStyle);
                    if (gf != StatementEmitInfo.NormalSingleStatement)
                    {
                        myBracket = true;
                    }
                }

                if (myBracket)
                {
                    iStyle.Brackets = ShowBracketsEnum.Never;
                    writer.OpenLn("{");
                }

                _ifFalse.Emit(emiter, writer, iStyle);
                if (myBracket)
                {
                    writer.CloseLn("}");
                }
            }
            writer.Intent = oldIndent;
        }