Skip to content

Commit

Permalink
Merge pull request #515 from RSuter/dotliquid
Browse files Browse the repository at this point in the history
Dotliquid
  • Loading branch information
RicoSuter authored Oct 15, 2017
2 parents 8322a63 + 471a07e commit 12a4caa
Show file tree
Hide file tree
Showing 23 changed files with 349 additions and 67 deletions.
2 changes: 1 addition & 1 deletion src/NJsonSchema.CodeGeneration.CSharp/CSharpGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public override string GenerateFile(string rootTypeNameHint)
var model = new FileTemplateModel
{
Namespace = Settings.Namespace ?? string.Empty,
Classes = ConversionUtilities.TrimWhiteSpaces(_resolver.GenerateTypes().Concatenate())
TypesCode = ConversionUtilities.TrimWhiteSpaces(_resolver.GenerateTypes().Concatenate())
};

var template = Settings.TemplateFactory.CreateTemplate("CSharp", "File", model);
Expand Down
7 changes: 4 additions & 3 deletions src/NJsonSchema.CodeGeneration.CSharp/CSharpTypeResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
using System.Collections.Generic;
using System.Linq;
using NJsonSchema.CodeGeneration.CSharp.Models;
using NJsonSchema.CodeGeneration.CSharp.Templates;

namespace NJsonSchema.CodeGeneration.CSharp
{
Expand Down Expand Up @@ -93,7 +92,8 @@ public override CodeArtifactCollection GenerateTypes()
Language = CodeArtifactLanguage.CSharp,

TypeName = "JsonInheritanceConverter",
Code = new JsonInheritanceConverterTemplate(new JsonInheritanceConverterTemplateModel(Settings)).Render()
Code = Settings.TemplateFactory.CreateTemplate(
"CSharp", "JsonInheritanceConverter", new JsonInheritanceConverterTemplateModel(Settings)).Render()
});
}

Expand All @@ -105,7 +105,8 @@ public override CodeArtifactCollection GenerateTypes()
Language = CodeArtifactLanguage.CSharp,

TypeName = "DateFormatConverter",
Code = new DateFormatConverterTemplate(new DateFormatConverterTemplateModel(Settings)).Render()
Code = Settings.TemplateFactory.CreateTemplate(
"CSharp", "DateFormatConverter", new DateFormatConverterTemplateModel(Settings)).Render()
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,6 @@ public ClassTemplateModel(string typeName, CSharpGeneratorSettings settings,
.ToList();
}

/// <summary>Gets the NJsonSchema toolchain version.</summary>
public string ToolchainVersion => JsonSchema4.ToolchainVersion;

/// <summary>Gets or sets the class name.</summary>
public override string ClassName { get; }

