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

Commit

Permalink
Merge pull request #1 from get-focus/preemptive-refactor
Browse files Browse the repository at this point in the history
Kinetix.Tools.Core + T4 and parameters singleton removal + .NET Core
  • Loading branch information
c3dr0x committed Jul 24, 2018
2 parents ded989d + 8eef774 commit dfbc295
Show file tree
Hide file tree
Showing 89 changed files with 3,604 additions and 5,135 deletions.
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

0 comments on commit dfbc295

Please sign in to comment.