示例#1
0
        private static void GenerateResources(ScriptGenerator generator, ResourcesSymbol resourcesSymbol)
        {
            ScriptTextWriter writer        = generator.Writer;
            string           resourcesName = resourcesSymbol.FullGeneratedName;

            writer.Write(resourcesName);
            writer.WriteTrimmed(" = ");
            writer.WriteTrimmed("{ ");
            writer.WriteNewLine();
            writer.Indent++;

            bool firstValue = true;

            foreach (FieldSymbol member in resourcesSymbol.Members)
            {
                Debug.Assert(member.Value is string);

                if (firstValue == false)
                {
                    writer.Write(",");
                    writer.WriteLine();
                }

                writer.Write(member.GeneratedName);
                writer.WriteTrimmed(": ");
                writer.Write(Utility.QuoteString((string)member.Value));

                firstValue = false;
            }

            writer.Indent--;
            writer.WriteLine();
            writer.Write("};");
            writer.WriteNewLine();
        }
示例#2
0
        public static void GenerateScript(ScriptGenerator generator, NamespaceSymbol namespaceSymbol, Dictionary <string, bool> generatedNamespaces)
        {
            Debug.Assert(generator != null);
            Debug.Assert(namespaceSymbol != null);
            Debug.Assert(namespaceSymbol.HasApplicationTypes);

            ScriptTextWriter writer = generator.Writer;

            // First generate enums and interfaces which do not have cross-dependencies
            // (Classes for example, might have dependencies on enums)

            foreach (TypeSymbol type in namespaceSymbol.Types)
            {
                if (type.IsApplicationType)
                {
                    if (type.IsTestType && (generator.Options.IncludeTests == false))
                    {
                        continue;
                    }

                    string namespaceName = type.GeneratedNamespace;
                    if ((namespaceName.Length != 0) &&
                        (generatedNamespaces.ContainsKey(namespaceName) == false))
                    {
                        writer.Write("Type.registerNamespace('");
                        writer.Write(namespaceName);
                        writer.Write("');");
                        writer.WriteNewLine();
                        writer.WriteNewLine();
                        generatedNamespaces[namespaceName] = true;
                    }
                }

                if (type.IsApplicationType &&
                    ((type.Type == SymbolType.Enumeration) ||
                     (type.Type == SymbolType.Interface) ||
                     (type.Type == SymbolType.Record) ||
                     (type.Type == SymbolType.Resources)))
                {
                    TypeGenerator.GenerateScript(generator, type);
                }
            }

            foreach (TypeSymbol type in namespaceSymbol.Types)
            {
                if (type.IsApplicationType && (type.Type == SymbolType.Class))
                {
                    if (type.IsTestType && (generator.Options.IncludeTests == false))
                    {
                        continue;
                    }

                    TypeGenerator.GenerateScript(generator, type);
                }
            }
        }
示例#3
0
        public static void GenerateScript(ScriptGenerator generator, TypeSymbol typeSymbol)
        {
            Debug.Assert(generator != null);
            Debug.Assert(typeSymbol != null);
            Debug.Assert(typeSymbol.IsApplicationType);

            if ((typeSymbol.Type == SymbolType.Enumeration) && (typeSymbol.IsPublic == false))
            {
                // Internal enums can be skipped since their values have been inlined.
                return;
            }

            ScriptTextWriter writer = generator.Writer;

            if (generator.Options.Minimize == false)
            {
                writer.WriteLine(new String('/', 80));
                writer.WriteLine("// " + typeSymbol.FullGeneratedName);
                writer.WriteLine();
            }

            switch (typeSymbol.Type)
            {
            case SymbolType.Class:
                GenerateClass(generator, (ClassSymbol)typeSymbol);
                break;

            case SymbolType.Interface:
                GenerateInterface(generator, (InterfaceSymbol)typeSymbol);
                break;

            case SymbolType.Enumeration:
                GenerateEnumeration(generator, (EnumerationSymbol)typeSymbol);
                break;

            case SymbolType.Delegate:
                GenerateDelegate(generator, (DelegateSymbol)typeSymbol);
                break;

            case SymbolType.Record:
                GenerateRecord(generator, (RecordSymbol)typeSymbol);
                break;

            case SymbolType.Resources:
                GenerateResources(generator, (ResourcesSymbol)typeSymbol);
                break;
            }

            writer.WriteNewLine();
            writer.WriteNewLine();
        }
示例#4
0
        private static void GenerateIfElseStatement(ScriptGenerator generator, MemberSymbol symbol, IfElseStatement statement)
        {
            if ((statement.IfStatement == null) && (statement.ElseStatement == null))
            {
                return;
            }

            ScriptTextWriter writer = generator.Writer;

            writer.WriteTrimmed("if ");
            writer.Write("(");
            ExpressionGenerator.GenerateExpression(generator, symbol, statement.Condition);
            writer.WriteTrimmed(") ");
            writer.Write("{");
            writer.WriteNewLine();
            if (statement.IfStatement != null)
            {
                writer.Indent++;
                GenerateStatement(generator, symbol, statement.IfStatement);
                writer.Indent--;
            }
            writer.Write("}");
            writer.WriteNewLine();
            if (statement.ElseStatement != null)
            {
                bool writeEndBlock = false;

                if (statement.ElseStatement is IfElseStatement)
                {
                    writer.Write("else ");
                }
                else
                {
                    writer.WriteTrimmed("else ");
                    writer.Write("{");
                    writer.WriteNewLine();
                    writeEndBlock = true;
                    writer.Indent++;
                }
                GenerateStatement(generator, symbol, statement.ElseStatement);
                if (writeEndBlock)
                {
                    writer.Indent--;
                    writer.Write("}");
                    writer.WriteNewLine();
                }
            }
        }
