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

            writer.Write("var ");
            writer.Write(resourcesName);
            writer.WriteLine(" = {");
            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.Write(": ");
                writer.Write(Utility.QuoteString((string)member.Value));

                firstValue = false;
            }

            writer.Indent--;
            writer.WriteLine();
            writer.Write("};");
            writer.WriteLine();
        }
Esempio n. 2
0
        private static void GenerateSummaryComment(ScriptTextWriter writer, Symbol symbol)
        {
            string documentation = symbol.Documentation;

            if (string.IsNullOrEmpty(documentation) == false)
            {
                writer.WriteLine("/// <summary>");
                GenerateFormattedComment(writer, documentation);
                writer.WriteLine("/// </summary>");
            }
        }
Esempio n. 3
0
        private static void GenerateImplementationScript(
            ScriptGenerator generator,
            MemberSymbol symbol,
            SymbolImplementation implementation)
        {
            if (implementation == null)
            {
                throw new ArgumentNullException(nameof(implementation), $"Member: {symbol?.Name} has no valid implementation");
            }

            generator.StartImplementation(implementation);

            try
            {
                bool generateThisCacheStatement = false;

                if ((symbol.Visibility & MemberVisibility.Static) == 0)
                {
                    if (symbol is CodeMemberSymbol codeMemberSymbol && codeMemberSymbol.AnonymousMethods != null)
                    {
                        foreach (AnonymousMethodSymbol anonymousMethod in codeMemberSymbol.AnonymousMethods)
                        {
                            if ((anonymousMethod.Visibility & MemberVisibility.Static) == 0)
                            {
                                generateThisCacheStatement = true;

                                break;
                            }
                        }
                    }
                }

                if (generateThisCacheStatement)
                {
                    ScriptTextWriter writer = generator.Writer;

                    writer.WriteLine("var $this = this;");
                    writer.WriteLine();
                }

                foreach (Statement statement in implementation.Statements)
                {
                    StatementGenerator.GenerateStatement(generator, symbol, statement);
                }
            }
            catch (Exception e)
            {
                throw;
            }
            finally
            {
                generator.EndImplementation();
            }
        }
Esempio n. 4
0
        private static void GenerateErrorStatement(ScriptGenerator generator, MemberSymbol symbol,
                                                   ErrorStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            writer.Write("// ERROR: ");
            writer.Write(statement.Message);
            writer.WriteLine();
            writer.Write("// ERROR: at ");
            writer.Write(statement.Location);
            writer.WriteLine();
        }
Esempio n. 5
0
        private static void GenerateParameterComment(ScriptTextWriter writer, ParameterSymbol parameterSymbol)
        {
            writer.Write("/// <param name=\"{0}\"", parameterSymbol.GeneratedName);

            GenerateTypeAttributes(writer, parameterSymbol.ValueType);

            writer.WriteLine(">");

            GenerateFormattedComment(writer, parameterSymbol.Documentation);

            writer.WriteLine("/// </param>");
        }
Esempio n. 6
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.Delegate)
            {
                // No-op ... there is currently nothing to generate for a particular delegate type
                return;
            }

            if (typeSymbol.Type == SymbolType.Record &&
                typeSymbol.IsPublic == false &&
                ((RecordSymbol)typeSymbol).Constructor == null)
            {
                // Nothing to generate for internal records with no explicit ctor
                return;
            }

            ScriptTextWriter writer = generator.Writer;

            writer.WriteLine("// " + typeSymbol.FullName);
            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.Record:
                GenerateRecord(generator, (RecordSymbol)typeSymbol);
                break;

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

            writer.WriteLine();
            writer.WriteLine();
        }
Esempio n. 7
0
        private static void GenerateEnumeration(ScriptGenerator generator, EnumerationSymbol enumSymbol)
        {
            ScriptTextWriter writer   = generator.Writer;
            string           enumName = enumSymbol.FullGeneratedName;

            writer.Write("var ");
            writer.Write(enumName);
            writer.Write(" = new ");
            writer.Write(DSharpStringResources.ScriptExportMember("Enum"));
            writer.Write("('");
            writer.Write(enumName);
            writer.Write("', ");
            writer.Write("{");
            writer.Indent++;

            bool firstValue = true;

            foreach (MemberSymbol memberSymbol in enumSymbol.Members)
            {
                if (!(memberSymbol is EnumerationFieldSymbol fieldSymbol))
                {
                    continue;
                }

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

                writer.WriteLine();
                writer.Write(fieldSymbol.GeneratedName);
                writer.Write(": ");

                if (enumSymbol.UseNamedValues)
                {
                    writer.Write(Utility.QuoteString(enumSymbol.CreateNamedValue(fieldSymbol)));
                }
                else
                {
                    writer.Write(fieldSymbol.Value);
                }

                firstValue = false;
            }

            writer.Indent--;
            writer.WriteLine();
            writer.Write("});");
            writer.WriteLine();
        }
