コード例 #1
0
 public void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     writer.Write ("catch (");
     writer.Write (NameAndType.Type.ToCSharp ());
     writer.Write (' ');
     writer.Write (ctx.SafeName (NameAndType.Name));
     writer.Write (')');
     Block.GenerateCode (ctx, writer);
 }
コード例 #2
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     if (Value == null)
         writer.Write ("null");
     else if (Value is string) {
         string s = Value as string;
         if (s [0] == '\'') { // 'foo' -> "foo"
             writer.Write ('"');
             writer.Write (s.Substring (1, s.Length - 2));
             writer.Write ('"');
         }
         else
             writer.Write (s); // huh? why is Value double-quoted?
     }
     else if (Value is char)
         writer.Write ("\'" + Value + "\'");
     else if (Value is long || Value is ulong || Value is double || Value is decimal)
         writer.Write (Value.ToString ());
     else if (Value is RegexLiteral) {
         writer.Write ("new System.Text.RegularExpressions.Regex (@\"");
         writer.Write (((RegexLiteral) Value).Pattern);
         writer.Write ("\")");
     }
     else
         throw new NotImplementedException ();
 }
コード例 #3
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     Array.GenerateCode (ctx, writer);
     writer.Write ('[');
     Index.GenerateCode (ctx, writer);
     writer.Write (']');
 }
コード例 #4
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     writer.Write ("if (");
     Condition.GenerateCode (ctx, writer);
     writer.WriteLine (")");
     TrueStatement.GenerateCode (ctx, writer);
     if (FalseStatement != null) {
         writer.WriteLine ("else");
         FalseStatement.GenerateCode (ctx, writer);
     }
 }
コード例 #5
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     if (IsPostfix) {
         Primary.GenerateCode (ctx, writer);
         writer.Write (Operator);
     } else {
         writer.Write (Operator);
         Primary.GenerateCode (ctx, writer);
     }
 }
コード例 #6
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     Target.GenerateCode (ctx, writer);
     writer.Write ('(');
     foreach (var expr in Arguments) {
         var tail = Arguments.Last () == expr ? "" : ", ";
         expr.GenerateCode (ctx, writer);
         writer.Write (tail);
     }
     writer.Write (')');
 }
コード例 #7
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     OnGenerateCode (ctx, writer, false, null);
 }
コード例 #8
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     // if (xxx is IDisposable) ((IDisposable) xxx).Dispose ();
     writer.Write ("if (");
     Target.GenerateCode (ctx, writer);
     writer.WriteLine (" is System.IDisposable)");
     writer.WriteLine ("((IDisposable) ");
     Target.GenerateCode (ctx, writer);
     writer.WriteLine (").Dispose ();");
 }
コード例 #9
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     writer.Write ("do");
     Body.GenerateCode (ctx, writer);
     writer.WriteLine ("while (");
     Condition.GenerateCode (ctx, writer);
     writer.WriteLine (");");
 }
コード例 #10
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     writer.WriteLine ("continue;");
 }
コード例 #11
0
        public void GenerateCode()
        {
            writer.WriteLine ("// This source is automatically generated");
            writer.WriteLine ("using System;");
            writer.WriteLine ("using System.Linq;");
            writer.WriteLine ("using Number = System.Double;");
            writer.WriteLine ("using Class = System.Type;");

            var ctx = new CodeGenerationContext ();
            root.GenerateCode (ctx, writer);
        }
コード例 #12
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     Condition.GenerateCode (ctx, writer);
     writer.Write (" ? ");
     TrueValue.GenerateCode (ctx, writer);
     writer.Write (" : ");
     FalseValue.GenerateCode (ctx, writer);
 }
コード例 #13
0
 public void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     foreach (var item in Items)
         if (item is Import)
             item.GenerateCode (ctx, writer);
     foreach (var item in Items)
         if (!(item is Import))
             item.GenerateCode (ctx, writer);
 }