示例#5
0
        public static void GenerateClassRegistrationScript(ScriptGenerator generator, ClassSymbol classSymbol)
        {
            // NOTE: This is emitted towards the end of the script file as opposed to immediately after the
            //       class definition, because it allows us to reference other class (base class, interfaces)
            //       without having to do a manual topological sort to get the ordering of class definitions
            //       that would be needed otherwise.

            ScriptTextWriter writer = generator.Writer;
            string           name   = classSymbol.FullGeneratedName;

            writer.Write(name);
            writer.Write(".registerClass('");
            writer.Write(name);
            writer.Write("'");

            // TODO: We need to introduce the notion of a base class that only exists in the metadata
            //       and not at runtime. At that point this check of IsTestClass can be generalized.
            if (classSymbol.IsTestClass)
            {
                writer.Write(");");
                writer.WriteNewLine();

                return;
            }

            if (classSymbol.BaseClass != null)
            {
                writer.WriteTrimmed(", ");
                writer.Write(classSymbol.BaseClass.FullGeneratedName);
            }

            if (classSymbol.Interfaces != null)
            {
                if (classSymbol.BaseClass == null)
                {
                    writer.WriteTrimmed(", ");
                    writer.Write("null");
                }
                foreach (InterfaceSymbol interfaceSymbol in classSymbol.Interfaces)
                {
                    writer.WriteTrimmed(", ");
                    writer.Write(interfaceSymbol.FullGeneratedName);
                }
            }

            writer.Write(");");
            writer.WriteNewLine();
        }
示例#6
0
        private static void GenerateBreakStatement(ScriptGenerator generator, MemberSymbol symbol, BreakStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            writer.Write("break;");
            writer.WriteNewLine();
        }
示例#7
0
        private static void GenerateField(ScriptGenerator generator, string typeName, FieldSymbol fieldSymbol)
        {
            ScriptTextWriter writer = generator.Writer;

            bool instanceMember = true;

            if ((fieldSymbol.Visibility & MemberVisibility.Static) != 0)
            {
                instanceMember = false;
                writer.Write(typeName);
                writer.Write(".");
            }

            writer.Write(fieldSymbol.GeneratedName);
            if (instanceMember)
            {
                writer.WriteTrimmed(": ");
            }
            else
            {
                writer.WriteTrimmed(" = ");
            }
            CodeGenerator.GenerateScript(generator, fieldSymbol);

            if (instanceMember == false)
            {
                writer.Write(";");
                writer.WriteNewLine();
            }
        }
示例#8
0
        private static void GenerateContinueStatement(ScriptGenerator generator, MemberSymbol symbol, ContinueStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            writer.Write("continue;");
            writer.WriteNewLine();
        }
示例#9
0
        private static void GenerateInterfaceComment(ScriptTextWriter writer, InterfaceSymbol interfaceSymbol) {
            writer.WriteNewLine();
            writer.Indent++;

            GenerateSummaryComment(writer, interfaceSymbol);

            writer.Indent--;
        }
示例#10
0
        private static void GenerateVariableDeclarationStatement(ScriptGenerator generator, MemberSymbol symbol, VariableDeclarationStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            GenerateVariableDeclarations(generator, symbol, statement);
            writer.Write(";");
            writer.WriteNewLine();
        }
示例#11
0
        private static void GenerateReturnStatement(ScriptGenerator generator, MemberSymbol symbol, ReturnStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            if (statement.Value != null)
            {
                writer.Write("return ");
                ExpressionGenerator.GenerateExpression(generator, symbol, statement.Value);
                writer.Write(";");
                writer.WriteNewLine();
            }
            else
            {
                writer.Write("return;");
                writer.WriteNewLine();
            }
        }
        private static void GenerateInterfaceComment(ScriptTextWriter writer, InterfaceSymbol interfaceSymbol)
        {
            writer.WriteNewLine();
            writer.Indent++;

            GenerateSummaryComment(writer, interfaceSymbol);

            writer.Indent--;
        }
示例#13
0
        private static void GenerateThrowStatement(ScriptGenerator generator, MemberSymbol symbol, ThrowStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            writer.Write("throw ");
            ExpressionGenerator.GenerateExpression(generator, symbol, statement.Value);
            writer.Write(";");
            writer.WriteNewLine();
        }
示例#14
0
        private static void GenerateWhileStatement(ScriptGenerator generator, MemberSymbol symbol, WhileStatement statement)
        {
            if (statement.Body == null)
            {
                return;
            }

            ScriptTextWriter writer = generator.Writer;

            if (statement.PreCondition)
            {
                writer.WriteTrimmed("while ");
                writer.Write("(");
                ExpressionGenerator.GenerateExpression(generator, symbol, statement.Condition);
                writer.WriteTrimmed(") ");
                writer.Write("{");
                writer.WriteNewLine();
            }
            else
            {
                writer.WriteTrimmed("do ");
                writer.Write("{");
                writer.WriteNewLine();
            }

            writer.Indent++;
            GenerateStatement(generator, symbol, statement.Body);
            writer.Indent--;

            if (statement.PreCondition)
            {
                writer.Write("}");
                writer.WriteNewLine();
            }
            else
            {
                writer.WriteTrimmed("} ");
                writer.WriteTrimmed("while ");
                writer.Write("(");
                ExpressionGenerator.GenerateExpression(generator, symbol, statement.Condition);
                writer.Write(");");
                writer.WriteNewLine();
            }
        }
示例#15
0
        private static void GenerateExpressionStatement(ScriptGenerator generator, MemberSymbol symbol, ExpressionStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            ExpressionGenerator.GenerateExpression(generator, symbol, statement.Expression);
            if (statement.IsFragment == false)
            {
                writer.Write(";");
                writer.WriteNewLine();
            }
        }