Esempio n. 8
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)
                {
                    FieldSymbol fieldSymbol = (FieldSymbol)memberSymbol;

                    if (fieldSymbol.IsConstant &&
                        (memberSymbol.Visibility & (MemberVisibility.Public | MemberVisibility.Protected)) == 0)
                    {
                        // PrivateInstance/Internal constant fields are omitted since they have been inlined
                        continue;
                    }

                    if (fieldSymbol.HasInitializer)
                    {
                        MemberGenerator.GenerateScript(generator, memberSymbol);
                    }
                }
            }

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

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

                if (requiresFunctionScope)
                {
                    writer.WriteLine("(function() {");
                    writer.Indent++;
                }

                CodeGenerator.GenerateScript(generator, classSymbol.StaticConstructor);

                if (requiresFunctionScope)
                {
                    writer.Indent--;
                    writer.Write("})();");
                    writer.WriteLine();
                }
            }
        }
Esempio n. 9
0
        private static void GenerateIfElseStatement(ScriptGenerator generator, MemberSymbol symbol,
                                                    IfElseStatement statement)
        {
            if (statement.IfStatement == null && statement.ElseStatement == null)
            {
                return;
            }

            ScriptTextWriter writer = generator.Writer;

            writer.Write("if (");
            ExpressionGenerator.GenerateExpression(generator, symbol, statement.Condition);
            writer.WriteLine(") {");

            if (statement.IfStatement != null)
            {
                writer.Indent++;
                GenerateStatement(generator, symbol, statement.IfStatement);
                writer.Indent--;
            }

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

            if (statement.ElseStatement != null)
            {
                bool writeEndBlock = false;

                if (statement.ElseStatement is IfElseStatement)
                {
                    writer.Write("else ");
                }
                else
                {
                    writer.WriteLine("else {");
                    writeEndBlock = true;
                    writer.Indent++;
                }

                GenerateStatement(generator, symbol, statement.ElseStatement);

                if (writeEndBlock)
                {
                    writer.Indent--;
                    writer.WriteLine("}");
                }
            }
        }
Esempio n. 10
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;
            }

            if (propertySymbol.HasGetter)
            {
                GeneratePropertyGetter(generator, typeName, propertySymbol, writer, instanceMember);
            }

            if (propertySymbol.HasSetter)
            {
                if (instanceMember && propertySymbol.HasGetter)
                {
                    writer.WriteLine(",");
                }

                GeneratePropertySetter(generator, typeName, propertySymbol, writer, instanceMember);
            }
        }
Esempio n. 11
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.Write(": ");
            }
            else
            {
                writer.Write(" = ");
            }

            CodeGenerator.GenerateScript(generator, fieldSymbol);

            if (instanceMember == false)
            {
                writer.WriteLine(";");
            }
        }
Esempio n. 12
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.WriteLine(";");
            }
            else
            {
                writer.WriteLine("return;");
            }
        }
Esempio n. 13
0
        private static void GenerateRecord(ScriptGenerator generator, RecordSymbol recordSymbol)
        {
            ScriptTextWriter writer     = generator.Writer;
            string           recordName = recordSymbol.FullGeneratedName;

            writer.Write("function ");
            writer.Write(recordName);
            writer.Write("(");

            ConstructorSymbol ctorSymbol = recordSymbol.Constructor;

            if (ctorSymbol?.Parameters != null)
            {
                bool firstParameter = true;

                foreach (ParameterSymbol parameterSymbol in ctorSymbol.Parameters)
                {
                    if (firstParameter == false)
                    {
                        writer.Write(", ");
                    }

                    writer.Write(parameterSymbol.GeneratedName);
                    firstParameter = false;
                }
            }

            writer.Write(") {");

            if (recordSymbol.Constructor != null)
            {
                writer.Indent++;
                writer.WriteLine();
                writer.WriteLine("var $o = {};");
                CodeGenerator.GenerateScript(generator, recordSymbol.Constructor);
                writer.Write("return $o;");
                writer.WriteLine();
                writer.Indent--;
            }
            else
            {
                writer.Write(" return {}; ");
            }

            writer.Write("}");
            writer.WriteLine();
        }