Expand Down Expand Up @@ -95,9 +92,15 @@ public string InheritanceCode
get
{
if (HasInheritance)
return ": " + BaseClassName + (_settings.ClassStyle == CSharpClassStyle.Inpc ? ", System.ComponentModel.INotifyPropertyChanged" : "");
{
return ": " + BaseClassName + (_settings.ClassStyle == CSharpClassStyle.Inpc ?
", System.ComponentModel.INotifyPropertyChanged" : "");
}
else
return _settings.ClassStyle == CSharpClassStyle.Inpc ? ": System.ComponentModel.INotifyPropertyChanged" : "";
{
return _settings.ClassStyle == CSharpClassStyle.Inpc ?
": System.ComponentModel.INotifyPropertyChanged" : "";
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ namespace NJsonSchema.CodeGeneration.CSharp.Models
// TODO: Add base class for CSharp.EnumTemplateModel and TypeScript.EnumTemplateModel

/// <summary>The CSharp enum template model.</summary>
public class EnumTemplateModel
public class EnumTemplateModel : TemplateModelBase
{
private readonly JsonSchema4 _schema;
private readonly CSharpGeneratorSettings _settings;
Expand Down Expand Up @@ -52,7 +52,7 @@ public IEnumerable<EnumerationItemModel> Enums
get
{
var entries = new List<EnumerationItemModel>();
for (int i = 0; i < _schema.Enumeration.Count; i++)
for (var i = 0; i < _schema.Enumeration.Count; i++)
{
var value = _schema.Enumeration.ElementAt(i);
if (value != null)
Expand All @@ -69,6 +69,7 @@ public IEnumerable<EnumerationItemModel> Enums
});
}
}

return entries;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class FileTemplateModel
/// <summary>Gets or sets the namespace.</summary>
public string Namespace { get; set; }

/// <summary>Gets or sets the classes code.</summary>
public string Classes { get; set; }
/// <summary>Gets or sets the types code.</summary>
public string TypesCode { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,23 @@
<WarningsAsErrors />
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Templates\Class.liquid" />
<None Remove="Templates\Class.ToJson.liquid" />
<None Remove="Templates\Liquid\Class.FromJson.liquid" />
<None Remove="Templates\Liquid\Class.Inpc.liquid" />
<None Remove="Templates\Liquid\DateFormatConverter.liquid" />
<None Remove="Templates\Liquid\Enum.liquid" />
<None Remove="Templates\Liquid\File.liquid" />
<None Remove="Templates\Liquid\JsonInheritanceConverter.liquid" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Templates\Liquid\Class.FromJson.liquid" />
<EmbeddedResource Include="Templates\Liquid\Class.Inpc.liquid" />
<EmbeddedResource Include="Templates\Liquid\Class.liquid" />
<EmbeddedResource Include="Templates\Liquid\Class.ToJson.liquid" />
<EmbeddedResource Include="Templates\Liquid\DateFormatConverter.liquid" />
<EmbeddedResource Include="Templates\Liquid\Enum.liquid" />
<EmbeddedResource Include="Templates\Liquid\File.liquid" />
<EmbeddedResource Include="Templates\Liquid\JsonInheritanceConverter.liquid" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

namespace NJsonSchema.CodeGeneration.CSharp.Templates
{
internal partial class DateFormatConverterTemplate
internal partial class DateFormatConverterTemplate : ITemplate
{
public DateFormatConverterTemplate(DateFormatConverterTemplateModel model)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public virtual string TransformText()
this.Write("\r\n{\r\n #pragma warning disable // Disable all warnings\r\n\r\n ");

#line 12 "C:\Data\Projects\NJsonSchema\src\NJsonSchema.CodeGeneration.CSharp\Templates\FileTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(ConversionUtilities.Tab(Model.Classes, 1)));
this.Write(this.ToStringHelper.ToStringWithCulture(ConversionUtilities.Tab(Model.TypesCode, 1)));

#line default
#line hidden
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ namespace <#=Model.Namespace#>
{
#pragma warning disable // Disable all warnings

<#=ConversionUtilities.Tab(Model.Classes, 1)#>
<#=ConversionUtilities.Tab(Model.TypesCode, 1)#>
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

namespace NJsonSchema.CodeGeneration.CSharp.Templates
{
internal partial class JsonInheritanceConverterTemplate
internal partial class JsonInheritanceConverterTemplate : ITemplate
{
public JsonInheritanceConverterTemplate(JsonInheritanceConverterTemplateModel model)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
public static {{ ClassName }} FromJson(string data)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<{{ ClassName }}>(data{{ JsonSerializerParameterCode }});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
public string ToJson()
{
return Newtonsoft.Json.JsonConvert.SerializeObject(this{{ JsonSerializerParameterCode }});
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,26 +67,11 @@
}

{%- endif -%}
{%- if RenderInpc -%}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

{%- endif -%}
public string ToJson()
{
return Newtonsoft.Json.JsonConvert.SerializeObject(this{{ JsonSerializerParameterCode }});
}
{% template ToJson %}

public static {{ ClassName }} FromJson(string data)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<{{ ClassName }}>(data{{ JsonSerializerParameterCode }});
}
{% template FromJson %}
{%- if RenderInpc -%}

protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
{% template Inpc %}
{%- endif -%}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{%- if GenerateDateFormatConverterClass -%}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "{{ ToolchainVersion }}")]
internal class DateFormatConverter : Newtonsoft.Json.Converters.IsoDateTimeConverter
{
public DateFormatConverter()
{
DateTimeFormat = "yyyy-MM-dd";
}
}
{%- endif -%}
14 changes: 14 additions & 0 deletions src/NJsonSchema.CodeGeneration.CSharp/Templates/Liquid/Enum.liquid
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{%- if HasDescription -%}
/// <summary>{{ Description | CSharpDocs }}</summary>
{%- endif -%}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "{{ ToolchainVersion }}")]
{{ TypeAccessModifier }} enum {{ Name }}
{
{%- for enum in Enums -%}
{%- if IsStringEnum -%}
[System.Runtime.Serialization.EnumMember(Value = "{{ enum.Value }}")]
{%- endif -%}
{{ enum.Name }} = {{ enum.InternalValue }},

{%- endfor -%}
}
12 changes: 12 additions & 0 deletions src/NJsonSchema.CodeGeneration.CSharp/Templates/Liquid/File.liquid
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//----------------------
// <auto-generated>
// Generated using the NJsonSchema v{{ ToolchainVersion }} (http://NJsonSchema.org)
// </auto-generated>
//----------------------

namespace {{ Namespace }}
{
#pragma warning disable // Disable all warnings

{{ TypesCode | tab: 1 }}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
{%- if GenerateJsonInheritanceAttributeClass -%}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "{{ ToolchainVersion }}")]
[System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = true)]
internal class JsonInheritanceAttribute : System.Attribute
{
public JsonInheritanceAttribute(string key, System.Type type)
{
Key = key;
Type = type;
}

public string Key { get; }

public System.Type Type { get; }
}