示例#16
0
        private static void GenerateSwitchStatement(ScriptGenerator generator, MemberSymbol symbol, SwitchStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            writer.WriteTrimmed("switch ");
            writer.Write("(");
            ExpressionGenerator.GenerateExpression(generator, symbol, statement.Condition);
            writer.WriteTrimmed(") ");
            writer.Write("{");
            writer.WriteNewLine();
            writer.Indent++;
            foreach (SwitchGroup group in statement.Groups)
            {
                if (group.Cases != null)
                {
                    foreach (Expression caseExpression in group.Cases)
                    {
                        writer.Write("case ");
                        ExpressionGenerator.GenerateExpression(generator, symbol, caseExpression);
                        writer.Write(":");
                        writer.WriteNewLine();
                    }
                }

                if (group.IncludeDefault)
                {
                    writer.Write("default:");
                    writer.WriteNewLine();
                }

                writer.Indent++;
                foreach (Statement childStatement in group.Statements)
                {
                    GenerateStatement(generator, symbol, childStatement);
                }
                writer.Indent--;
            }
            writer.Indent--;
            writer.Write("}");
            writer.WriteNewLine();
        }
示例#17
0
        private static void GenerateForStatement(ScriptGenerator generator, MemberSymbol symbol, ForStatement statement)
        {
            if (statement.Body == null)
            {
                return;
            }

            ScriptTextWriter writer = generator.Writer;

            writer.WriteTrimmed("for ");
            writer.Write("(");
            if (statement.Initializers != null)
            {
                ExpressionGenerator.GenerateExpressionList(generator, symbol, statement.Initializers);
            }
            else if (statement.Variables != null)
            {
                GenerateVariableDeclarations(generator, symbol, statement.Variables);
            }
            writer.WriteTrimmed("; ");
            if (statement.Condition != null)
            {
                ExpressionGenerator.GenerateExpression(generator, symbol, statement.Condition);
            }
            writer.WriteTrimmed("; ");
            if (statement.Increments != null)
            {
                ExpressionGenerator.GenerateExpressionList(generator, symbol, statement.Increments);
            }
            writer.WriteTrimmed(") ");
            writer.Write("{");
            writer.WriteNewLine();
            writer.Indent++;
            GenerateStatement(generator, symbol, statement.Body);
            writer.Indent--;
            writer.Write("}");
            writer.WriteNewLine();
        }
示例#18
0
        public static void GenerateClassConstructorScript(ScriptGenerator generator, ClassSymbol classSymbol)
        {
            // NOTE: This is emitted last in the script file, and separate from the initial class definition
            //       because it needs to be emitted after the class registration.

            foreach (MemberSymbol memberSymbol in classSymbol.Members)
            {
                if ((memberSymbol.Type == SymbolType.Field) &&
                    ((memberSymbol.Visibility & MemberVisibility.Static) != 0))
                {
                    if (((FieldSymbol)memberSymbol).IsConstant &&
                        ((memberSymbol.Visibility & (MemberVisibility.Public | MemberVisibility.Protected)) == 0))
                    {
                        // PrivateInstance/Internal constant fields are omitted since they have been inlined
                        continue;
                    }

                    MemberGenerator.GenerateScript(generator, memberSymbol);
                }
            }

            if (classSymbol.StaticConstructor != null)
            {
                ScriptTextWriter writer = generator.Writer;

                SymbolImplementation implementation = classSymbol.StaticConstructor.Implementation;
                bool requiresFunctionScope          = implementation.DeclaresVariables;

                if (requiresFunctionScope)
                {
                    writer.Write("(function");
                    writer.WriteTrimmed(" () ");
                    writer.Write("{");
                    writer.WriteNewLine();
                    writer.Indent++;
                }
                CodeGenerator.GenerateScript(generator, classSymbol.StaticConstructor);
                if (requiresFunctionScope)
                {
                    writer.Indent--;
                    writer.Write("})();");
                    writer.WriteSignificantNewLine();
                }
            }
        }
        private static void GenerateEnumerationComment(ScriptTextWriter writer, EnumerationSymbol enumSymbol)
        {
            writer.WriteNewLine();
            writer.Indent++;

            GenerateSummaryComment(writer, enumSymbol);

            foreach (MemberSymbol memberSymbol in enumSymbol.Members)
            {
                EnumerationFieldSymbol fieldSymbol = memberSymbol as EnumerationFieldSymbol;
                if (fieldSymbol != null)
                {
                    writer.WriteLine(
                        "/// <field name=\"{0}\" type=\"Number\" integer=\"true\" static=\"true\">",
                        fieldSymbol.GeneratedName);

                    GenerateFormattedComment(writer, fieldSymbol.Documentation);

                    writer.WriteLine("/// </field>");
                }
            }

            writer.Indent--;
        }
示例#20
0
        private static void GenerateTryCatchFinallyStatement(ScriptGenerator generator, MemberSymbol symbol, TryCatchFinallyStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            writer.WriteTrimmed("try ");
            writer.Write("{");
            writer.WriteNewLine();
            writer.Indent++;
            GenerateStatement(generator, symbol, statement.Body);
            writer.Indent--;
            writer.Write("}");
            writer.WriteNewLine();
            if (statement.Catch != null)
            {
                writer.WriteTrimmed("catch ");
                writer.Write("(");
                writer.Write(statement.ExceptionVariable.GeneratedName);
                writer.WriteTrimmed(") ");
                writer.Write("{");
                writer.WriteNewLine();
                writer.Indent++;
                GenerateStatement(generator, symbol, statement.Catch);
                writer.Indent--;
                writer.Write("}");
                writer.WriteNewLine();
            }
            if (statement.Finally != null)
            {
                writer.WriteTrimmed("finally ");
                writer.Write("{");
                writer.WriteNewLine();
                writer.Indent++;
                GenerateStatement(generator, symbol, statement.Finally);
                writer.Indent--;
                writer.Write("}");
                writer.WriteNewLine();
            }
        }