Esempio n. 14
0
        private static void GenerateClassMembers(ScriptGenerator generator, ClassSymbol classSymbol, ScriptTextWriter writer, string name)
        {
            if (classSymbol.IsStaticClass)
            {
                return;
            }

            writer.Write("var ");
            writer.Write(name);
            writer.WriteLine("$ = {");
            writer.Indent++;

            bool firstMember = true;

            foreach (MemberSymbol memberSymbol in classSymbol.Members.Where(member => !member.Visibility.HasFlag(MemberVisibility.Static)))
            {
                if (memberSymbol.Type == SymbolType.Field ||
                    (memberSymbol is CodeMemberSymbol codeMemberSymbol && codeMemberSymbol.IsAbstract) ||
                    (memberSymbol is PropertySymbol propertySymbol && propertySymbol.IsAutoProperty()))
                {
                    continue;
                }

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

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

            if (classSymbol.Indexer != null)
            {
                if (firstMember == false)
                {
                    writer.WriteLine(",");
                }

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

            writer.Indent--;
            writer.WriteLine();
            writer.Write("};");
            writer.WriteLine();
        }
Esempio n. 15
0
        private static void GenerateBreakStatement(ScriptGenerator generator, MemberSymbol symbol,
                                                   BreakStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            writer.Write("break;");
            writer.WriteLine();
        }
Esempio n. 16
0
        private static void GenerateVariableDeclarationStatement(ScriptGenerator generator, MemberSymbol symbol,
                                                                 VariableDeclarationStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            GenerateVariableDeclarations(generator, symbol, statement);
            writer.WriteLine(";");
        }
Esempio n. 17
0
        private static void GenerateFieldComment(ScriptTextWriter writer, FieldSymbol fieldSymbol)
        {
            writer.Write("/// <field name=\"{0}\"", fieldSymbol.GeneratedName);

            GenerateTypeAttributes(writer, fieldSymbol.AssociatedType);

            if ((fieldSymbol.Visibility & MemberVisibility.Static) != 0)
            {
                writer.Write(" static=\"true\"");
            }

            writer.WriteLine(">");

            GenerateFormattedComment(writer, fieldSymbol.Documentation);

            writer.WriteLine("/// </field>");
        }
Esempio n. 18
0
        private static void GenerateContinueStatement(ScriptGenerator generator, MemberSymbol symbol,
                                                      ContinueStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            writer.Write("continue;");
            writer.WriteLine();
        }
Esempio n. 19
0
        private static void GenerateUsingStatement(ScriptGenerator generator, MemberSymbol symbol,
                                                   UsingStatement statement)
        {
            GenerateVariableDeclarationStatement(generator, symbol, statement.Guard);
            ScriptTextWriter writer = generator.Writer;

            writer.WriteLine("try {");
            writer.Indent++;
            GenerateStatement(generator, symbol, statement.Body);
            writer.Indent--;
            writer.WriteLine("}");
            writer.WriteLine("finally {");
            writer.Indent++;

            foreach (VariableSymbol variable in statement.Guard.Variables)
            {
                writer.Write("if(");
                writer.Write(variable.GeneratedName);
                writer.WriteLine(") {");
                writer.Indent++;
                writer.Write(variable.GeneratedName);
                writer.Write(".");
                writer.Write(variable.ValueType.GetMember("Dispose").GeneratedName);
                writer.WriteLine("();");
                writer.Indent--;
                writer.WriteLine("}");
            }

            writer.Indent--;
            writer.WriteLine("}");
        }
Esempio n. 20
0
        private static void GenerateInterfaceComment(ScriptTextWriter writer, InterfaceSymbol interfaceSymbol)
        {
            writer.WriteLine();
            writer.Indent++;

            GenerateSummaryComment(writer, interfaceSymbol);

            writer.Indent--;
        }
Esempio n. 21
0
        private static void GenerateInterface(ScriptGenerator generator, InterfaceSymbol interfaceSymbol)
        {
            ScriptTextWriter writer        = generator.Writer;
            string           interfaceName = interfaceSymbol.FullGeneratedName;

            writer.Write("function ");
            writer.Write(interfaceName);
            writer.WriteLine("() { }");
        }
Esempio n. 22
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.WriteLine(";");
        }
Esempio n. 23
0
        private static void GeneratePropertySetter(ScriptGenerator generator, string typeName,
                                                   PropertySymbol propertySymbol, ScriptTextWriter writer,
                                                   bool instanceMember)
        {
            ParameterSymbol valueParameter = propertySymbol.Parameters[0];

            if (instanceMember)
            {
                writer.Write("$set_");
                writer.Write(propertySymbol.GeneratedName);
                writer.Write(": ");
            }
            else
            {
                writer.Write($"{DSharpStringResources.ScriptExportMember("createPropertySet")}(");
                writer.Write(typeName);
                writer.Write(", '");
                writer.Write(propertySymbol.GeneratedName);
                writer.Write("', ");
            }

            writer.Write("function(");
            writer.Write(valueParameter.GeneratedName);
            writer.WriteLine(") {");
            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.WriteLine();
            writer.Indent--;
            writer.Write("}");

            if (instanceMember == false)
            {
                writer.WriteLine(");");
            }
        }
Esempio n. 24
0
        private static void GeneratePropertyComment(ScriptTextWriter writer, PropertySymbol propertySymbol)
        {
            GenerateSummaryComment(writer, propertySymbol);

            writer.Write("/// <value");

            GenerateTypeAttributes(writer, propertySymbol.AssociatedType);

            writer.WriteLine("></value>");
        }
Esempio n. 25
0
        private static void GenerateForStatement(ScriptGenerator generator, MemberSymbol symbol, ForStatement statement)
        {
            if (statement.Body == null)
            {
                return;
            }

            ScriptTextWriter writer = generator.Writer;

            writer.Write("for ");
            writer.Write("(");

            if (statement.Initializers != null)
            {
                ExpressionGenerator.GenerateExpressionList(generator, symbol, statement.Initializers);
            }
            else if (statement.Variables != null)
            {
                GenerateVariableDeclarations(generator, symbol, statement.Variables);
            }

            writer.Write("; ");

            if (statement.Condition != null)
            {
                ExpressionGenerator.GenerateExpression(generator, symbol, statement.Condition);
            }

            writer.Write("; ");

            if (statement.Increments != null)
            {
                ExpressionGenerator.GenerateExpressionList(generator, symbol, statement.Increments);
            }

            writer.WriteLine(") {");
            writer.Indent++;
            GenerateStatement(generator, symbol, statement.Body);
            writer.Indent--;
            writer.Write("}");
            writer.WriteLine();
        }
Esempio n. 26
0
        private static void GenerateFormattedComment(ScriptTextWriter writer, string text)
        {
            foreach (string line in text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries))
            {
                string trimmedLine = line.Trim();

                if (!string.IsNullOrEmpty(trimmedLine))
                {
                    writer.WriteLine("/// {0}", trimmedLine);
                }
            }
        }