{%- endif -%}
{%- if GenerateJsonInheritanceConverterClass -%}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "{{ ToolchainVersion }}")]
internal class JsonInheritanceConverter : Newtonsoft.Json.JsonConverter
{
internal static readonly string DefaultDiscriminatorName = "discriminator";

private readonly string _discriminator;

[System.ThreadStatic]
private static bool _isReading;

[System.ThreadStatic]
private static bool _isWriting;

public JsonInheritanceConverter()
{
_discriminator = DefaultDiscriminatorName;
}

public JsonInheritanceConverter(string discriminator)
{
_discriminator = discriminator;
}

public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
{
try
{
_isWriting = true;

var jObject = Newtonsoft.Json.Linq.JObject.FromObject(value, serializer);
jObject.AddFirst(new Newtonsoft.Json.Linq.JProperty(_discriminator, value.GetType().Name));
writer.WriteToken(jObject.CreateReader());
}
finally
{
_isWriting = false;
}
}

public override bool CanWrite
{
get
{
if (_isWriting)
{
_isWriting = false;
return false;
}
return true;
}
}

public override bool CanRead
{
get
{
if (_isReading)
{
_isReading = false;
return false;
}
return true;
}
}

public override bool CanConvert(System.Type objectType)
{
return true;
}

public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
{
var jObject = serializer.Deserialize<Newtonsoft.Json.Linq.JObject>(reader);
if (jObject == null)
return null;

var discriminator = Newtonsoft.Json.Linq.Extensions.Value<string>(jObject.GetValue(_discriminator));
var subtype = GetObjectSubtype(objectType, discriminator);

try
{
_isReading = true;
return serializer.Deserialize(jObject.CreateReader(), subtype);
}
finally
{
_isReading = false;
}
}

private System.Type GetObjectSubtype(System.Type objectType, string discriminator)
{
foreach (var type in System.Reflection.CustomAttributeExtensions.GetCustomAttributes<JsonInheritanceAttribute>(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), false))
{
if (type.Key == discriminator)
return type.Type;
}

return objectType;
}
}
{%- endif -%}
Loading

0 comments on commit 12a4caa

Please sign in to comment.