示例#21
0
        private static void GenerateEnumerationComment(ScriptTextWriter writer, EnumerationSymbol enumSymbol) {
            writer.WriteNewLine();
            writer.Indent++;

            GenerateSummaryComment(writer, enumSymbol);

            foreach (MemberSymbol memberSymbol in enumSymbol.Members) {
                EnumerationFieldSymbol fieldSymbol = memberSymbol as EnumerationFieldSymbol;
                if (fieldSymbol != null) {
                    writer.WriteLine(
                        "/// <field name=\"{0}\" type=\"Number\" integer=\"true\" static=\"true\">",
                        fieldSymbol.GeneratedName);

                    GenerateFormattedComment(writer, fieldSymbol.Documentation);

                    writer.WriteLine("/// </field>");
                }
            }

            writer.Indent--;
        }
示例#22
0
        private static void GenerateForInStatement(ScriptGenerator generator, MemberSymbol symbol, ForInStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            if (statement.IsDictionaryEnumeration)
            {
                writer.Write("var ");
                writer.Write(statement.DictionaryVariable.GeneratedName);
                writer.WriteTrimmed(" = ");
                ExpressionGenerator.GenerateExpression(generator, symbol, statement.CollectionExpression);
                writer.Write(";");
                writer.WriteNewLine();

                writer.WriteTrimmed("for ");
                writer.Write("(var ");
                writer.Write(statement.LoopVariable.GeneratedName);
                writer.Write(" in ");
                writer.Write(statement.DictionaryVariable.GeneratedName);
                writer.WriteTrimmed(") ");
                writer.Write("{");
                writer.WriteNewLine();
                writer.Indent++;
                writer.Write("var ");
                writer.Write(statement.ItemVariable.GeneratedName);
                writer.WriteTrimmed(" = ");
                writer.WriteTrimmed("{ ");
                writer.WriteTrimmed("key: ");
                writer.Write(statement.LoopVariable.GeneratedName);
                writer.WriteTrimmed(", ");
                writer.WriteTrimmed("value: ");
                writer.Write(statement.DictionaryVariable.GeneratedName);
                writer.Write("[");
                writer.Write(statement.LoopVariable.GeneratedName);
                writer.Write("]");
                writer.WriteTrimmed(" };");
                writer.WriteNewLine();
                GenerateStatement(generator, symbol, statement.Body);
                writer.Indent--;
                writer.Write("}");
                writer.WriteNewLine();
            }
            else
            {
                writer.Write("var ");
                writer.Write(statement.LoopVariable.GeneratedName);
                writer.WriteTrimmed(" = ");

                writer.Write("ss.IEnumerator.getEnumerator(");
                ExpressionGenerator.GenerateExpression(generator, symbol, statement.CollectionExpression);
                writer.Write(");");

                writer.WriteNewLine();

                writer.WriteTrimmed("while ");
                writer.Write("(");
                writer.Write(statement.LoopVariable.GeneratedName);
                writer.WriteTrimmed(".moveNext()) ");
                writer.Write("{");
                writer.WriteNewLine();
                writer.Indent++;

                writer.Write("var ");
                writer.Write(statement.ItemVariable.GeneratedName);
                writer.WriteTrimmed(" = ");
                writer.Write(statement.LoopVariable.GeneratedName);
                writer.Write(".current;");
                writer.WriteNewLine();

                GenerateStatement(generator, symbol, statement.Body);

                writer.Indent--;
                writer.Write("}");
                writer.WriteNewLine();
            }
        }
示例#23
0
        private static void GenerateRecord(ScriptGenerator generator, RecordSymbol recordSymbol)
        {
            ScriptTextWriter writer     = generator.Writer;
            string           recordName = recordSymbol.GeneratedName;

            if ((recordSymbol.Namespace.Length == 0) || recordSymbol.IgnoreNamespace)
            {
                writer.Write("window.");
            }
            else
            {
                writer.Write(recordSymbol.GeneratedNamespace);
                writer.Write(".");
            }
            writer.Write("$create_");
            writer.Write(recordName);
            writer.WriteTrimmed(" = ");
            writer.Write("function");
            if (generator.Options.DebugFlavor)
            {
                writer.Write(" ");
                writer.Write(recordSymbol.FullGeneratedName.Replace(".", "_"));
            }
            writer.Write("(");
            if (recordSymbol.Constructor != null)
            {
                ConstructorSymbol ctorSymbol = recordSymbol.Constructor;

                if (ctorSymbol.Parameters != null)
                {
                    bool firstParameter = true;
                    foreach (ParameterSymbol parameterSymbol in ctorSymbol.Parameters)
                    {
                        if (firstParameter == false)
                        {
                            writer.WriteTrimmed(", ");
                        }
                        writer.Write(parameterSymbol.GeneratedName);
                        firstParameter = false;
                    }
                }
            }
            writer.WriteTrimmed(")");
            writer.WriteTrimmed(" {");
            if (recordSymbol.Constructor != null)
            {
                writer.Indent++;
                writer.WriteNewLine();
                writer.Write("var $o");
                writer.WriteTrimmed(" = ");
                writer.WriteTrimmed("{ ");
                writer.Write("};");
                writer.WriteNewLine();
                CodeGenerator.GenerateScript(generator, recordSymbol.Constructor);
                writer.Write("return $o;");
                writer.WriteNewLine();
                writer.Indent--;
            }
            else
            {
                writer.WriteTrimmed(" return {}; ");
            }
            writer.Write("}");
            writer.WriteSignificantNewLine();
        }