Esempio n. 27
0
        private static void GenerateTryCatchFinallyStatement(ScriptGenerator generator, MemberSymbol symbol,
                                                             TryCatchFinallyStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            writer.WriteLine("try {");
            writer.Indent++;
            GenerateStatement(generator, symbol, statement.Body);
            writer.Indent--;
            writer.WriteLine("}");

            if (statement.Catch != null)
            {
                writer.Write("catch (");
                writer.Write(statement.ExceptionVariable.GeneratedName);
                writer.WriteLine(") {");
                writer.Indent++;
                GenerateStatement(generator, symbol, statement.Catch);
                writer.Indent--;
                writer.WriteLine("}");
            }

            if (statement.Finally != null)
            {
                writer.WriteLine("finally {");
                writer.Indent++;
                GenerateStatement(generator, symbol, statement.Finally);
                writer.Indent--;
                writer.WriteLine("}");
            }
        }
Esempio n. 28
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.WriteLine();
            }
        }
Esempio n. 29
0
        private static void GenerateReturnsComment(ScriptTextWriter writer, TypeSymbol typeSymbol)
        {
            if (IsVoid(typeSymbol))
            {
                return;
            }

            writer.Write("/// <returns");

            GenerateTypeAttributes(writer, typeSymbol);

            writer.WriteLine("></returns>");
        }
Esempio n. 30
0
        private static void GenerateSwitchStatement(ScriptGenerator generator, MemberSymbol symbol,
                                                    SwitchStatement statement)
        {
            ScriptTextWriter writer = generator.Writer;

            writer.Write("switch (");
            ExpressionGenerator.GenerateExpression(generator, symbol, statement.Condition);
            writer.WriteLine(") {");
            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.WriteLine(":");
                    }
                }

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

                writer.Indent++;
                foreach (Statement childStatement in group.Statements)
                {
                    GenerateStatement(generator, symbol, childStatement);
                }
                writer.Indent--;
            }

            writer.Indent--;
            writer.WriteLine("}");
        }