From 106ec09ac52f53f7fab9b4eb4c780bceeb4af213 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Tue, 21 May 2024 09:29:08 +0200 Subject: [PATCH 1/3] Update --- Tests/Tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index 5925039..09e2847 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -12,7 +12,7 @@ - + -- 2.43.0 From 549a34eed10a83204dbd58625ef82458694a3cda Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Tue, 21 May 2024 09:29:43 +0200 Subject: [PATCH 2/3] Fixed issue where code generator runs multiple times --- CSV Metrics Logger/CSV Metrics Logger.csproj | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/CSV Metrics Logger/CSV Metrics Logger.csproj b/CSV Metrics Logger/CSV Metrics Logger.csproj index 60241f9..b684756 100644 --- a/CSV Metrics Logger/CSV Metrics Logger.csproj +++ b/CSV Metrics Logger/CSV Metrics Logger.csproj @@ -25,10 +25,16 @@ - + + all + build; analyzers; buildtransitive + - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + -- 2.43.0 From a81e88c727553621b4abd2d98e995fd81d2c41a5 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Tue, 21 May 2024 09:31:46 +0200 Subject: [PATCH 3/3] Added support for generic properties --- .../CSVConverterGenerator.cs | 24 ++++++++++++------- Tests/TestGeneric.cs | 8 +++++++ Tests/Tests.cs | 17 +++++++++++++ 3 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 Tests/TestGeneric.cs diff --git a/CSV Metrics Logger Generator/CSVConverterGenerator.cs b/CSV Metrics Logger Generator/CSVConverterGenerator.cs index 43dcd67..eb52ad9 100644 --- a/CSV Metrics Logger Generator/CSVConverterGenerator.cs +++ b/CSV Metrics Logger Generator/CSVConverterGenerator.cs @@ -29,6 +29,9 @@ public class CSVConverterGenerator : ISourceGenerator private void ProcessStructure(GeneratorExecutionContext context, TypeDeclarationSyntax dataStructure) { + var generatedFileName = $"{dataStructure.Identifier}.Generated.cs"; + var namespaceName = this.GetNamespaceFrom(dataStructure); + var accessModifiers = string.Join(' ', dataStructure.Modifiers.Select(n => n.Text)); var declarationType = dataStructure switch { @@ -37,22 +40,27 @@ public class CSVConverterGenerator : ISourceGenerator _ => string.Empty }; - var namespaceName = this.GetNamespaceFrom(dataStructure); - var parameterProperties = dataStructure.ParameterList?.Parameters.Select(n => n.Identifier.ValueText).ToList() ?? []; - var bodyProperties = dataStructure.Members.OfType().Select(n => n.Identifier.ValueText).ToList(); - var allProperties = new List(parameterProperties); - allProperties.AddRange(bodyProperties); + + var typeParameters = dataStructure switch + { + { TypeParameterList: not null } => $"<{string.Join(", ", dataStructure.TypeParameterList.Parameters.Select(t => t.Identifier.Text))}>", + _ => string.Empty + }; + + var parameterProperties = dataStructure.ParameterList?.Parameters.Select(n => n.Identifier.ValueText) ?? []; + var bodyProperties = dataStructure.Members.OfType().Select(n => n.Identifier.ValueText); + var allProperties = parameterProperties.Concat(bodyProperties).ToList(); var numberProperties = allProperties.Count; var header = string.Join(ARRAY_DELIMITER, allProperties.Select(n => $"\"{n}\"")); - var allFieldsString = string.Join(ARRAY_DELIMITER, allProperties.Select(n => $"this.{n}.ToString(CultureInfo.InvariantCulture)")); + var allFieldsString = string.Join(ARRAY_DELIMITER, allProperties.Select(n => $$"""string.Create(CultureInfo.InvariantCulture, $"{this.{{n}}}")""")); var sourceCode = SourceText.From( $$""" using System.Globalization; using CSV_Metrics_Logger; namespace {{namespaceName}}; - {{accessModifiers}} {{declarationType}} {{dataStructure.Identifier}} : IConvertToCSV + {{accessModifiers}} {{declarationType}} {{dataStructure.Identifier}}{{typeParameters}} : IConvertToCSV { public uint GetCSVColumnCount() { @@ -71,7 +79,7 @@ public class CSVConverterGenerator : ISourceGenerator } """, Encoding.UTF8); - context.AddSource($"{dataStructure.Identifier}.Generated.cs", sourceCode); + context.AddSource(generatedFileName, sourceCode); } private string GetNamespaceFrom(SyntaxNode? node) => node switch diff --git a/Tests/TestGeneric.cs b/Tests/TestGeneric.cs new file mode 100644 index 0000000..fa0225f --- /dev/null +++ b/Tests/TestGeneric.cs @@ -0,0 +1,8 @@ +using System.Numerics; + +using CSV_Metrics_Logger; + +namespace Tests; + +[CSVRecord] +public readonly partial record struct TestGeneric(string Name, sbyte Age, TNum Value) where TNum : IFloatingPointIeee754; \ No newline at end of file diff --git a/Tests/Tests.cs b/Tests/Tests.cs index ee0d656..d553ce7 100644 --- a/Tests/Tests.cs +++ b/Tests/Tests.cs @@ -60,6 +60,23 @@ public sealed class Tests }); } + [Test] + public void TestGeneric() + { + var testData = new TestGeneric("Bob", 120, 4.78f); + Assert.Multiple(() => + { + var numberColumns = testData.GetCSVColumnCount(); + Assert.That(numberColumns, Is.EqualTo(3)); + + var header = testData.GetCSVHeaders(); + Assert.That(header, Is.EquivalentTo(new[] { "Name", "Age", "Value" })); + + var dataLine = testData.ConvertToCSVDataLine(); + Assert.That(dataLine, Is.EquivalentTo(new[] { "Bob", "120", "4.78" })); + }); + } + [Test] public void TestRegularStruct() { -- 2.43.0