示例#24
0
        private static void GenerateInterface(ScriptGenerator generator, InterfaceSymbol interfaceSymbol)
        {
            ScriptTextWriter writer        = generator.Writer;
            string           interfaceName = interfaceSymbol.FullGeneratedName;

            if (interfaceSymbol.Namespace.Length == 0)
            {
                writer.Write("window.");
            }

            writer.Write(interfaceName);
            writer.WriteTrimmed(" = ");
            writer.Write("function()");
            writer.WriteTrimmed(" { ");

            if (generator.Options.EnableDocComments)
            {
                DocCommentGenerator.GenerateComment(generator, interfaceSymbol);
            }

            writer.Write("};");
            writer.WriteNewLine();

            if (generator.Options.DebugFlavor)
            {
                writer.Write(interfaceName);
                writer.Write(".prototype = {");
                writer.WriteLine();
                writer.Indent++;
                bool firstMember = true;
                foreach (MemberSymbol member in interfaceSymbol.Members)
                {
                    if (firstMember == false)
                    {
                        writer.Write(",");
                        writer.WriteLine();
                    }

                    if (member.Type == SymbolType.Property)
                    {
                        writer.Write("get_");
                        writer.Write(member.GeneratedName);
                        writer.WriteTrimmed(" : ");
                        writer.Write("null");

                        if (((PropertySymbol)member).IsReadOnly == false)
                        {
                            writer.Write(",");
                            writer.WriteLine();

                            writer.Write("set_");
                            writer.Write(member.GeneratedName);
                            writer.WriteTrimmed(" : ");
                            writer.Write("null");
                        }
                    }
                    else if (member.Type == SymbolType.Event)
                    {
                        writer.Write("add_");
                        writer.Write(member.GeneratedName);
                        writer.WriteTrimmed(" : ");
                        writer.Write("null,");
                        writer.WriteLine();

                        writer.Write("remove_");
                        writer.Write(member.GeneratedName);
                        writer.WriteTrimmed(" : ");
                        writer.Write("null");
                    }
                    else
                    {
                        writer.Write(member.GeneratedName);
                        writer.WriteTrimmed(" : ");
                        writer.Write("null");
                    }
                    firstMember = false;
                }
                writer.Indent--;
                writer.WriteLine();
                writer.Write("}");
                writer.WriteSignificantNewLine();
            }

            writer.Write(interfaceName);
            writer.Write(".registerInterface('");
            writer.Write(interfaceName);
            writer.Write("');");
            writer.WriteNewLine();
        }
示例#25
0
        private static void GenerateEvent(ScriptGenerator generator, string typeName, EventSymbol eventSymbol)
        {
            ScriptTextWriter writer = generator.Writer;

            ParameterSymbol valueParameter = eventSymbol.Parameters[0];

            if (generator.Options.Minimize)
            {
                bool obfuscateParams = !eventSymbol.IsPublic;
                if (obfuscateParams)
                {
                    valueParameter.SetTransformedName("$p0");
                }
            }

            string eventName = eventSymbol.GeneratedName;
            string fieldName = eventName;

            if (eventSymbol.DefaultImplementation)
            {
                fieldName = "__" + Utility.CreateCamelCaseName(eventSymbol.Name);

                Debug.Assert(eventSymbol.Parent.Type == SymbolType.Class);

                Symbol fieldSymbol = ((ClassSymbol)eventSymbol.Parent).GetMember(fieldName);
                Debug.Assert((fieldSymbol != null) && (fieldSymbol.Type == SymbolType.Field));

                fieldName = fieldSymbol.GeneratedName;
            }

            string fieldReference;

            if ((eventSymbol.Visibility & MemberVisibility.Static) == 0)
            {
                fieldReference = "this.";
            }
            else
            {
                fieldReference = typeName + ".";
            }
            fieldReference += fieldName;

            bool instanceMember = true;

            if ((eventSymbol.Visibility & MemberVisibility.Static) != 0)
            {
                instanceMember = false;
                writer.Write(typeName);
                writer.Write(".");
            }

            writer.Write("add_");
            writer.Write(eventName);
            if (instanceMember)
            {
                writer.WriteTrimmed(": ");
            }
            else
            {
                writer.WriteTrimmed(" = ");
            }
            writer.Write("function");
            if (generator.Options.DebugFlavor)
            {
                writer.Write(" ");
                writer.Write(typeName.Replace(".", "_"));
                writer.Write("$add_");
                writer.Write(eventName);
            }
            writer.Write("(");
            writer.Write(valueParameter.GeneratedName);
            writer.Write(")");
            writer.WriteTrimmed(" {");
            writer.WriteNewLine();
            writer.Indent++;

            if (generator.Options.EnableDocComments)
            {
                DocCommentGenerator.GenerateComment(generator, eventSymbol);
            }

            if (eventSymbol.DefaultImplementation)
            {
                writer.Write(fieldReference);
                writer.WriteTrimmed(" = ");
                writer.Write("ss.Delegate.combine(");
                writer.Write(fieldReference);
                writer.WriteTrimmed(", ");
                writer.Write(valueParameter.GeneratedName);
                writer.Write(");");
                writer.WriteNewLine();
            }
            else
            {
                CodeGenerator.GenerateScript(generator, eventSymbol, /* add */ true);
            }
            writer.Indent--;
            writer.Write("}");

            if (instanceMember == false)
            {
                writer.WriteSignificantNewLine();
            }

            if (instanceMember)
            {
                writer.Write(",");
                writer.WriteNewLine();
            }
            else
            {
                writer.Write(typeName);
                writer.Write(".");
            }
            writer.Write("remove_");
            writer.Write(eventName);
            if (instanceMember)
            {
                writer.WriteTrimmed(": ");
            }
            else
            {
                writer.WriteTrimmed(" = ");
            }
            writer.Write("function");
            if (generator.Options.DebugFlavor)
            {
                writer.Write(" ");
                writer.Write(typeName.Replace(".", "_"));
                writer.Write("$remove_");
                writer.Write(eventName);
            }
            writer.Write("(");
            writer.Write(valueParameter.GeneratedName);
            writer.Write(")");
            writer.WriteTrimmed(" {");
            writer.WriteNewLine();
            writer.Indent++;

            if (generator.Options.EnableDocComments)
            {
                DocCommentGenerator.GenerateComment(generator, eventSymbol);
            }

            if (eventSymbol.DefaultImplementation)
            {
                writer.Write(fieldReference);
                writer.WriteTrimmed(" = ");
                writer.Write("ss.Delegate.remove(");
                writer.Write(fieldReference);
                writer.WriteTrimmed(", ");
                writer.Write(valueParameter.GeneratedName);
                writer.Write(");");
                writer.WriteNewLine();
            }
            else
            {
                CodeGenerator.GenerateScript(generator, eventSymbol, /* add */ false);
            }
            writer.Indent--;
            writer.Write("}");

            if (instanceMember == false)
            {
                writer.WriteSignificantNewLine();
            }
        }