コード例 #14
0
        public void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
        {
            var parentClassWriter = ctx.CurrentClassWriter;
            var sw = new StringWriter ();
            ctx.CurrentClassWriter = sw;
            var parentType = ctx.CurrentType;
            ctx.CurrentType = this;

            writer.WriteLine ("// class {0}", Name);
            foreach (var ev in Events)
                ev.GenerateCode (ctx, writer);
            ctx.WriteHeaders (Headers, writer, false, false);
            writer.WriteLine ("partial {3} {0}{1}{2}", Name, BaseClassName != null ? " : " : /*" : global::Object"*/String.Empty, BaseClassName, IsInterface ? "interface" : "class");
            writer.WriteLine ("{");
            foreach (var nsuse in NamespaceUses) {
                writer.WriteLine ("// FIXME: using directive inside class declaration is not allowed in C#");
                writer.WriteLine ("// using {0};", nsuse.Name);
            }
            foreach (var item in Members)
                item.GenerateCode (ctx, writer);

            // output temporarily saved members (such as local functions)
            writer.Write (sw.ToString ());

            writer.WriteLine ("}");
            writer.WriteLine ("// end of class {0}", Name);

            ctx.CurrentType = parentType;
            ctx.CurrentClassWriter = parentClassWriter;
        }
コード例 #15
0
 public void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     if (LocalVariables != null)
         LocalVariables.GenerateCode (ctx, writer);
     else {
         foreach (var axs in AssignStatements) {
             var tail = AssignStatements.Last () == axs ? "" : ", ";
             axs.GenerateCode (ctx, writer);
             writer.Write (tail);
         }
     }
 }
コード例 #16
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     if (Function.Name == null) {
         Function.Name = "__anonymous" + ctx.NextAnonymousMethodIndex ();
         Function.GenerateCode (ctx, ctx.CurrentClassWriter);
     }
     writer.WriteLine ("/* embedded function {0} is written as a class member.*/", Function.Name);
     writer.Write (Function.Name);
 }
コード例 #17
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     ctx.InForHeadings = true;
     writer.Write ("for (");
     Initializers.GenerateCode (ctx, writer);
     writer.Write ("; ");
     Condition.GenerateCode (ctx, writer);
     writer.Write ("; ");
     foreach (var iter in Iterators) {
         var tail = Iterators.Last () == iter ? "" : ", ";
         iter.GenerateCode (ctx, writer);
         writer.Write (tail);
     }
     ctx.InForHeadings = false;
     writer.WriteLine (')');
     Body.GenerateCode (ctx, writer);
 }
コード例 #18
0
 public void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     writer.Write ("[");
     writer.Write (Name.ToCSharp ());
     writer.Write ("(");
     foreach (var member in Members) {
         var tail = Members.Last () == member ? "" : ", ";
         writer.Write (ctx.SafeName (member.Name));
         writer.Write (" = ");
         member.Value.GenerateCode (ctx, writer);
         writer.Write (tail);
     }
     writer.WriteLine (")]");
 }
コード例 #19
0
 internal void OnGenerateCode(CodeGenerationContext ctx, TextWriter writer, bool returnVoid, string namePrefix)
 {
     bool isConstructor = ctx.CurrentType != null && ctx.CurrentType.Name == Name;
     if (returnVoid)
         writer.Write ("void");
     else if (!isConstructor && ReturnTypeName != null)
         writer.Write (ReturnTypeName.ToCSharp ());
     else if (!isConstructor)
         writer.Write ("/* no type? */");
     writer.Write (' ');
     writer.Write (namePrefix);
     if (Name == "getTimer")
         writer.Write ("GlobalContext.getTimer");
     else if (Name == "toString")
         writer.Write ("ToString");
     else
         writer.Write (ctx.SafeName (Name));
     writer.Write (" (");
     foreach (var arg in Arguments) {
         var tail = Arguments.Last () == arg ? "" : ", ";
         if (arg.IsVarArg)
             writer.Write ("params object [] {0}", arg.Name);
         else {
             writer.Write (arg.Type.ToCSharp ());
             writer.Write (' ');
             writer.Write (ctx.SafeName (arg.Name));
             if (arg.DefaultValue != null) {
                 writer.Write (" = ");
                 arg.DefaultValue.GenerateCode (ctx, writer);
             }
         }
         writer.Write (tail);
     }
     writer.Write (')');
     if (Body == null) // interface
         writer.WriteLine (';');
     else {
         writer.WriteLine ();
         Body.GenerateCode (ctx, writer);
     }
 }
コード例 #20
0
 public abstract void GenerateCode(CodeGenerationContext ctx, TextWriter writer);
コード例 #21
0
 internal void OnGenerateCode(CodeGenerationContext ctx, TextWriter writer, bool returnVoid, string namePrefix)
 {
     // looks like only constructors have no return type.
     // Body is checked to distinguish class and interface.
     bool isInterface = Definition.Body == null;
     ctx.WriteHeaders (Headers, writer, Definition.ReturnTypeName != null && !isInterface, false);
     Definition.OnGenerateCode (ctx, writer, returnVoid, namePrefix);
     writer.WriteLine ();
 }
