public void AddProperties(StringBuilderWrapper sb, MetadataType type, bool initCollections, bool includeResponseStatus) { var wasAdded = false; var defaultValue = type.IsInterface != true ? " = null" : ""; var dataMemberIndex = 1; if (type.Properties != null) { foreach (var prop in type.Properties) { if (wasAdded) { sb.AppendLine(); } var propType = Type(prop.GetTypeName(Config, allTypes), prop.GenericArgs); var fieldName = prop.Name.SafeToken().PropertyStyle(); wasAdded = AppendComments(sb, prop.Description); wasAdded = AppendDataMember(sb, prop.DataMember, dataMemberIndex++) || wasAdded; wasAdded = AppendAttributes(sb, prop.Attributes) || wasAdded; var initProp = initCollections && !prop.GenericArgs.IsEmpty() && (ArrayTypes.Contains(prop.Type) || DictionaryTypes.Contains(prop.Type)); sb.Emit(prop, Lang.Kotlin); PrePropertyFilter?.Invoke(sb, prop, type); if (!fieldName.IsKeyWord()) { sb.AppendLine(!initProp ? $"var {fieldName}:{propType}?{defaultValue}" : $"var {fieldName}:{propType} = {propType}()"); } else { var originalName = fieldName; fieldName = char.ToUpper(fieldName[0]) + fieldName.SafeSubstring(1); sb.AppendLine(!initProp ? $"@SerializedName(\"{originalName}\") var {fieldName}:{propType}?{defaultValue}" : $"@SerializedName(\"{originalName}\") var {fieldName}:{propType} = {propType}()"); } PostPropertyFilter?.Invoke(sb, prop, type); } } if (includeResponseStatus) { if (wasAdded) { sb.AppendLine(); } AppendDataMember(sb, null, dataMemberIndex++); sb.AppendLine($"var {nameof(ResponseStatus).PropertyStyle()}:ResponseStatus?{defaultValue}"); } }
public void AddProperties(StringBuilderWrapper sb, MetadataType type, bool includeResponseStatus) { var wasAdded = false; var isClass = Config.ExportAsTypes && !type.IsInterface.GetValueOrDefault(); var modifier = isClass ? "public " : ""; var dataMemberIndex = 1; if (type.Properties != null) { foreach (var prop in type.Properties) { if (wasAdded) { sb.AppendLine(); } var propType = GetPropertyType(prop, out var optionalProperty); propType = PropertyTypeFilter?.Invoke(this, type, prop) ?? propType; var optional = IsPropertyOptional(this, type, prop) ?? optionalProperty ? "?" : ""; wasAdded = AppendComments(sb, prop.Description); wasAdded = AppendDataMember(sb, prop.DataMember, dataMemberIndex++) || wasAdded; wasAdded = AppendAttributes(sb, prop.Attributes) || wasAdded; sb.Emit(prop, Lang.TypeScript); PrePropertyFilter?.Invoke(sb, prop, type); sb.AppendLine(modifier + "{1}{2}: {0};".Fmt(propType, prop.Name.SafeToken().PropertyStyle(), optional)); PostPropertyFilter?.Invoke(sb, prop, type); } } if (includeResponseStatus) { if (wasAdded) { sb.AppendLine(); } AppendDataMember(sb, null, dataMemberIndex++); sb.AppendLine(modifier + "{0}{1}: ResponseStatus;".Fmt( nameof(ResponseStatus).PropertyStyle(), Config.ExportAsTypes ? "" : "?")); } }
public void AddProperties(StringBuilderWrapper sb, MetadataType type, bool includeResponseStatus) { var makeExtensible = Config.MakeDataContractsExtensible && type.Inherits == null; var virt = Config.MakeVirtual && !type.IsInterface() ? "virtual " : ""; var wasAdded = false; var dataMemberIndex = 1; if (type.Properties != null) { foreach (var prop in type.Properties) { if (wasAdded) { sb.AppendLine(); } var propType = Type(prop.GetTypeName(Config, allTypes), prop.GenericArgs, includeNested:true); wasAdded = AppendComments(sb, prop.Description); wasAdded = AppendDataMember(sb, prop.DataMember, dataMemberIndex++) || wasAdded; wasAdded = AppendAttributes(sb, prop.Attributes) || wasAdded; var visibility = type.IsInterface() ? "" : "public "; sb.Emit(prop, Lang.CSharp); PrePropertyFilter?.Invoke(sb, prop, type); sb.AppendLine($"{visibility}{virt}{propType} {prop.Name.SafeToken()} {{ get; set; }}"); PostPropertyFilter?.Invoke(sb, prop, type); } } if (type.IsInterface()) { return; } if (includeResponseStatus) { if (wasAdded) { sb.AppendLine(); } wasAdded = true; AppendDataMember(sb, null, dataMemberIndex++); sb.AppendLine($"public {virt}ResponseStatus ResponseStatus {{ get; set; }}"); } if (makeExtensible && (type.Properties == null || type.Properties.All(x => x.Name != "ExtensionData"))) { if (wasAdded) { sb.AppendLine(); } wasAdded = true; sb.AppendLine($"public {virt}ExtensionDataObject ExtensionData {{ get; set; }}"); } }
private string AppendType(ref StringBuilderWrapper sb, MetadataType type, string lastNS, List <MetadataType> allTypes, CreateTypeOptions options) { if (type.IsNested.GetValueOrDefault() && !options.IsNestedType) { return(lastNS); } if (!Config.ExcludeNamespace) { var ns = Config.GlobalNamespace ?? type.Namespace; if (ns != lastNS) { if (lastNS != null) { sb.AppendLine("}"); } lastNS = ns; sb.AppendLine(); sb.AppendLine($"namespace {ns.SafeToken()}"); sb.AppendLine("{"); } sb = sb.Indent(); } sb.AppendLine(); AppendComments(sb, type.Description); if (options?.Routes != null) { AppendAttributes(sb, options.Routes.ConvertAll(x => x.ToMetadataAttribute())); } AppendAttributes(sb, type.Attributes); AppendDataContract(sb, type.DataContract); if (Config.AddGeneratedCodeAttributes) { sb.AppendLine($"[GeneratedCode(\"AddServiceStackReference\", \"{Env.VersionString}\")]"); } var typeAccessor = !Config.MakeInternal ? "public" : "internal"; sb.Emit(type, Lang.CSharp); PreTypeFilter?.Invoke(sb, type); if (type.IsEnum.GetValueOrDefault()) { sb.AppendLine($"{typeAccessor} enum {Type(type.Name, type.GenericArgs)}"); sb.AppendLine("{"); sb = sb.Indent(); if (type.EnumNames != null) { for (var i = 0; i < type.EnumNames.Count; i++) { var name = type.EnumNames[i]; var value = type.EnumValues?[i]; var memberValue = type.GetEnumMemberValue(i); if (memberValue != null) { AppendAttributes(sb, new List <MetadataAttribute> { new MetadataAttribute { Name = "EnumMember", Args = new List <MetadataPropertyType> { new MetadataPropertyType { Name = "Value", Value = memberValue, Type = "String", } } } }); } sb.AppendLine(value == null ? $"{name}," : $"{name} = {value},"); } } sb = sb.UnIndent(); sb.AppendLine("}"); } else { var partial = Config.MakePartial ? "partial " : ""; var defType = type.IsInterface() ? "interface" : "class"; sb.AppendLine($"{typeAccessor} {partial}{defType} {Type(type.Name, type.GenericArgs)}"); //: BaseClass, Interfaces var inheritsList = new List <string>(); if (type.Inherits != null) { inheritsList.Add(Type(type.GetInherits(), includeNested: true)); } if (options.ImplementsFn != null) { var implStr = options.ImplementsFn(); if (!string.IsNullOrEmpty(implStr)) { inheritsList.Add(implStr); } } type.Implements.Each(x => inheritsList.Add(Type(x))); var makeExtensible = Config.MakeDataContractsExtensible && type.Inherits == null; if (makeExtensible) { inheritsList.Add("IExtensibleDataObject"); } if (inheritsList.Count > 0) { sb.AppendLine($" : {string.Join(", ", inheritsList.ToArray())}"); } sb.AppendLine("{"); sb = sb.Indent(); InnerTypeFilter?.Invoke(sb, type); AddConstructor(sb, type, options); AddProperties(sb, type, includeResponseStatus: Config.AddResponseStatus && options.IsResponse && type.Properties.Safe().All(x => x.Name != nameof(ResponseStatus))); foreach (var innerTypeRef in type.InnerTypes.Safe()) { var innerType = allTypes.FirstOrDefault(x => x.Name == innerTypeRef.Name); if (innerType == null) { continue; } sb = sb.UnIndent(); AppendType(ref sb, innerType, lastNS, allTypes, new CreateTypeOptions { IsNestedType = true }); sb = sb.Indent(); } sb = sb.UnIndent(); sb.AppendLine("}"); } PostTypeFilter?.Invoke(sb, type); if (!Config.ExcludeNamespace) { sb = sb.UnIndent(); } return(lastNS); }
private string AppendType(ref StringBuilderWrapper sb, MetadataType type, string lastNS, CreateTypeOptions options) { sb.AppendLine(); AppendComments(sb, type.Description); if (options?.Routes != null) { AppendAttributes(sb, options.Routes.ConvertAll(x => x.ToMetadataAttribute())); } AppendAttributes(sb, type.Attributes); AppendDataContract(sb, type.DataContract); var typeName = Type(type.Name, type.GenericArgs); sb.Emit(type, Lang.Kotlin); PreTypeFilter?.Invoke(sb, type); if (type.IsEnum.GetValueOrDefault()) { var hasIntValue = type.EnumNames.Count == (type.EnumValues?.Count ?? 0); var enumConstructor = hasIntValue ? "(val value:Int)" : ""; sb.AppendLine($"enum class {typeName}{enumConstructor}"); sb.AppendLine("{"); sb = sb.Indent(); if (type.EnumNames != null) { for (var i = 0; i < type.EnumNames.Count; i++) { var name = type.EnumNames[i]; var value = hasIntValue ? type.EnumValues[i] : null; var serializeAs = JsConfig.TreatEnumAsInteger || type.Attributes.Safe().Any(x => x.Name == "Flags") ? $"@SerializedName(\"{value}\") " : ""; sb.AppendLine(value == null ? $"{name.ToPascalCase()}," : serializeAs + $"{name.ToPascalCase()}({value}),"); } //if (hasIntValue) //{ // sb.AppendLine(); // sb.AppendLine("private final int value;"); // sb.AppendLine("{0}(final int intValue) {{ value = intValue; }}".Fmt(typeName)); // sb.AppendLine("public int getValue() { return value; }"); //} } sb = sb.UnIndent(); sb.AppendLine("}"); } else { var defType = type.IsInterface() ? "interface" : "class"; var extends = new List <string>(); //: BaseClass, Interfaces if (type.Inherits != null) { extends.Add(Type(type.Inherits).InheritedType()); } string responseTypeExpression = null; var interfaces = new List <string>(); if (options.ImplementsFn != null) { var implStr = options.ImplementsFn(); if (!string.IsNullOrEmpty(implStr)) { interfaces.Add(implStr); if (implStr.StartsWith("IReturn<")) { var types = implStr.RightPart('<'); var returnType = types.Substring(0, types.Length - 1); //Can't get .class from Generic Type definition responseTypeExpression = returnType.Contains("<") ? $"object : TypeToken<{returnType}>(){{}}.type" : $"{returnType}::class.java"; } } } type.Implements.Each(x => interfaces.Add(Type(x))); var extend = extends.Count > 0 ? " : " + extends[0] + "()" : ""; if (interfaces.Count > 0) { extend += (extend.IsNullOrEmpty() ? " : " : ", ") + string.Join(", ", interfaces.ToArray()); } sb.AppendLine($"open {defType} {typeName}{extend}"); sb.AppendLine("{"); sb = sb.Indent(); InnerTypeFilter?.Invoke(sb, type); var addVersionInfo = Config.AddImplicitVersion != null && options.IsRequest; if (addVersionInfo) { sb.AppendLine($"val {"Version".PropertyStyle()}:Int = {Config.AddImplicitVersion}"); } AddProperties(sb, type, initCollections: !type.IsInterface() && Config.InitializeCollections, includeResponseStatus: Config.AddResponseStatus && options.IsResponse && type.Properties.Safe().All(x => x.Name != nameof(ResponseStatus))); if (responseTypeExpression != null) { sb.AppendLine($"companion object {{ private val responseType = {responseTypeExpression} }}"); sb.AppendLine($"override fun getResponseType(): Any? = {typeName}.responseType"); } sb = sb.UnIndent(); sb.AppendLine("}"); } PostTypeFilter?.Invoke(sb, type); return(lastNS); }
public void AddProperties(StringBuilderWrapper sb, MetadataType type, bool includeResponseStatus) { var makeExtensible = Config.MakeDataContractsExtensible && type.Inherits == null; var wasAdded = false; var dataMemberIndex = 1; if (type.Properties != null) { foreach (var prop in type.Properties) { if (wasAdded) { sb.AppendLine(); } var propType = Type(prop.GetTypeName(Config, allTypes), prop.GenericArgs); wasAdded = AppendComments(sb, prop.Description); wasAdded = AppendDataMember(sb, prop.DataMember, dataMemberIndex++) || wasAdded; wasAdded = AppendAttributes(sb, prop.Attributes) || wasAdded; sb.Emit(prop, Lang.FSharp); PrePropertyFilter?.Invoke(sb, prop, type); if (!type.IsInterface()) { sb.AppendLine("member val {1}:{0} = {2} with get,set".Fmt( propType, prop.Name.SafeToken(), GetDefaultLiteral(prop, type))); } else { sb.AppendLine("abstract {1}:{0} with get,set".Fmt( propType, prop.Name.SafeToken())); } PostPropertyFilter?.Invoke(sb, prop, type); } } if (type.IsInterface()) { return; } if (includeResponseStatus) { if (wasAdded) { sb.AppendLine(); } wasAdded = true; AppendDataMember(sb, null, dataMemberIndex++); sb.AppendLine("member val ResponseStatus:ResponseStatus = null with get,set"); } if (makeExtensible && (type.Properties == null || type.Properties.All(x => x.Name != "ExtensionData"))) { if (wasAdded) { sb.AppendLine(); } wasAdded = true; sb.AppendLine("member val ExtensionData:ExtensionDataObject = null with get,set"); } }
private string AppendType(ref StringBuilderWrapper sb, MetadataType type, string lastNS, CreateTypeOptions options) { sb = sb.Indent(); sb.AppendLine(); AppendComments(sb, type.Description); if (options?.Routes != null) { AppendAttributes(sb, options.Routes.ConvertAll(x => x.ToMetadataAttribute())); } AppendAttributes(sb, type.Attributes); AppendDataContract(sb, type.DataContract); if (Config.AddGeneratedCodeAttributes) { sb.AppendLine("[<GeneratedCode(\"AddServiceStackReference\", \"{0}\")>]".Fmt(Env.VersionString)); } sb.Emit(type, Lang.FSharp); PreTypeFilter?.Invoke(sb, type); if (type.IsEnum.GetValueOrDefault()) { sb.AppendLine("type {0} =".Fmt(Type(type.Name, type.GenericArgs))); sb = sb.Indent(); if (type.EnumNames != null) { for (var i = 0; i < type.EnumNames.Count; i++) { var name = type.EnumNames[i]; var value = type.EnumValues != null ? type.EnumValues[i] : i.ToString(); sb.AppendLine("| {0} = {1}".Fmt(name, value)); } } sb = sb.UnIndent(); } else { //sb.AppendLine("[<CLIMutable>]"); // only for Record Types var classCtor = type.IsInterface() ? "" : "()"; sb.AppendLine("[<AllowNullLiteral>]"); sb.AppendLine("type {0}{1} = ".Fmt(Type(type.Name, type.GenericArgs), classCtor)); sb = sb.Indent(); var startLen = sb.Length; //: BaseClass, Interfaces if (type.Inherits != null) { sb.AppendLine("inherit {0}()".Fmt(Type(type.Inherits))); } if (options.ImplementsFn != null) { var implStr = options.ImplementsFn(); if (!string.IsNullOrEmpty(implStr)) { sb.AppendLine($"interface {implStr}"); } } InnerTypeFilter?.Invoke(sb, type); if (!type.IsInterface()) { var makeExtensible = Config.MakeDataContractsExtensible && type.Inherits == null; if (makeExtensible) { sb.AppendLine("interface IExtensibleDataObject with"); sb.AppendLine(" member val ExtensionData:ExtensionDataObject = null with get, set"); sb.AppendLine("end"); } var addVersionInfo = Config.AddImplicitVersion != null && options.IsRequest; if (addVersionInfo) { sb.AppendLine("member val Version:int = {0} with get, set".Fmt(Config.AddImplicitVersion)); } } AddProperties(sb, type, includeResponseStatus: Config.AddResponseStatus && options.IsResponse && type.Properties.Safe().All(x => x.Name != nameof(ResponseStatus))); if (sb.Length == startLen) { sb.AppendLine(type.IsInterface() ? "interface end" : "class end"); } sb = sb.UnIndent(); } PostTypeFilter?.Invoke(sb, type); sb = sb.UnIndent(); return(lastNS); }
public void AddProperties(StringBuilderWrapper sb, MetadataType type, bool includeResponseStatus, bool addPropertyAccessors, string settersReturnType) { var wasAdded = false; var sbInner = StringBuilderCacheAlt.Allocate(); var sbAccessors = new StringBuilderWrapper(sbInner); if (addPropertyAccessors) { sbAccessors.AppendLine(); sbAccessors = sbAccessors.Indent().Indent(); } var dataMemberIndex = 1; if (type.Properties != null) { foreach (var prop in type.Properties) { if (wasAdded) { sb.AppendLine(); } var propType = Type(prop.GetTypeName(Config, allTypes), prop.GenericArgs); var fieldName = prop.Name.SafeToken().PropertyStyle(); var accessorName = fieldName.ToPascalCase(); wasAdded = AppendComments(sb, prop.Description); wasAdded = AppendDataMember(sb, prop.DataMember, dataMemberIndex++) || wasAdded; wasAdded = AppendAttributes(sb, prop.Attributes) || wasAdded; sb.Emit(prop, Lang.Java); PrePropertyFilter?.Invoke(sb, prop, type); if (!fieldName.IsKeyWord()) { sb.AppendLine("public {0} {1} = null;".Fmt(propType, fieldName)); } else { var originalName = fieldName; fieldName = char.ToUpper(fieldName[0]) + fieldName.SafeSubstring(1); sb.AppendLine("@SerializedName(\"{0}\") public {1} {2} = null;".Fmt(originalName, propType, fieldName)); } PostPropertyFilter?.Invoke(sb, prop, type); if (addPropertyAccessors) { sbAccessors.AppendPropertyAccessor(propType, fieldName, accessorName, settersReturnType); } } } if (includeResponseStatus) { if (wasAdded) { sb.AppendLine(); } AppendDataMember(sb, null, dataMemberIndex++); sb.AppendLine("public ResponseStatus {0} = null;".Fmt(nameof(ResponseStatus).PropertyStyle())); if (addPropertyAccessors) { sbAccessors.AppendPropertyAccessor("ResponseStatus", "ResponseStatus", settersReturnType); } } if (sbAccessors.Length > 0) { sb.AppendLine(StringBuilderCacheAlt.ReturnAndFree(sbInner).TrimEnd()); //remove last \n } }
private string AppendType(ref StringBuilderWrapper sb, MetadataType type, string lastNS, CreateTypeOptions options) { sb = sb.Indent(); sb.AppendLine(); AppendComments(sb, type.Description); if (options?.Routes != null) { AppendAttributes(sb, options.Routes.ConvertAll(x => x.ToMetadataAttribute())); } AppendAttributes(sb, type.Attributes); AppendDataContract(sb, type.DataContract); var typeName = Type(type.Name, type.GenericArgs); sb.Emit(type, Lang.Java); PreTypeFilter?.Invoke(sb, type); if (type.IsEnum.GetValueOrDefault()) { sb.AppendLine("public static enum {0}".Fmt(typeName)); sb.AppendLine("{"); sb = sb.Indent(); if (type.EnumNames != null) { var hasIntValue = false; for (var i = 0; i < type.EnumNames.Count; i++) { var name = type.EnumNames[i]; var value = type.EnumValues?[i]; var delim = i == type.EnumNames.Count - 1 ? ";" : ","; var serializeAs = JsConfig.TreatEnumAsInteger || (type.Attributes.Safe().Any(x => x.Name == "Flags")) ? "@SerializedName(\"{0}\") ".Fmt(value) : ""; sb.AppendLine(value == null ? "{0}{1}".Fmt(name.ToPascalCase(), delim) : serializeAs + "{0}({1}){2}".Fmt(name.ToPascalCase(), value, delim)); hasIntValue = hasIntValue || value != null; } if (hasIntValue) { sb.AppendLine(); sb.AppendLine("private final int value;"); sb.AppendLine("{0}(final int intValue) {{ value = intValue; }}".Fmt(typeName)); sb.AppendLine("public int getValue() { return value; }"); } } sb = sb.UnIndent(); sb.AppendLine("}"); } else { var defType = type.IsInterface() ? "interface" : "class"; var extends = new List <string>(); //: BaseClass, Interfaces if (type.Inherits != null) { extends.Add(Type(type.Inherits).InheritedType()); } string responseTypeExpression = null; var interfaces = new List <string>(); if (options.ImplementsFn != null) { var implStr = options.ImplementsFn(); if (!string.IsNullOrEmpty(implStr)) { interfaces.Add(implStr); if (implStr.StartsWith("IReturn<")) { var types = implStr.RightPart('<'); var returnType = types.Substring(0, types.Length - 1); //Can't get .class from Generic Type definition responseTypeExpression = returnType.Contains("<") ? "new TypeToken<{0}>(){{}}.getType()".Fmt(returnType) : "{0}.class".Fmt(returnType); } } } type.Implements.Each(x => interfaces.Add(Type(x))); var extend = extends.Count > 0 ? " extends " + extends[0] : ""; if (interfaces.Count > 0) { extend += " implements " + string.Join(", ", interfaces.ToArray()); } var addPropertyAccessors = Config.AddPropertyAccessors && !type.IsInterface(); var settersReturnType = addPropertyAccessors && Config.SettersReturnThis ? typeName : null; sb.AppendLine("public static {0} {1}{2}".Fmt(defType, typeName, extend)); sb.AppendLine("{"); sb = sb.Indent(); InnerTypeFilter?.Invoke(sb, type); var addVersionInfo = Config.AddImplicitVersion != null && options.IsRequest; if (addVersionInfo) { sb.AppendLine("public Integer {0} = {1};".Fmt("Version".PropertyStyle(), Config.AddImplicitVersion)); if (addPropertyAccessors) { sb.AppendPropertyAccessor("Integer", "Version", settersReturnType); } } AddProperties(sb, type, includeResponseStatus: Config.AddResponseStatus && options.IsResponse && type.Properties.Safe().All(x => x.Name != nameof(ResponseStatus)), addPropertyAccessors: addPropertyAccessors, settersReturnType: settersReturnType); if (responseTypeExpression != null) { sb.AppendLine("private static Object responseType = {0};".Fmt(responseTypeExpression)); sb.AppendLine("public Object getResponseType() { return responseType; }"); } sb = sb.UnIndent(); sb.AppendLine("}"); } PostTypeFilter?.Invoke(sb, type); sb = sb.UnIndent(); return(lastNS); }
public void AddProperties(StringBuilderWrapper sb, MetadataType type, bool includeResponseStatus) { var makeExtensible = Config.MakeDataContractsExtensible && type.Inherits == null; var @virtual = Config.MakeVirtual && !type.IsInterface() ? "Overridable " : ""; var wasAdded = false; var dataMemberIndex = 1; if (type.Properties != null) { foreach (var prop in type.Properties) { if (wasAdded) { sb.AppendLine(); } var propType = Type(prop.GetTypeName(Config, allTypes), prop.GenericArgs, includeNested:true); wasAdded = AppendComments(sb, prop.Description); wasAdded = AppendDataMember(sb, prop.DataMember, dataMemberIndex++) || wasAdded; wasAdded = AppendAttributes(sb, prop.Attributes) || wasAdded; var visibility = type.IsInterface() ? "" : "Public "; sb.Emit(prop, Lang.Vb); PrePropertyFilter?.Invoke(sb, prop, type); sb.AppendLine("{0}{1}Property {2} As {3}".Fmt( visibility, @virtual, EscapeKeyword(prop.Name).SafeToken(), propType)); PostPropertyFilter?.Invoke(sb, prop, type); } } if (type.IsInterface()) { return; } if (includeResponseStatus) { if (wasAdded) { sb.AppendLine(); } wasAdded = true; wasAdded = AppendDataMember(sb, null, dataMemberIndex++); sb.AppendLine("Public {0}Property ResponseStatus As ResponseStatus".Fmt(@virtual)); } if (makeExtensible && (type.Properties == null || type.Properties.All(x => x.Name != "ExtensionData"))) { if (wasAdded) { sb.AppendLine(); } wasAdded = true; sb.AppendLine("Public {0}Property ExtensionData As ExtensionDataObject Implements IExtensibleDataObject.ExtensionData".Fmt(@virtual)); } }
private string AppendType(ref StringBuilderWrapper sb, MetadataType type, string lastNS, List <MetadataType> allTypes, CreateTypeOptions options) { if (type.IsNested.GetValueOrDefault() && !options.IsNestedType) { return(lastNS); } var ns = Config.GlobalNamespace ?? type.Namespace; if (ns != lastNS) { if (lastNS != null) { sb.AppendLine("End Namespace"); } lastNS = ns; sb.AppendLine(); sb.AppendLine($"Namespace {MetadataExtensions.SafeToken(ns)}"); //sb.AppendLine("{"); } sb = sb.Indent(); sb.AppendLine(); AppendComments(sb, type.Description); if (options?.Routes != null) { AppendAttributes(sb, options.Routes.ConvertAll(x => x.ToMetadataAttribute())); } AppendAttributes(sb, type.Attributes); AppendDataContract(sb, type.DataContract); if (Config.AddGeneratedCodeAttributes) { sb.AppendLine($"<GeneratedCode(\"AddServiceStackReference\", \"{Env.VersionString}\")>"); } sb.Emit(type, Lang.Vb); PreTypeFilter?.Invoke(sb, type); if (type.IsEnum.GetValueOrDefault()) { sb.AppendLine("Public Enum {0}".Fmt(Type(type.Name, type.GenericArgs))); sb = sb.Indent(); if (type.EnumNames != null) { for (var i = 0; i < type.EnumNames.Count; i++) { var name = type.EnumNames[i]; var value = type.EnumValues?[i]; if (KeyWords.Contains(name)) { name = $"[{name}]"; } var memberValue = type.GetEnumMemberValue(i); if (memberValue != null) { AppendAttributes(sb, new List <MetadataAttribute> { new MetadataAttribute { Name = "EnumMember", Args = new List <MetadataPropertyType> { new MetadataPropertyType { Name = "Value", Value = memberValue, Type = "String", } } } }); } sb.AppendLine(value == null ? $"{name}," : $"{name} = {value},"); } } sb = sb.UnIndent(); sb.AppendLine("End Enum"); } else { var partial = Config.MakePartial && !type.IsInterface() ? "Partial " : ""; var defType = type.IsInterface() ? "Interface" : "Class"; sb.AppendLine("Public {0}{1} {2}".Fmt(partial, defType, Type(type.Name, type.GenericArgs))); //: BaseClass, Interfaces if (type.Inherits != null) { sb.AppendLine($" Inherits {Type(type.Inherits, includeNested: true)}"); } var implements = new List <string>(); if (options.ImplementsFn != null) { var implStr = options.ImplementsFn(); if (!string.IsNullOrEmpty(implStr)) { implements.Add(implStr); } } type.Implements.Each(x => implements.Add(Type(x))); var makeExtensible = Config.MakeDataContractsExtensible && type.Inherits == null; if (makeExtensible) { implements.Add("IExtensibleDataObject"); } if (implements.Count > 0) { foreach (var x in implements) { sb.AppendLine($" Implements {x}"); } } sb = sb.Indent(); InnerTypeFilter?.Invoke(sb, type); AddConstructor(sb, type, options); AddProperties(sb, type, includeResponseStatus: Config.AddResponseStatus && options.IsResponse && type.Properties.Safe().All(x => x.Name != nameof(ResponseStatus))); foreach (var innerTypeRef in type.InnerTypes.Safe()) { var innerType = allTypes.FirstOrDefault(x => x.Name == innerTypeRef.Name); if (innerType == null) { continue; } sb = sb.UnIndent(); AppendType(ref sb, innerType, lastNS, allTypes, new CreateTypeOptions { IsNestedType = true }); sb = sb.Indent(); } sb = sb.UnIndent(); sb.AppendLine(type.IsInterface() ? "End Interface" : "End Class"); } PostTypeFilter?.Invoke(sb, type); sb = sb.UnIndent(); return(lastNS); }
private string AppendType(ref StringBuilderWrapper sb, MetadataType type, string lastNS, CreateTypeOptions options) { sb.AppendLine(); AppendComments(sb, type.Description); if (options?.Routes != null) { AppendAttributes(sb, options.Routes.ConvertAll(x => x.ToMetadataAttribute())); } AppendAttributes(sb, type.Attributes); AppendDataContract(sb, type.DataContract); sb.Emit(type, Lang.TypeScript); PreTypeFilter?.Invoke(sb, type); if (type.IsEnum.GetValueOrDefault()) { var isIntEnum = type.IsEnumInt.GetValueOrDefault() || type.EnumNames.IsEmpty(); if ((isIntEnum || !UseUnionTypeEnums) && Config.ExportAsTypes) { var typeDeclaration = !Config.ExportAsTypes ? "enum" : "export enum"; sb.AppendLine($"{typeDeclaration} {Type(type.Name, type.GenericArgs)}"); sb.AppendLine("{"); sb = sb.Indent(); if (type.EnumNames != null) { for (var i = 0; i < type.EnumNames.Count; i++) { var name = type.EnumNames[i]; var value = type.EnumValues?[i]; var memberValue = type.GetEnumMemberValue(i); if (memberValue != null) { sb.AppendLine($"{name} = '{memberValue}',"); continue; } sb.AppendLine(value == null ? $"{name} = '{name}'," : $"{name} = {value},"); } } sb = sb.UnIndent(); sb.AppendLine("}"); } else { var sbType = StringBuilderCache.Allocate(); var typeDeclaration = !Config.ExportAsTypes ? "type" : "export type"; sbType.Append($"{typeDeclaration} {Type(type.Name, type.GenericArgs)} = "); for (var i = 0; i < type.EnumNames.Count; i++) { if (i > 0) { sbType.Append(" | "); } sbType.Append('"').Append(type.EnumNames[i]).Append('"'); } sbType.Append(";"); sb.AppendLine(StringBuilderCache.ReturnAndFree(sbType)); } } else { var extends = new List <string>(); //: BaseClass, Interfaces if (type.Inherits != null) { extends.Add(DeclarationType(type.Inherits.Name, type.Inherits.GenericArgs, out var addDeclaration)); if (addDeclaration != null && !AddedDeclarations.Contains(addDeclaration)) { AddedDeclarations.Add(addDeclaration); sb.AppendLine(addDeclaration); sb.AppendLine(); } } string responseTypeExpression = null; var interfaces = new List <string>(); var implStr = options.ImplementsFn?.Invoke(); if (!string.IsNullOrEmpty(implStr)) { interfaces.Add(implStr); if (Config.ExportAsTypes) { if (implStr.StartsWith("IReturn<")) { var types = implStr.RightPart('<'); var returnType = types.Substring(0, types.Length - 1); // This is to avoid invalid syntax such as "return new string()" primitiveDefaultValues.TryGetValue(returnType, out var replaceReturnType); if (returnType == "any") { replaceReturnType = "{}"; } else if (returnType.EndsWith("[]")) { replaceReturnType = $"new Array<{returnType.Substring(0, returnType.Length -2)}>()"; } responseTypeExpression = replaceReturnType == null ? "public createResponse() {{ return new {0}(); }}".Fmt(returnType) : "public createResponse() {{ return {0}; }}".Fmt(replaceReturnType); } else if (implStr == "IReturnVoid") { responseTypeExpression = "public createResponse() {}"; } } } type.Implements.Each(x => interfaces.Add(Type(x))); var isClass = Config.ExportAsTypes && !type.IsInterface.GetValueOrDefault(); var modifier = isClass ? "public " : ""; var extend = extends.Count > 0 ? " extends " + extends[0] : ""; if (interfaces.Count > 0) { if (isClass) { extend += " implements " + string.Join(", ", interfaces.ToArray()); } else { if (string.IsNullOrEmpty(extend)) { extend = " extends "; } else { extend += ", "; } extend += string.Join(", ", interfaces.ToArray()); } } var typeDeclaration = !Config.ExportAsTypes ? "interface" : $"export {(isClass ? "class" : "interface")}"; var typeName = Type(type.Name, type.GenericArgs); sb.AppendLine($"{typeDeclaration} {typeName}{extend}"); sb.AppendLine("{"); sb = sb.Indent(); InnerTypeFilter?.Invoke(sb, type); var addVersionInfo = Config.AddImplicitVersion != null && options.IsRequest; if (addVersionInfo) { sb.AppendLine(modifier + "{0}{1}: number; //{2}".Fmt( "Version".PropertyStyle(), isClass ? "" : "?", Config.AddImplicitVersion)); } if (Config.ExportAsTypes) { if (type.Name == "IReturn`1") { sb.AppendLine("createResponse(): T;"); } else if (type.Name == "IReturnVoid") { sb.AppendLine("createResponse(): void;"); } } AddProperties(sb, type, includeResponseStatus: Config.AddResponseStatus && options.IsResponse && type.Properties.Safe().All(x => x.Name != nameof(ResponseStatus))); if (EmitPartialConstructors && Config.ExportAsTypes && isClass) { sb.AppendLine(); var callSuper = type.Inherits != null ? !(extend.StartsWith(" extends Array<") || extend.StartsWith(" extends Dictionary<")) ? "super(init); " : "super(); " : ""; sb.AppendLine($"public constructor(init?: Partial<{typeName}>) {{ {callSuper}(Object as any).assign(this, init); }}"); } if (Config.ExportAsTypes && responseTypeExpression != null) { sb.AppendLine(responseTypeExpression); sb.AppendLine("public getTypeName() {{ return '{0}'; }}".Fmt(type.Name)); } sb = sb.UnIndent(); sb.AppendLine("}"); } PostTypeFilter?.Invoke(sb, type); return(lastNS); }
public void AddProperties(StringBuilderWrapper sb, MetadataType type, bool initCollections, bool includeResponseStatus) { var wasAdded = false; var dataMemberIndex = 1; foreach (var prop in type.Properties.Safe()) { if (wasAdded) { sb.AppendLine(); } var propTypeName = Type(prop.GetTypeName(Config, allTypes), prop.GenericArgs); var propType = FindType(prop.Type, prop.TypeNamespace, prop.GenericArgs); var optional = ""; var defaultValue = ""; if (propTypeName.EndsWith("?")) { propTypeName = propTypeName.Substring(0, propTypeName.Length - 1); optional = "?"; } if (Config.MakePropertiesOptional) { optional = "?"; } if (prop.Attributes.Safe().FirstOrDefault(x => x.Name == "Required") != null) { optional = "?"; //always use optional } if (prop.IsArray()) { optional = ""; defaultValue = " = []"; } else if (initCollections && !prop.GenericArgs.IsEmpty()) { if (ArrayTypes.Contains(prop.Type)) { optional = ""; defaultValue = " = []"; } if (DictionaryTypes.Contains(prop.Type)) { optional = ""; defaultValue = " = [:]"; } } if (propType.IsInterface() || IgnorePropertyNames.Contains(prop.Name)) { sb.AppendLine("//{0}:{1} ignored. Swift doesn't support interface properties" .Fmt(prop.Name.SafeToken().PropertyStyle(), propTypeName)); continue; } else if (IgnorePropertyTypeNames.Contains(propTypeName)) { sb.AppendLine("//{0}:{1} ignored. Type could not be extended in Swift" .Fmt(prop.Name.SafeToken().PropertyStyle(), propTypeName)); continue; } wasAdded = AppendComments(sb, prop.Description); wasAdded = AppendDataMember(sb, prop.DataMember, dataMemberIndex++) || wasAdded; wasAdded = AppendAttributes(sb, prop.Attributes) || wasAdded; sb.Emit(prop, Lang.Swift); PrePropertyFilter?.Invoke(sb, prop, type); if (type.IsInterface()) { sb.AppendLine("var {0}:{1}{2} {{ get set }}".Fmt( prop.Name.SafeToken().PropertyStyle(), propTypeName, optional)); } else { sb.AppendLine("public var {0}:{1}{2}{3}".Fmt( prop.Name.SafeToken().PropertyStyle(), propTypeName, optional, defaultValue)); } PostPropertyFilter?.Invoke(sb, prop, type); } if (includeResponseStatus) { if (wasAdded) { sb.AppendLine(); } AppendDataMember(sb, null, dataMemberIndex++); sb.AppendLine("public var {0}:ResponseStatus?".Fmt(nameof(ResponseStatus).PropertyStyle())); } }
private string AppendType(ref StringBuilderWrapper sb, ref StringBuilderWrapper sbExt, MetadataType type, string lastNS, CreateTypeOptions options) { //sb = sb.Indent(); var hasGenericBaseType = type.Inherits != null && !type.Inherits.GenericArgs.IsEmpty(); if (Config.ExcludeGenericBaseTypes && hasGenericBaseType) { sb.AppendLine("//Excluded {0} : {1}<{2}>".Fmt(type.Name, type.Inherits.Name.LeftPart('`'), string.Join(",", type.Inherits.GenericArgs))); return(lastNS); } sb.AppendLine(); AppendComments(sb, type.Description); if (options?.Routes != null) { AppendAttributes(sb, options.Routes.ConvertAll(x => x.ToMetadataAttribute())); } AppendAttributes(sb, type.Attributes); AppendDataContract(sb, type.DataContract); sb.Emit(type, Lang.Swift); PreTypeFilter?.Invoke(sb, type); if (type.IsEnum.GetValueOrDefault()) { sb.AppendLine($"public enum {Type(type.Name, type.GenericArgs)} : Int"); sb.AppendLine("{"); sb = sb.Indent(); if (type.EnumNames != null) { for (var i = 0; i < type.EnumNames.Count; i++) { var name = EnumNameStrategy(type.EnumNames[i]); var value = type.EnumValues?[i]; sb.AppendLine(value == null ? $"case {name}" : $"case {name} = {value}"); } } sb = sb.UnIndent(); sb.AppendLine("}"); AddEnumExtension(ref sbExt, type); } else { var defType = "class"; var typeName = Type(type.Name, type.GenericArgs).AddGenericConstraints(); var extends = new List <string>(); //: BaseClass, Interfaces if (type.Inherits != null) { var baseType = Type(type.Inherits).InheritedType(); //Swift requires re-declaring base type generics definition on super type var genericDefPos = baseType.IndexOf("<", StringComparison.Ordinal); if (genericDefPos >= 0) { //Need to declare BaseType is JsonSerializable var subBaseType = baseType.Substring(genericDefPos) .AddGenericConstraints(); typeName += subBaseType; } extends.Add(baseType); } else if (Config.BaseClass != null && !type.IsInterface()) { extends.Add(Config.BaseClass); } var typeAliases = new List <string>(); if (options.ImplementsFn != null) { //Swift doesn't support Generic Interfaces like IReturn<T> //Converting them into protocols with typealiases instead ExtractTypeAliases(options, typeAliases, extends, ref sbExt); } type.Implements.Each(x => extends.Add(Type(x))); if (type.IsInterface()) { defType = "protocol"; //Extract Protocol Arguments into different typealiases if (!type.GenericArgs.IsEmpty()) { typeName = Type(type.Name, null); foreach (var arg in type.GenericArgs) { typeAliases.Add($"associatedtype {arg}"); } } } var extend = extends.Count > 0 ? " : " + (string.Join(", ", extends.ToArray())) : ""; sb.AppendLine($"public {defType} {typeName}{extend}"); sb.AppendLine("{"); sb = sb.Indent(); InnerTypeFilter?.Invoke(sb, type); if (typeAliases.Count > 0) { foreach (var typeAlias in typeAliases) { sb.AppendLine(typeAlias); } sb.AppendLine(); } if (!type.IsInterface()) { if (extends.Count > 0 && OverrideInitForBaseClasses.Contains(extends[0])) { sb.AppendLine("required public override init(){}"); } else { sb.AppendLine("required public init(){}"); } } var addVersionInfo = Config.AddImplicitVersion != null && options.IsRequest; if (addVersionInfo) { sb.AppendLine($"public var {"Version".PropertyStyle()}:Int = {Config.AddImplicitVersion}"); } AddProperties(sb, type, initCollections: !type.IsInterface() && Config.InitializeCollections, includeResponseStatus: Config.AddResponseStatus && options.IsResponse && type.Properties.Safe().All(x => x.Name != nameof(ResponseStatus))); sb = sb.UnIndent(); sb.AppendLine("}"); if (!type.IsInterface()) { AddTypeExtension(ref sbExt, type, initCollections: Config.InitializeCollections); } } PostTypeFilter?.Invoke(sb, type); //sb = sb.UnIndent(); return(lastNS); }
private string AppendType(ref StringBuilderWrapper sb, MetadataType type, string lastNS, List <MetadataType> allTypes, CreateTypeOptions options) { if (type.IsNested.GetValueOrDefault() && !options.IsNestedType) { return(lastNS); } var ns = Config.GlobalNamespace ?? type.Namespace; if (ns != lastNS) { if (lastNS != null) { sb.AppendLine("End Namespace"); } lastNS = ns; sb.AppendLine(); sb.AppendLine($"Namespace {MetadataExtensions.SafeToken(ns)}"); //sb.AppendLine("{"); } sb = sb.Indent(); sb.AppendLine(); AppendComments(sb, type.Description); if (options?.Routes != null) { AppendAttributes(sb, options.Routes.ConvertAll(x => x.ToMetadataAttribute())); } AppendAttributes(sb, type.Attributes); AppendDataContract(sb, type.DataContract); if (Config.AddGeneratedCodeAttributes) { sb.AppendLine($"<GeneratedCode(\"AddServiceStackReference\", \"{Env.VersionString}\")>"); } sb.Emit(type, Lang.Vb); PreTypeFilter?.Invoke(sb, type); if (type.IsEnum.GetValueOrDefault()) { sb.AppendLine("Public Enum {0}".Fmt(Type(type.Name, type.GenericArgs))); sb = sb.Indent(); if (type.EnumNames != null) { for (var i = 0; i < type.EnumNames.Count; i++) { var name = type.EnumNames[i]; var value = type.EnumValues?[i]; if (KeyWords.Contains(name)) { name = $"[{name}]"; } var memberValue = type.GetEnumMemberValue(i); if (memberValue != null) { AppendAttributes(sb, new List <MetadataAttribute> { new MetadataAttribute { Name = "EnumMember", Args = new List <MetadataPropertyType> { new() { Name = "Value", Value = memberValue, Type = "String", } } } });