示例#26
0
        private static void GenerateEnumeration(ScriptGenerator generator, EnumerationSymbol enumSymbol)
        {
            ScriptTextWriter writer = generator.Writer;

            if (enumSymbol.Namespace.Length == 0)
            {
                writer.Write("window.");
            }

            writer.Write(enumSymbol.FullGeneratedName);
            writer.WriteTrimmed(" = ");
            writer.Write("function()");
            writer.WriteTrimmed(" { ");

            if (generator.Options.EnableDocComments)
            {
                DocCommentGenerator.GenerateComment(generator, enumSymbol);
            }

            writer.Write("};");
            writer.WriteNewLine();
            writer.Write(enumSymbol.FullGeneratedName);
            writer.Write(".prototype = {");
            writer.Indent++;

            bool firstValue = true;

            foreach (MemberSymbol memberSymbol in enumSymbol.Members)
            {
                EnumerationFieldSymbol fieldSymbol = memberSymbol as EnumerationFieldSymbol;
                if (fieldSymbol == null)
                {
                    continue;
                }

                if (firstValue == false)
                {
                    writer.WriteTrimmed(", ");
                }

                writer.WriteNewLine();
                writer.Write(fieldSymbol.GeneratedName);
                writer.WriteTrimmed(": ");
                if (enumSymbol.UseNamedValues)
                {
                    writer.Write(Utility.QuoteString(enumSymbol.CreateNamedValue(fieldSymbol)));
                }
                else
                {
                    writer.Write(fieldSymbol.Value);
                }
                firstValue = false;
            }

            writer.Indent--;
            writer.WriteNewLine();
            writer.WriteTrimmed("}");
            writer.WriteSignificantNewLine();

            writer.Write(enumSymbol.FullGeneratedName);
            writer.Write(".registerEnum('");
            writer.Write(enumSymbol.FullGeneratedName);
            writer.WriteTrimmed("', ");
            writer.Write(enumSymbol.Flags ? "true" : "false");
            writer.Write(");");
            writer.WriteNewLine();
        }
示例#27
0
        private static void GenerateClass(ScriptGenerator generator, ClassSymbol classSymbol)
        {
            if (classSymbol.HasGlobalMethods)
            {
                GenerateGlobalMethods(generator, classSymbol);
                generator.AddGeneratedClass(classSymbol);
                return;
            }

            ScriptTextWriter writer = generator.Writer;
            string           name   = classSymbol.FullGeneratedName;

            if (classSymbol.Namespace.Length == 0)
            {
                writer.Write("window.");
            }

            writer.Write(name);
            writer.WriteTrimmed(" = ");
            writer.Write("function");
            if (generator.Options.DebugFlavor)
            {
                writer.Write(" ");
                writer.Write(name.Replace(".", "_"));
            }
            writer.Write("(");
            if ((classSymbol.Constructor != null) && (classSymbol.Constructor.Parameters != null))
            {
                bool firstParameter = true;
                foreach (ParameterSymbol parameterSymbol in classSymbol.Constructor.Parameters)
                {
                    if (firstParameter == false)
                    {
                        writer.WriteTrimmed(", ");
                    }
                    writer.Write(parameterSymbol.GeneratedName);
                    firstParameter = false;
                }
            }
            writer.WriteTrimmed(") ");
            writer.Write("{");
            writer.WriteNewLine();
            writer.Indent++;

            if (generator.Options.EnableDocComments)
            {
                DocCommentGenerator.GenerateComment(generator, classSymbol);
            }

            foreach (MemberSymbol memberSymbol in classSymbol.Members)
            {
                if ((memberSymbol.Type == SymbolType.Field) &&
                    (memberSymbol.Visibility & MemberVisibility.Static) == 0)
                {
                    FieldSymbol fieldSymbol = (FieldSymbol)memberSymbol;
                    if (fieldSymbol.HasInitializer)
                    {
                        writer.Write("this.");
                        writer.Write(fieldSymbol.GeneratedName);
                        writer.WriteTrimmed(" = ");
                        CodeGenerator.GenerateScript(generator, fieldSymbol);
                        writer.Write(";");
                        writer.WriteNewLine();
                    }
                }
            }
            if (classSymbol.Constructor != null)
            {
                CodeGenerator.GenerateScript(generator, classSymbol.Constructor);
            }
            else if (classSymbol.BaseClass != null)
            {
                writer.Write(classSymbol.FullGeneratedName);
                writer.Write(".initializeBase(this);");
                writer.WriteNewLine();
            }
            writer.Indent--;
            writer.Write("}");
            writer.WriteSignificantNewLine();

            foreach (MemberSymbol memberSymbol in classSymbol.Members)
            {
                if ((memberSymbol.Type != SymbolType.Field) &&
                    (memberSymbol.Visibility & MemberVisibility.Static) != 0)
                {
                    MemberGenerator.GenerateScript(generator, memberSymbol);
                }
            }

            bool hasPrototypeMembers = false;
            bool firstMember         = true;
            bool lastMemberWasField  = true;

            foreach (MemberSymbol memberSymbol in classSymbol.Members)
            {
                if ((memberSymbol.Visibility & MemberVisibility.Static) == 0)
                {
                    if ((memberSymbol.Type == SymbolType.Field) &&
                        ((FieldSymbol)memberSymbol).HasInitializer)
                    {
                        continue;
                    }

                    if ((memberSymbol is CodeMemberSymbol) &&
                        ((CodeMemberSymbol)memberSymbol).IsAbstract)
                    {
                        continue;
                    }

                    if (hasPrototypeMembers == false)
                    {
                        hasPrototypeMembers = true;

                        writer.Write(name);
                        writer.Write(".prototype");
                        writer.WriteTrimmed(" = ");
                        writer.Write("{");
                        writer.WriteNewLine();
                        writer.Indent++;
                    }

                    if (firstMember == false)
                    {
                        writer.Write(",");
                        writer.WriteNewLine();
                    }
                    if ((lastMemberWasField == false) || !(memberSymbol is FieldSymbol))
                    {
                        writer.WriteNewLine();
                    }

                    MemberGenerator.GenerateScript(generator, memberSymbol);
                    lastMemberWasField = (memberSymbol is FieldSymbol);
                    firstMember        = false;
                }
            }

            if (classSymbol.Indexer != null)
            {
                if (hasPrototypeMembers == false)
                {
                    hasPrototypeMembers = true;

                    writer.Write(name);
                    writer.Write(".prototype");
                    writer.WriteTrimmed(" = ");
                    writer.Write("{");
                    writer.WriteNewLine();
                    writer.Indent++;
                }
                if (firstMember == false)
                {
                    writer.Write(",");
                    writer.WriteNewLine();
                }

                MemberGenerator.GenerateScript(generator, classSymbol.Indexer);
            }

            if (hasPrototypeMembers)
            {
                writer.Indent--;
                writer.WriteNewLine();
                writer.Write("}");
                writer.WriteSignificantNewLine();
            }

            generator.AddGeneratedClass(classSymbol);
        }
