Skip to content
This repository has been archived by the owner on Oct 1, 2018. It is now read-only.

Kinetix.Tools.Core + T4 and parameters singleton removal + .NET Core #1

Merged
merged 8 commits into from
Jul 24, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 43 additions & 30 deletions Kinetix.ClassGenerator/CSharpGenerator/CSharpClassGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,39 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Kinetix.ClassGenerator.Model;
using Kinetix.Tools.Common.Model;
using Kinetix.Tools.Common.Parameters;

namespace Kinetix.ClassGenerator.CSharpGenerator
{
using static CodeUtils;
using static Singletons;
using static CSharpUtils;

public static class CSharpClassGenerator
public class CSharpClassGenerator
{
private readonly string _rootNamespace;
private readonly CSharpParameters _parameters;

public CSharpClassGenerator(string rootNamespace, CSharpParameters parameters)
{
_rootNamespace = rootNamespace;
_parameters = parameters;
}

/// <summary>
/// Méthode générant le code d'une classe.
/// </summary>
/// <param name="item">Classe concernée.</param>
/// <param name="ns">Namespace.</param>
public static void Generate(ModelClass item, ModelNamespace ns)
public void Generate(ModelClass item, ModelNamespace ns)
{
var fileName = Path.Combine(GetDirectoryForModelClass(item.DataContract.IsPersistent, GeneratorParameters.RootNamespace, item.Namespace.Name), item.Name + ".cs");
var fileName = Path.Combine(GetDirectoryForModelClass(_parameters.OutputDirectory, item.DataContract.IsPersistent, _rootNamespace, item.Namespace.Name), item.Name + ".cs");
using (var w = new CSharpWriter(fileName))
{
Console.WriteLine("Generating class " + ns.Name + "." + item.Name);

GenerateUsings(w, item);
w.WriteLine();
w.WriteNamespace($"{GeneratorParameters.RootNamespace}.{ns.Name}");
w.WriteNamespace($"{_rootNamespace}.{ns.Name}");
w.WriteSummary(1, item.Comment);
GenerateClassDeclaration(w, item);
w.WriteLine("}");
Expand All @@ -37,7 +46,7 @@ public static void Generate(ModelClass item, ModelNamespace ns)
/// </summary>
/// <param name="w">Writer.</param>
/// <param name="item">Classe générée.</param>
private static void GenerateBaseCopyConstructor(CSharpWriter w, ModelClass item)
private void GenerateBaseCopyConstructor(CSharpWriter w, ModelClass item)
{
w.WriteLine();
w.WriteSummary(2, "Constructeur par base class.");
Expand All @@ -54,7 +63,7 @@ private static void GenerateBaseCopyConstructor(CSharpWriter w, ModelClass item)
/// </summary>
/// <param name="w">Writer</param>
/// <param name="item">Classe à générer.</param>
private static void GenerateClassDeclaration(CSharpWriter w, ModelClass item)
private void GenerateClassDeclaration(CSharpWriter w, ModelClass item)
{
if (item.Stereotype == Stereotype.Reference)
{
Expand All @@ -72,9 +81,9 @@ private static void GenerateClassDeclaration(CSharpWriter w, ModelClass item)

if (item.DataContract.IsPersistent && !item.IsView)
{
if (GeneratorParameters.CSharp.DbSchema != null)
if (_parameters.DbSchema != null)
{
w.WriteAttribute(1, "Table", $@"""{item.DataContract.Name}""", $@"Schema = ""{GeneratorParameters.CSharp.DbSchema}""");
w.WriteAttribute(1, "Table", $@"""{item.DataContract.Name}""", $@"Schema = ""{_parameters.DbSchema}""");
}
else
{
Expand All @@ -90,7 +99,7 @@ private static void GenerateClassDeclaration(CSharpWriter w, ModelClass item)
GenerateExtensibilityMethods(w, item);
w.WriteLine(1, "}");

if (GeneratorParameters.CSharp.UseTypeSafeConstValues.Value)
if (_parameters.UseTypeSafeConstValues.Value)
{
GenerateConstPropertiesClass(w, item);
}
Expand All @@ -101,7 +110,7 @@ private static void GenerateClassDeclaration(CSharpWriter w, ModelClass item)
/// </summary>
/// <param name="w">Writer.</param>
/// <param name="item">La classe générée.</param>
private static void GenerateConstProperties(CSharpWriter w, ModelClass item)
private void GenerateConstProperties(CSharpWriter w, ModelClass item)
{
int nbConstValues = item.ConstValues.Count;
if (nbConstValues != 0)
Expand Down Expand Up @@ -130,9 +139,9 @@ private static void GenerateConstProperties(CSharpWriter w, ModelClass item)

w.WriteSummary(2, valueLibelle.Libelle);

if (GeneratorParameters.CSharp.UseTypeSafeConstValues.Value)
if (_parameters.UseTypeSafeConstValues.Value)
{
w.WriteLine(2, string.Format("public static readonly {2}Code {0} = new {2}Code({1});", constFieldName, valueLibelle.Code, item.Name));
w.WriteLine(2, string.Format("public readonly {2}Code {0} = new {2}Code({1});", constFieldName, valueLibelle.Code, item.Name));
}
else
{
Expand All @@ -149,7 +158,7 @@ private static void GenerateConstProperties(CSharpWriter w, ModelClass item)
/// </summary>
/// <param name="w">Writer.</param>
/// <param name="item">La classe générée.</param>
private static void GenerateConstPropertiesClass(CSharpWriter w, ModelClass item)
private void GenerateConstPropertiesClass(CSharpWriter w, ModelClass item)
{
int nbConstValues = item.ConstValues.Count;
if (nbConstValues != 0)
Expand All @@ -161,7 +170,7 @@ private static void GenerateConstPropertiesClass(CSharpWriter w, ModelClass item
w.WriteLine(1, $"public sealed class {item.Name}Code : TypeSafeEnum {{");
w.WriteLine();

w.WriteLine(2, $"private static readonly Dictionary<string, {item.Name}Code> Instance = new Dictionary<string, {item.Name}Code>();");
w.WriteLine(2, $"private readonly Dictionary<string, {item.Name}Code> Instance = new Dictionary<string, {item.Name}Code>();");
w.WriteLine();

w.WriteSummary(2, "Constructeur");
Expand All @@ -172,7 +181,7 @@ private static void GenerateConstPropertiesClass(CSharpWriter w, ModelClass item
w.WriteLine(2, "}");
w.WriteLine();

w.WriteLine(2, $"public static explicit operator {item.Name}Code(string value) {{");
w.WriteLine(2, $"public explicit operator {item.Name}Code(string value) {{");
w.WriteLine(3, $"System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof({item.Name}).TypeHandle);");
w.WriteLine(3, "if (Instance.TryGetValue(value, out var result)) {");
w.WriteLine(4, "return result;");
Expand All @@ -189,7 +198,7 @@ private static void GenerateConstPropertiesClass(CSharpWriter w, ModelClass item
/// </summary>
/// <param name="w">Writer.</param>
/// <param name="item">La classe générée.</param>
private static void GenerateConstructors(CSharpWriter w, ModelClass item)
private void GenerateConstructors(CSharpWriter w, ModelClass item)
{
GenerateDefaultConstructor(w, item);
GenerateCopyConstructor(w, item);
Expand All @@ -204,7 +213,7 @@ private static void GenerateConstructors(CSharpWriter w, ModelClass item)
/// </summary>
/// <param name="w">Writer.</param>
/// <param name="item">Classe générée.</param>
private static void GenerateCopyConstructor(CSharpWriter w, ModelClass item)
private void GenerateCopyConstructor(CSharpWriter w, ModelClass item)
{
w.WriteLine();
w.WriteSummary(2, "Constructeur par recopie.");
Expand Down Expand Up @@ -252,7 +261,7 @@ private static void GenerateCopyConstructor(CSharpWriter w, ModelClass item)
/// </summary>
/// <param name="w">Writer.</param>
/// <param name="item">Classe générée.</param>
private static void GenerateDefaultConstructor(CSharpWriter w, ModelClass item)
private void GenerateDefaultConstructor(CSharpWriter w, ModelClass item)
{
w.WriteSummary(2, "Constructeur.");
w.WriteLine(2, $@"public {item.Name}()");
Expand Down Expand Up @@ -288,7 +297,7 @@ private static void GenerateDefaultConstructor(CSharpWriter w, ModelClass item)
/// </summary>
/// <param name="w">Writer.</param>
/// <param name="item">Classe générée.</param>
private static void GenerateExtensibilityMethods(CSharpWriter w, ModelClass item)
private void GenerateExtensibilityMethods(CSharpWriter w, ModelClass item)
{
w.WriteLine();
w.WriteSummary(2, "Methode d'extensibilité possible pour les constructeurs.");
Expand All @@ -304,7 +313,7 @@ private static void GenerateExtensibilityMethods(CSharpWriter w, ModelClass item
/// </summary>
/// <param name="w">Writer.</param>
/// <param name="item">La classe générée.</param>
private static void GenerateProperties(CSharpWriter w, ModelClass item)
private void GenerateProperties(CSharpWriter w, ModelClass item)
{
if (item.PropertyList.Count > 0)
{
Expand All @@ -327,7 +336,7 @@ private static void GenerateProperties(CSharpWriter w, ModelClass item)
/// </summary>
/// <param name="w">Writer.</param>
/// <param name="property">La propriété générée.</param>
private static void GenerateProperty(CSharpWriter w, ModelProperty property)
private void GenerateProperty(CSharpWriter w, ModelProperty property)
{
w.WriteSummary(2, property.Comment);

Expand Down Expand Up @@ -374,6 +383,10 @@ private static void GenerateProperty(CSharpWriter w, ModelProperty property)
w.WriteAttribute(2, "DatabaseGenerated", "DatabaseGeneratedOption.None");
}
}
else if (property.DefaultValue != null)
{
w.WriteAttribute(2, "DatabaseGenerated", "DatabaseGeneratedOption.Identity");
}

if (!property.IsPrimitive)
{
Expand All @@ -388,11 +401,11 @@ private static void GenerateProperty(CSharpWriter w, ModelProperty property)
/// </summary>
/// <param name="w">Writer.</param>
/// <param name="item">Classe concernée.</param>
private static void GenerateUsings(CSharpWriter w, ModelClass item)
private void GenerateUsings(CSharpWriter w, ModelClass item)
{
var usings = new List<string> { "System" };

if (item.HasCollection || (GeneratorParameters.CSharp.UseTypeSafeConstValues == true && item.ConstValues != null && item.ConstValues.Count > 0))
if (item.HasCollection || (_parameters.UseTypeSafeConstValues == true && item.ConstValues != null && item.ConstValues.Count > 0))
{
usings.Add("System.Collections.Generic");
}
Expand All @@ -414,7 +427,7 @@ private static void GenerateUsings(CSharpWriter w, ModelClass item)

if (item.HasDomainAttribute || item.ParentClass == null)
{
if (GeneratorParameters.Kinetix == "Core")
if (_parameters.Kinetix == "Core")
{
usings.Add("Kinetix.ComponentModel.Annotations");
}
Expand All @@ -438,12 +451,12 @@ private static void GenerateUsings(CSharpWriter w, ModelClass item)

if (!string.IsNullOrEmpty(property.DataDescription.ReferenceClass?.Namespace?.Name))
{
usings.Add($"{GeneratorParameters.RootNamespace}.{property.DataDescription.ReferenceClass.Namespace.Name}");
usings.Add($"{_rootNamespace}.{property.DataDescription.ReferenceClass.Namespace.Name}");
}
}

w.WriteUsings(usings
.Where(u => u != $"{GeneratorParameters.RootNamespace}.{item.Namespace.Name}")
.Where(u => u != $"{_rootNamespace}.{item.Namespace.Name}")
.Distinct()
.ToArray());
}
Expand All @@ -454,7 +467,7 @@ private static void GenerateUsings(CSharpWriter w, ModelClass item)
/// <param name="fieldName">Nom de la variable membre privée.</param>
/// <param name="dataType">Type de données.</param>
/// <returns>Code généré.</returns>
private static string LoadPropertyInit(string fieldName, string dataType)
private string LoadPropertyInit(string fieldName, string dataType)
{
var res = $"{fieldName} = ";
if (IsCSharpBaseType(dataType))
Expand Down
25 changes: 15 additions & 10 deletions Kinetix.ClassGenerator/CSharpGenerator/CSharpCodeGenerator.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
using System;
using System.Collections.Generic;
using System.IO;
using Kinetix.ClassGenerator.Model;
using Kinetix.Tools.Common.Model;
using Kinetix.Tools.Common.Parameters;

namespace Kinetix.ClassGenerator.CSharpGenerator
{
using static CodeUtils;
{
using static CSharpUtils;

/// <summary>
/// Générateur de code C#.
Expand All @@ -15,15 +16,19 @@ public static class CSharpCodeGenerator
/// <summary>
/// Génère le code des classes.
/// </summary>
/// <param name="rootNamespace">Namespace de l'application.</param>
/// <param name="parameters">Paramètres génération C#</param>
/// <param name="modelRootList">Liste des modeles.</param>
public static void Generate(ICollection<ModelRoot> modelRootList)
public static void Generate(string rootNamespace, CSharpParameters parameters, ICollection<ModelRoot> modelRootList)
{
if (modelRootList == null)
{
throw new ArgumentNullException(nameof(modelRootList));
}

DbContextGenerator.Generate(modelRootList);
new DbContextGenerator(rootNamespace, parameters).Generate(modelRootList);

var classGenerator = new CSharpClassGenerator(rootNamespace, parameters);

foreach (ModelRoot model in modelRootList)
{
Expand All @@ -33,22 +38,22 @@ public static void Generate(ICollection<ModelRoot> modelRootList)
{
if (!Directory.Exists(ns.Name))
{
var directoryForModelClass = GetDirectoryForModelClass(ns.HasPersistentClasses, model.Name, ns.Name);
var projectDirectory = GetDirectoryForProject(ns.HasPersistentClasses, model.Name, ns.Name);
var directoryForModelClass = GetDirectoryForModelClass(parameters.OutputDirectory, ns.HasPersistentClasses, model.Name, ns.Name);
var projectDirectory = GetDirectoryForProject(parameters.OutputDirectory, ns.HasPersistentClasses, model.Name, ns.Name);
var csprojFileName = Path.Combine(projectDirectory, model.Name + "." + ns.Name + ".csproj");

foreach (ModelClass item in ns.ClassList)
{
var currentDirectory = GetDirectoryForModelClass(item.DataContract.IsPersistent, model.Name, item.Namespace.Name);
var currentDirectory = GetDirectoryForModelClass(parameters.OutputDirectory, item.DataContract.IsPersistent, model.Name, item.Namespace.Name);
Directory.CreateDirectory(currentDirectory);
CSharpClassGenerator.Generate(item, ns);
classGenerator.Generate(item, ns);
}
}
}
}
}

ReferenceAccessorGenerator.Generate(modelRootList);
new ReferenceAccessorGenerator(rootNamespace, parameters).Generate(modelRootList);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
using System.Collections.Generic;
using System.IO;

namespace Kinetix.ClassGenerator
namespace Kinetix.ClassGenerator.CSharpGenerator
{
/// <summary>
/// Classe utilitaire destinée à la génération de code.
/// Classe utilitaire destinée à la génération de C#.
/// </summary>
public static class CodeUtils
public static class CSharpUtils
{
private static IDictionary<string, string> regType;

Expand Down Expand Up @@ -58,31 +58,32 @@ public static string GetCSharpDefaultValueBaseType(string name)
/// <summary>
/// Retourne le nom du répertoire dans lequel placer la classe générée à partir du ModelClass fourni.
/// </summary>
/// <param name="outDir">Répertoire de sortie.</param>
/// <param name="isPersistent">Trie s'il s'agit du domaine persistant.</param>
/// <param name="projectName">Nom du projet.</param>
/// <param name="nameSpace">Namespace de la classe.</param>
/// <returns>Emplacement dans lequel placer la classe générée à partir du ModelClass fourni.</returns>
public static string GetDirectoryForModelClass(bool isPersistent, string projectName, string nameSpace)
public static string GetDirectoryForModelClass(string outDir, bool isPersistent, string projectName, string nameSpace)
{
var basePath = Singletons.GeneratorParameters.CSharp.OutputDirectory;
var moduleMetier = ExtractModuleMetier(nameSpace);
var localPath = Path.Combine(moduleMetier, projectName + "." + nameSpace);
string path = isPersistent ? Path.Combine(basePath, localPath) : Path.Combine(basePath, localPath, "Dto");
string path = isPersistent ? Path.Combine(outDir, localPath) : Path.Combine(outDir, localPath, "Dto");
return Path.Combine(path, "generated");
}

/// <summary>
/// Retourne le nom du répertoire du projet d'une classe.
/// </summary>
/// <param name="outDir">Répertoire de sortie.</param>
/// <param name="isPersistent">Trie s'il s'agit du domaine persistant.</param>
/// <param name="projectName">Nom du projet.</param>
/// <param name="nameSpace">Namespace de la classe.</param>
/// <returns>Nom du répertoire contenant le csproj.</returns>
public static string GetDirectoryForProject(bool isPersistent, string projectName, string nameSpace)
public static string GetDirectoryForProject(string outDir, bool isPersistent, string projectName, string nameSpace)
{
var moduleMetier = ExtractModuleMetier(nameSpace);
var localPath = Path.Combine(moduleMetier, projectName + "." + nameSpace);
return Path.Combine(Singletons.GeneratorParameters.CSharp.OutputDirectory, localPath);
return Path.Combine(outDir, localPath);
}

/// <summary>
Expand Down Expand Up @@ -127,7 +128,7 @@ public static string LoadInnerDataType(string dataType)
/// </summary>
/// <param name="propertyName">Nom de la propriété.</param>
/// <returns>Nom de la variable membre privée.</returns>
public static string LoadPrivateFieldName(string propertyName)
private static string LoadPrivateFieldName(string propertyName)
{
if (string.IsNullOrEmpty(propertyName))
{
Expand Down
Loading