コード例 #22
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     Expression.GenerateCode (ctx, writer);
     if (!ctx.InForHeadings)
         writer.WriteLine (';');
 }
コード例 #23
0
        public void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
        {
            string name = Type.ToCSharp ();

            // package functions cannot be imported. So disable them (as comment).
            switch (name) {
            case "flash.utils.getTimer":
                writer.Write ("// ");
                break;
            }

            // FIXME: this is sort of hack, but it is not really definite way to determine if the import is for a namespace or a type. So, basically I treat such ones that 1) if it ends with .* or 2) if the final identifier after '.' begins with Uppercase, as a namespace.
            bool isNS = name.EndsWith (".*", StringComparison.Ordinal);
            if (isNS)
                name = name.Substring (0, name.Length - 2);
            int idx = name.LastIndexOf ('.');
            if (idx > 0 && idx + 1 < name.Length && !Char.IsUpper (name [idx + 1]))
                isNS = true;
            if (isNS)
                writer.WriteLine ("using {0};", name);
            else
                writer.WriteLine ("using {0} = {1};", name.Substring (name.LastIndexOf ('.') + 1), Type.ToCSharp ());
        }
コード例 #24
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     ctx.WriteHeaders (Headers, writer, false, this is ConstantDeclaration);
     var bak = ctx.KnownLValueType;
     foreach (var ntv in NameTypeValues) {
         // because AS3 variable types could differ within a line (unlike C#), they have to be declared in split form (or I have to do something more complicated.)
         if (this is ConstantDeclaration)
             writer.Write ("const ");
         if (ntv.Type != null)
             writer.Write (ntv.Type.ToCSharp ());
         else if (ntv.Value != null)
             writer.Write ("var");
         else
             writer.Write ("dynamic");
         ctx.KnownLValueType = ntv.Type;
         writer.Write (' ');
         writer.Write (ctx.SafeName (ntv.Name));
         if (ntv.Value != null) {
             writer.Write (" = ");
             ntv.Value.GenerateCode (ctx, writer);
         }
         writer.WriteLine (';');
         ctx.KnownLValueType = null;
     }
     ctx.KnownLValueType = bak;
 }
コード例 #25
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     Primary.GenerateCode (ctx, writer);
     writer.Write (" is ");
     writer.Write (Type.ToCSharp ());
 }
コード例 #26
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     // probably the only difference from for-each is that it can declare local variable.
     writer.Write ("foreach (var ___");
     writer.Write (" in ");
     Target.GenerateCode (ctx, writer);
     writer.WriteLine (") {");
     Iterator.GenerateCode (ctx, writer);
     writer.WriteLine (" = ___;");
     Body.GenerateCode (ctx, writer);
     writer.WriteLine ("}");
 }
コード例 #27
0
        public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
        {
            var type = ctx.KnownLValueType != null ? ctx.KnownLValueType.GenericSubtype : null;

            writer.Write ("new {0} [] {{", type);
            foreach (var expr in Values) {
                var tail = Values.Last () == expr ? "" : ", ";
                expr.GenerateCode (ctx, writer);
                writer.Write (tail);
            }
            writer.Write ('}');
        }
コード例 #28
0
 public void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     if (LocalVariableType != null) {
         writer.Write (LocalVariableType.ToCSharp ());
         writer.Write (' ');
     }
     writer.Write (ctx.SafeName (Name));
 }
コード例 #29
0
 public override void GenerateCode(CodeGenerationContext ctx, TextWriter writer)
 {
     writer.Write ("Util.CreateLiteralHash (new object [] {");
     foreach (var pair in Values) {
         var tail = Values.Last () == pair ? "" : ", ";
         if (pair.Key is Literal)
             ((Literal) pair.Key).GenerateCode (ctx, writer);
         else
             writer.Write (ctx.SafeName ((Identifier) pair.Key));
         writer.Write (", ");
         pair.Value.GenerateCode (ctx, writer);
         writer.Write (tail);
     }
     writer.Write ("})");
 }
コード例 #30
0
 void GenerateFunctionBasedExpr(CodeGenerationContext ctx, TextWriter writer, string name)
 {
     Left.GenerateCode (ctx, writer);
     writer.Write (" = ");
     writer.Write (name);
     writer.Write (" (");
     Left.GenerateCode (ctx, writer);
     writer.Write (", ");
     Right.GenerateCode (ctx, writer);
     writer.Write (");");
 }