示例#28
0
        private static void GenerateProperty(ScriptGenerator generator, string typeName, PropertySymbol propertySymbol)
        {
            if (propertySymbol.IsAbstract)
            {
                return;
            }

            ScriptTextWriter writer = generator.Writer;

            bool instanceMember = true;

            if ((propertySymbol.Visibility & MemberVisibility.Static) != 0)
            {
                instanceMember = false;
                writer.Write(typeName);
                writer.Write(".");
            }

            writer.Write("get_");
            writer.Write(propertySymbol.GeneratedName);
            if (instanceMember)
            {
                writer.WriteTrimmed(": ");
            }
            else
            {
                writer.WriteTrimmed(" = ");
            }
            writer.Write("function");
            if (generator.Options.DebugFlavor)
            {
                writer.Write(" ");
                writer.Write(typeName.Replace(".", "_"));
                writer.Write("$get_");
                writer.Write(propertySymbol.GeneratedName);
            }
            writer.Write("()");
            writer.WriteTrimmed(" {");
            writer.WriteNewLine();
            writer.Indent++;

            if (generator.Options.EnableDocComments)
            {
                DocCommentGenerator.GenerateComment(generator, propertySymbol);
            }

            CodeGenerator.GenerateScript(generator, propertySymbol, /* getter */ true);
            writer.Indent--;
            writer.Write("}");

            if (instanceMember == false)
            {
                writer.WriteSignificantNewLine();
            }

            if (propertySymbol.IsReadOnly == false)
            {
                ParameterSymbol valueParameter = propertySymbol.Parameters[0];
                if (generator.Options.Minimize)
                {
                    bool obfuscateParams = !propertySymbol.IsPublic;
                    if (obfuscateParams)
                    {
                        valueParameter.SetTransformedName("$p0");
                    }
                }

                if (instanceMember)
                {
                    writer.Write(",");
                    writer.WriteNewLine();
                }
                else
                {
                    writer.Write(typeName);
                    writer.Write(".");
                }

                writer.Write("set_");
                writer.Write(propertySymbol.GeneratedName);
                if (instanceMember)
                {
                    writer.WriteTrimmed(": ");
                }
                else
                {
                    writer.WriteTrimmed(" = ");
                }
                writer.Write("function");
                if (generator.Options.DebugFlavor)
                {
                    writer.Write(" ");
                    writer.Write(typeName.Replace(".", "_"));
                    writer.Write("$set_");
                    writer.Write(propertySymbol.GeneratedName);
                }
                writer.Write("(");
                writer.Write(valueParameter.GeneratedName);
                writer.Write(")");
                writer.WriteTrimmed(" {");
                writer.WriteNewLine();
                writer.Indent++;

                if (generator.Options.EnableDocComments)
                {
                    DocCommentGenerator.GenerateComment(generator, propertySymbol);
                }

                CodeGenerator.GenerateScript(generator, propertySymbol, /* getter */ false);
                writer.Write("return ");
                writer.Write(valueParameter.GeneratedName);
                writer.Write(";");
                writer.WriteNewLine();
                writer.Indent--;
                writer.Write("}");

                if (instanceMember == false)
                {
                    writer.WriteSignificantNewLine();
                }
            }
        }
