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(); }
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 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 GenerateForInStatement(ScriptGenerator generator, MemberSymbol symbol, ForInStatement statement) { ScriptTextWriter writer = generator.Writer; TypeSymbol evaluatedType = statement.CollectionExpression.EvaluatedType; if (statement.IsDictionaryEnumeration) { if (statement.DictionaryVariable != null) { writer.Write("var "); writer.Write(statement.DictionaryVariable.GeneratedName); writer.Write(" = "); ExpressionGenerator.GenerateExpression(generator, symbol, statement.CollectionExpression); writer.Write(";"); writer.WriteLine(); } writer.Write("for (var "); writer.Write(statement.LoopVariable.GeneratedName); writer.Write(" in "); if (statement.DictionaryVariable != null) { writer.Write(statement.DictionaryVariable.GeneratedName); } else { ExpressionGenerator.GenerateExpression(generator, symbol, statement.CollectionExpression); } writer.WriteLine(") {"); writer.Indent++; writer.Write("var "); writer.Write(statement.ItemVariable.GeneratedName); writer.Write(" = { key: "); writer.Write(statement.LoopVariable.GeneratedName); writer.Write(", value: "); if (statement.DictionaryVariable != null) { writer.Write(statement.DictionaryVariable.GeneratedName); } else { ExpressionGenerator.GenerateExpression(generator, symbol, statement.CollectionExpression); } writer.Write("["); writer.Write(statement.LoopVariable.GeneratedName); writer.WriteLine("] };"); GenerateStatement(generator, symbol, statement.Body); writer.Indent--; writer.WriteLine("}"); } else if (evaluatedType.IsNativeArray || evaluatedType.IsListType()) { string dataSourceVariableName = statement.LoopVariable.GeneratedName; string indexVariableName = dataSourceVariableName + "_index"; // var $$ = ({CollectionExpression}); writer.Write("var " + dataSourceVariableName + " = ("); ExpressionGenerator.GenerateExpression(generator, symbol, statement.CollectionExpression); writer.WriteLine(");"); // for(var items_index = 0; items_index < items.length; ++items_index) { writer.WriteLine("for(var " + indexVariableName + " = 0; " + indexVariableName + " < " + dataSourceVariableName + ".length; ++" + indexVariableName + ") {"); ++writer.Indent; if (evaluatedType.IsNativeArray) { // var i = items[items_index]; writer.WriteLine("var " + statement.ItemVariable.GeneratedName + " = " + dataSourceVariableName + "[" + indexVariableName + "];"); } else { // var i = ss.getItem(items, items_index); writer.WriteLine("var " + statement.ItemVariable.GeneratedName + " = ss.getItem(" + dataSourceVariableName + ", " + indexVariableName + ");"); } GenerateStatement(generator, symbol, statement.Body); --writer.Indent; writer.WriteLine("}"); } else { writer.Write("var "); writer.Write(statement.LoopVariable.GeneratedName); writer.Write(" = "); writer.Write($"{DSharpStringResources.ScriptExportMember("enumerate")}("); ExpressionGenerator.GenerateExpression(generator, symbol, statement.CollectionExpression); writer.Write(");"); writer.WriteLine(); writer.Write("while ("); writer.Write(statement.LoopVariable.GeneratedName); writer.WriteLine(".moveNext()) {"); writer.Indent++; writer.Write("var "); writer.Write(statement.ItemVariable.GeneratedName); writer.Write(" = "); writer.Write(statement.LoopVariable.GeneratedName); writer.Write(".current;"); writer.WriteLine(); GenerateStatement(generator, symbol, statement.Body); writer.Indent--; writer.Write("}"); writer.WriteLine(); } }
private static void GenerateClassConstructor(ScriptGenerator generator, ClassSymbol classSymbol, ScriptTextWriter writer, string name) { var ctorSymbol = classSymbol.Constructor; if (HasParamsModifier(ctorSymbol)) { writer.Write($"var {name} = ss.namedFunction('{name}',"); writer.Write($"{DSharpStringResources.ScriptExportMember("paramsGenerator")}("); writer.Write($"{ctorSymbol.GetGeneratedParamsCount()}, function"); } else { writer.Write("function "); writer.Write(name); } writer.Write("("); if (ctorSymbol != null && ctorSymbol.Parameters != null) { bool firstParameter = true; foreach (ParameterSymbol parameterSymbol in ctorSymbol.Parameters) { if (firstParameter == false) { writer.Write(", "); } writer.Write(parameterSymbol.GeneratedName); firstParameter = false; } } writer.WriteLine(") {"); writer.Indent++; if (generator.Options.EnableDocComments) { DocCommentGenerator.GenerateComment(generator, classSymbol); } foreach (var property in GetNonReadonlyAutoProperties(classSymbol)) { writer.Write(DSharpStringResources.ScriptExportMember("defineProperty")); writer.Write($"(this, '{property.GeneratedName}', "); var initialValueExpression = Compiler.ImplementationBuilder.GetDefaultValueExpression(property.AssociatedType, property.SymbolSet); ExpressionGenerator.GenerateLiteralExpression(generator, property, initialValueExpression); writer.Write(");"); writer.WriteLine(); } 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.Write(" = "); CodeGenerator.GenerateScript(generator, fieldSymbol); writer.Write(";"); writer.WriteLine(); } } } if (ctorSymbol != null) { CodeGenerator.GenerateScript(generator, ctorSymbol); } else if (classSymbol.BaseClass is ClassSymbol baseClass) { ExpressionGenerator.WriteFullTypeName(writer, baseClass); writer.WriteLine(".call(this);"); } writer.Indent--; writer.WriteLine("}"); if (HasParamsModifier(ctorSymbol)) { writer.WriteLine($"));"); } }