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(");"); } }
private static void GenerateClassConstructor(ScriptGenerator generator, ClassSymbol classSymbol, ScriptTextWriter writer, string name) { writer.Write("function "); writer.Write(name); writer.Write("("); if (classSymbol.Constructor != null && classSymbol.Constructor.Parameters != null) { bool firstParameter = true; foreach (ParameterSymbol parameterSymbol in classSymbol.Constructor.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}');"); 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 (classSymbol.Constructor != null) { CodeGenerator.GenerateScript(generator, classSymbol.Constructor); } else if (classSymbol.BaseClass != null) { writer.Write(classSymbol.BaseClass.FullGeneratedName); writer.Write(".call(this);"); writer.WriteLine(); } writer.Indent--; writer.WriteLine("}"); }
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) { writer.Write(typeName); writer.Write("."); } writer.Write(methodSymbol.GeneratedMemberName); if (instanceMember) { writer.Write(": "); } else { writer.Write(" = "); } bool hasParams = HasParamsModifier(methodSymbol); if (hasParams) { writer.Write($"{DSharpStringResources.ScriptExportMember("paramsGenerator")}("); writer.Write("{0}, ", methodSymbol.GetGeneratedParamsCount()); } writer.Write("function("); WriteParameters(methodSymbol, writer, true); writer.WriteLine(") {"); writer.Indent++; if (generator.Options.EnableDocComments) { DocCommentGenerator.GenerateComment(generator, methodSymbol); } CodeGenerator.GenerateScript(generator, methodSymbol); writer.Indent--; writer.Write("}"); if (hasParams) { writer.Write(")"); } if (instanceMember == false) { writer.WriteLine(";"); } }
private static void GenerateIndexer(ScriptGenerator generator, string typeName, PropertySymbol indexerSymbol) { if (indexerSymbol.IsAbstract) { return; } Debug.Assert((indexerSymbol.Visibility & MemberVisibility.Static) == 0); ScriptTextWriter writer = generator.Writer; writer.Write("get_"); writer.Write(indexerSymbol.GeneratedName); writer.Write(": function("); for (int i = 0; i < indexerSymbol.Parameters.Count - 1; i++) { ParameterSymbol parameterSymbol = indexerSymbol.Parameters[i]; if (i > 0) { writer.Write(", "); } writer.Write(parameterSymbol.GeneratedName); } writer.WriteLine(") {"); writer.Indent++; if (generator.Options.EnableDocComments) { DocCommentGenerator.GenerateComment(generator, indexerSymbol); } CodeGenerator.GenerateScript(generator, (IndexerSymbol)indexerSymbol, /* getter */ true); writer.Indent--; writer.Write("}"); if (indexerSymbol.IsReadOnly == false) { writer.WriteLine(","); writer.Write("set_"); writer.Write(indexerSymbol.GeneratedName); writer.Write(": function("); for (int i = 0; i < indexerSymbol.Parameters.Count; i++) { ParameterSymbol parameterSymbol = indexerSymbol.Parameters[i]; if (i > 0) { writer.Write(", "); } writer.Write(parameterSymbol.GeneratedName); } writer.WriteLine(") {"); 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.WriteLine(";"); writer.Indent--; writer.Write("}"); } }
private static void GenerateEvent(ScriptGenerator generator, string typeName, EventSymbol eventSymbol) { ScriptTextWriter writer = generator.Writer; ParameterSymbol valueParameter = eventSymbol.Parameters[0]; 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.Write(": "); } else { writer.Write(" = "); } writer.Write("function("); writer.Write(valueParameter.GeneratedName); writer.WriteLine(") {"); writer.Indent++; if (generator.Options.EnableDocComments) { DocCommentGenerator.GenerateComment(generator, eventSymbol); } if (eventSymbol.DefaultImplementation) { writer.Write(fieldReference); writer.Write($" = {DSharpStringResources.ScriptExportMember("bindAdd")}("); writer.Write(fieldReference); writer.Write(", "); writer.Write(valueParameter.GeneratedName); writer.WriteLine(");"); } else { CodeGenerator.GenerateScript(generator, eventSymbol, /* add */ true); } writer.Indent--; writer.Write("}"); if (instanceMember == false) { writer.WriteLine(";"); } if (instanceMember) { writer.WriteLine(","); } else { writer.Write(typeName); writer.Write("."); } writer.Write("remove_"); writer.Write(eventName); if (instanceMember) { writer.Write(": "); } else { writer.Write(" = "); } writer.Write("function("); writer.Write(valueParameter.GeneratedName); writer.WriteLine(") {"); writer.Indent++; if (generator.Options.EnableDocComments) { DocCommentGenerator.GenerateComment(generator, eventSymbol); } if (eventSymbol.DefaultImplementation) { writer.Write(fieldReference); writer.Write($" = {DSharpStringResources.ScriptExportMember("bindSub")}("); writer.Write(fieldReference); writer.Write(", "); writer.Write(valueParameter.GeneratedName); writer.WriteLine(");"); } else { CodeGenerator.GenerateScript(generator, eventSymbol, /* add */ false); } writer.Indent--; writer.Write("}"); if (instanceMember == false) { 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($"));"); } }
private static void GenerateClass(ScriptGenerator generator, ClassSymbol classSymbol) { ScriptTextWriter writer = generator.Writer; string name = classSymbol.FullGeneratedName; writer.Write("function "); writer.Write(name); writer.Write("("); if (classSymbol.Constructor != null && classSymbol.Constructor.Parameters != null) { bool firstParameter = true; foreach (ParameterSymbol parameterSymbol in classSymbol.Constructor.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 (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 (classSymbol.Constructor != null) { CodeGenerator.GenerateScript(generator, classSymbol.Constructor); } else if (classSymbol.BaseClass != null && classSymbol.IsTestClass == false) { writer.Write(classSymbol.BaseClass.FullGeneratedName); writer.Write(".call(this);"); writer.WriteLine(); } writer.Indent--; writer.WriteLine("}"); foreach (MemberSymbol memberSymbol in classSymbol.Members) { if (memberSymbol.Type != SymbolType.Field && (memberSymbol.Visibility & MemberVisibility.Static) != 0) { MemberGenerator.GenerateScript(generator, memberSymbol); } } if (classSymbol.IsStaticClass == false) { writer.Write("var "); writer.Write(name); writer.WriteLine("$ = {"); writer.Indent++; bool firstMember = true; foreach (MemberSymbol memberSymbol in classSymbol.Members) { if ((memberSymbol.Visibility & MemberVisibility.Static) == 0) { if (memberSymbol.Type == SymbolType.Field) { continue; } if (memberSymbol is CodeMemberSymbol && ((CodeMemberSymbol)memberSymbol).IsAbstract) { 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(); } }
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.IsExtension) { string extendee = null; if (methodSymbol.Parent.Type == SymbolType.Class) { extendee = ((ClassSymbol)methodSymbol.Parent).Extendee; } if (string.IsNullOrEmpty(extendee)) { extendee = "this"; } writer.Write(extendee); } else { writer.Write(typeName); } writer.Write("."); } writer.Write(methodSymbol.GeneratedMemberName); if (instanceMember) { writer.Write(": "); } else { writer.Write(" = "); } bool hasParams = HasParamsModifier(methodSymbol); if (hasParams) { writer.Write($"{DSharpStringResources.ScriptExportMember("paramsGenerator")}("); writer.Write("{0}, ", methodSymbol.Parameters.Count - 1); } writer.Write("function("); WriteParameters(methodSymbol, writer); writer.WriteLine(") {"); writer.Indent++; if (generator.Options.EnableDocComments) { DocCommentGenerator.GenerateComment(generator, methodSymbol); } CodeGenerator.GenerateScript(generator, methodSymbol); writer.Indent--; writer.Write("}"); if (hasParams) { writer.Write(")"); } if (instanceMember == false) { writer.WriteLine(";"); } }