示例#29
0
        private static void GenerateMethod(ScriptGenerator generator, string typeName, MethodSymbol methodSymbol)
        {
            if (methodSymbol.IsAbstract)
            {
                return;
            }

            ScriptTextWriter writer = generator.Writer;

            bool instanceMember = ((methodSymbol.Visibility & MemberVisibility.Static) == 0);

            if (instanceMember == false)
            {
                if (methodSymbol.IsGlobalMethod)
                {
                    string mixinRoot = null;
                    if (methodSymbol.Parent.Type == SymbolType.Class)
                    {
                        mixinRoot = ((ClassSymbol)methodSymbol.Parent).MixinRoot;
                    }
                    if (String.IsNullOrEmpty(mixinRoot))
                    {
                        mixinRoot = "window";
                    }

                    writer.Write(mixinRoot);
                }
                else
                {
                    writer.Write(typeName);
                }

                writer.Write(".");
            }

            writer.Write(methodSymbol.GeneratedName);
            if (instanceMember)
            {
                writer.WriteTrimmed(": ");
            }
            else
            {
                writer.WriteTrimmed(" = ");
            }

            writer.Write("function");
            if (generator.Options.DebugFlavor)
            {
                writer.Write(" ");
                writer.Write(typeName.Replace(".", "_"));
                writer.Write("$");
                writer.Write(methodSymbol.GeneratedName);
            }
            writer.Write("(");
            if (methodSymbol.Parameters != null)
            {
                bool obfuscateParams = false;
                if (generator.Options.Minimize)
                {
                    obfuscateParams = !methodSymbol.IsPublic;
                }

                int paramIndex = 0;
                foreach (ParameterSymbol parameterSymbol in methodSymbol.Parameters)
                {
                    if (paramIndex > 0)
                    {
                        writer.WriteTrimmed(", ");
                    }
                    if (obfuscateParams)
                    {
                        parameterSymbol.SetTransformedName("$p" + paramIndex);
                    }
                    writer.Write(parameterSymbol.GeneratedName);

                    paramIndex++;
                }
            }
            writer.WriteTrimmed(") ");
            writer.Write("{");
            writer.WriteNewLine();
            writer.Indent++;

            if (generator.Options.EnableDocComments)
            {
                DocCommentGenerator.GenerateComment(generator, methodSymbol);
            }

            CodeGenerator.GenerateScript(generator, methodSymbol);
            writer.Indent--;
            writer.Write("}");

            if (instanceMember == false)
            {
                writer.WriteSignificantNewLine();
            }
        }
示例#30
0
        private static void GenerateIndexer(ScriptGenerator generator, string typeName, PropertySymbol indexerSymbol)
        {
            if (indexerSymbol.IsAbstract)
            {
                return;
            }

            ScriptTextWriter writer = generator.Writer;

            bool instanceMember = true;

            if ((indexerSymbol.Visibility & MemberVisibility.Static) != 0)
            {
                instanceMember = false;
                writer.Write(typeName);
                writer.Write(".");
            }

            bool obfuscateParams = !indexerSymbol.IsPublic;

            if (obfuscateParams && generator.Options.Minimize)
            {
                for (int i = 0; i < indexerSymbol.Parameters.Count; i++)
                {
                    ParameterSymbol parameterSymbol = indexerSymbol.Parameters[i];
                    parameterSymbol.SetTransformedName("$p" + i);
                }
            }

            writer.Write("get_");
            writer.Write(indexerSymbol.GeneratedName);
            if (instanceMember)
            {
                writer.WriteTrimmed(": ");
            }
            else
            {
                writer.WriteTrimmed(" = ");
            }

            writer.Write("function");
            if (generator.Options.DebugFlavor)
            {
                writer.Write(" ");
                writer.Write(typeName.Replace(".", "_"));
                writer.Write("$get_");
                writer.Write(indexerSymbol.GeneratedName);
            }

            writer.Write("(");

            for (int i = 0; i < indexerSymbol.Parameters.Count - 1; i++)
            {
                ParameterSymbol parameterSymbol = indexerSymbol.Parameters[i];
                if (i > 0)
                {
                    writer.WriteTrimmed(", ");
                }
                writer.Write(parameterSymbol.GeneratedName);
            }

            writer.Write(")");
            writer.WriteTrimmed(" {");
            writer.WriteNewLine();
            writer.Indent++;

            if (generator.Options.EnableDocComments)
            {
                DocCommentGenerator.GenerateComment(generator, indexerSymbol);
            }

            CodeGenerator.GenerateScript(generator, (IndexerSymbol)indexerSymbol, /* getter */ true);
            writer.Indent--;
            writer.Write("}");

            if (instanceMember == false)
            {
                writer.WriteSignificantNewLine();
            }

            if (indexerSymbol.IsReadOnly == false)
            {
                if (instanceMember)
                {
                    writer.Write(",");
                    writer.WriteNewLine();
                }
                else
                {
                    writer.Write(typeName);
                    writer.Write(".");
                }

                writer.Write("set_");
                writer.Write(indexerSymbol.GeneratedName);
                if (instanceMember)
                {
                    writer.WriteTrimmed(": ");
                }
                else
                {
                    writer.WriteTrimmed(" = ");
                }
                writer.Write("function");
                if (generator.Options.DebugFlavor)
                {
                    writer.Write(" ");
                    writer.Write(typeName.Replace(".", "_"));
                    writer.Write("$set_");
                    writer.Write(indexerSymbol.GeneratedName);
                }
                writer.Write("(");
                for (int i = 0; i < indexerSymbol.Parameters.Count; i++)
                {
                    ParameterSymbol parameterSymbol = indexerSymbol.Parameters[i];
                    if (i > 0)
                    {
                        writer.WriteTrimmed(", ");
                    }
                    writer.Write(parameterSymbol.GeneratedName);
                }
                writer.Write(")");
                writer.WriteTrimmed(" {");
                writer.WriteNewLine();
                writer.Indent++;

                if (generator.Options.EnableDocComments)
                {
                    DocCommentGenerator.GenerateComment(generator, indexerSymbol);
                }

                CodeGenerator.GenerateScript(generator, (IndexerSymbol)indexerSymbol, /* getter */ false);
                writer.Write("return ");
                writer.Write(indexerSymbol.Parameters[indexerSymbol.Parameters.Count - 1].GeneratedName);
                writer.Write(";");
                writer.WriteNewLine();
                writer.Indent--;
                writer.Write("}");

                if (instanceMember == false)
                {
                    writer.WriteSignificantNewLine();
                }
            }
        }