private static void GenerateWhileStatement(ScriptGenerator generator, MemberSymbol symbol, WhileStatement statement) { if (statement.Body == null) { return; } ScriptTextWriter writer = generator.Writer; if (statement.PreCondition) { writer.Write("while ("); ExpressionGenerator.GenerateExpression(generator, symbol, statement.Condition); writer.WriteLine(") {"); } else { writer.WriteLine("do {"); } writer.Indent++; GenerateStatement(generator, symbol, statement.Body); writer.Indent--; if (statement.PreCondition) { writer.WriteLine("}"); } else { writer.Write("} while ("); ExpressionGenerator.GenerateExpression(generator, symbol, statement.Condition); writer.WriteLine(");"); } }
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("}"); }
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(); }
private static void GeneratePropertyGetter(ScriptGenerator generator, string typeName, PropertySymbol propertySymbol, ScriptTextWriter writer, bool instanceMember) { if (instanceMember) { writer.Write("$get_"); writer.Write(propertySymbol.GeneratedName); writer.Write(": "); } else { writer.Write("ss.createPropertyGet("); writer.Write(typeName); writer.Write(", '"); writer.Write(propertySymbol.GeneratedName); writer.Write("', "); } writer.WriteLine("function() {"); writer.Indent++; if (generator.Options.EnableDocComments) { DocCommentGenerator.GenerateComment(generator, propertySymbol); } CodeGenerator.GenerateScript(generator, propertySymbol, /* getter */ true); writer.Indent--; writer.Write("}"); if (instanceMember == false) { writer.WriteLine(");"); } }
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(); }
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>"); } }
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>"); }
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(); }
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;"); } }
private static void GenerateVariableDeclarationStatement(ScriptGenerator generator, MemberSymbol symbol, VariableDeclarationStatement statement) { ScriptTextWriter writer = generator.Writer; GenerateVariableDeclarations(generator, symbol, statement); writer.WriteLine(";"); }
private static void GenerateContinueStatement(ScriptGenerator generator, MemberSymbol symbol, ContinueStatement statement) { ScriptTextWriter writer = generator.Writer; writer.Write("continue;"); writer.WriteLine(); }
private static void GenerateBreakStatement(ScriptGenerator generator, MemberSymbol symbol, BreakStatement statement) { ScriptTextWriter writer = generator.Writer; writer.Write("break;"); writer.WriteLine(); }
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); } }
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(";"); } }
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(); } } }
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>"); }
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(";"); }
private static void GenerateDelegateExpression(ScriptGenerator generator, MemberSymbol symbol, DelegateExpression expression) { ScriptTextWriter writer = generator.Writer; AnonymousMethodSymbol anonymousMethod = expression.Method as AnonymousMethodSymbol; if (anonymousMethod != null) { writer.Write("function("); if ((anonymousMethod.Parameters != null) && (anonymousMethod.Parameters.Count != 0)) { int paramIndex = 0; foreach (ParameterSymbol parameterSymbol in anonymousMethod.Parameters) { if (paramIndex > 0) { writer.Write(", "); } writer.Write(parameterSymbol.GeneratedName); paramIndex++; } } writer.WriteLine(") {"); writer.Indent++; CodeGenerator.GenerateScript(generator, anonymousMethod); writer.Indent--; writer.Write("}"); } else if ((expression.Method.Visibility & MemberVisibility.Static) != 0) { if (expression.Method.IsExtension) { Debug.Assert(expression.Method.Parent.Type == SymbolType.Class); ClassSymbol classSymbol = (ClassSymbol)expression.Method.Parent; Debug.Assert(classSymbol.IsExtenderClass); writer.Write(classSymbol.Extendee); writer.Write("."); writer.Write(expression.Method.GeneratedName); } else { ExpressionGenerator.GenerateExpression(generator, symbol, expression.ObjectReference); writer.Write("."); writer.Write(expression.Method.GeneratedName); } } else { writer.Write("ss.bind('"); writer.Write(expression.Method.GeneratedName); writer.Write("', "); ExpressionGenerator.GenerateExpression(generator, symbol, expression.ObjectReference); writer.Write(")"); } }
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 (var 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("}"); }
private static void GenerateInterface(ScriptGenerator generator, InterfaceSymbol interfaceSymbol) { ScriptTextWriter writer = generator.Writer; string interfaceName = interfaceSymbol.FullGeneratedName; writer.Write("function "); writer.Write(interfaceName); writer.WriteLine("() { }"); }
private static void GenerateInterfaceComment(ScriptTextWriter writer, InterfaceSymbol interfaceSymbol) { writer.WriteLine(); writer.Indent++; GenerateSummaryComment(writer, interfaceSymbol); writer.Indent--; }
private static void GenerateFormattedComment(ScriptTextWriter writer, string text) { foreach (string line in text.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)) { string trimmedLine = line.Trim(); if (!String.IsNullOrEmpty(trimmedLine)) { writer.WriteLine("/// {0}", trimmedLine); } } }
private static void GenerateRecord(ScriptGenerator generator, RecordSymbol recordSymbol) { ScriptTextWriter writer = generator.Writer; string recordName = recordSymbol.FullGeneratedName; writer.Write("function "); writer.Write(recordName); 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.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(); }
private static void GenerateEnumeration(ScriptGenerator generator, EnumerationSymbol enumSymbol) { ScriptTextWriter writer = generator.Writer; string enumName = enumSymbol.FullGeneratedName; writer.Write("var "); writer.Write(enumSymbol.FullGeneratedName); writer.Write(" = {"); writer.Indent++; bool firstValue = true; foreach (MemberSymbol memberSymbol in enumSymbol.Members) { EnumerationFieldSymbol fieldSymbol = memberSymbol as EnumerationFieldSymbol; if (fieldSymbol == null) { 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(); }
private static void GeneratePropertyComment(ScriptTextWriter writer, PropertySymbol propertySymbol) { GenerateSummaryComment(writer, propertySymbol); writer.Write("/// <value"); GenerateTypeAttributes(writer, propertySymbol.AssociatedType); writer.WriteLine("></value>"); }
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("}"); } } }
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(); } }
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("}"); } }
private static void GenerateReturnsComment(ScriptTextWriter writer, TypeSymbol typeSymbol) { if (IsVoid(typeSymbol)) { return; } writer.Write("/// <returns"); GenerateTypeAttributes(writer, typeSymbol); writer.WriteLine("></returns>"); }
private static void GenerateImplementationScript(ScriptGenerator generator, MemberSymbol symbol, SymbolImplementation implementation) { generator.StartImplementation(implementation); try { bool generateThisCacheStatement = false; if ((symbol.Visibility & MemberVisibility.Static) == 0) { CodeMemberSymbol codeMemberSymbol = symbol as CodeMemberSymbol; if ((codeMemberSymbol != null) && (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); } } finally { generator.EndImplementation(); } }
private static void GenerateEventComment(ScriptTextWriter writer, EventSymbol eventSymbol) { GenerateSummaryComment(writer, eventSymbol); writer.WriteLine("/// <param name=\"{0}\" type=\"Function\" />", eventSymbol.Parameters[0].Name); }
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--; }