Skip to content
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
34 changes: 31 additions & 3 deletions Datra.Generators/DataContextSourceGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,10 @@ public void Execute(GeneratorExecutionContext context)
bool enableDebugLogging = false;
bool emitPhysicalFiles = false;
string physicalFilesPath = null;
bool emitYamlSerializers = GetBoolBuildProperty(
context,
"DatraEmitYamlSerializers",
defaultValue: true);

// Read optional named arguments
foreach (var arg in configAttr.NamedArguments)
Expand Down Expand Up @@ -177,7 +181,7 @@ public void Execute(GeneratorExecutionContext context)
GeneratorLogger.AddDebugOutput(context);
return;
}
GeneratorLogger.Log($"Found DatraConfigurationAttribute: ContextName={contextName}, Namespace={generatedNamespace}, EnableLocalization={enableLocalization}, LocalizationKeyDataPath={localizationKeysPath}, LocalizationDataPath={localizationDataPath}, DefaultLanguage={defaultLanguage}, EnableDebugLogging={enableDebugLogging}, EmitPhysicalFiles={emitPhysicalFiles}, PhysicalFilesPath={physicalFilesPath}");
GeneratorLogger.Log($"Found DatraConfigurationAttribute: ContextName={contextName}, Namespace={generatedNamespace}, EnableLocalization={enableLocalization}, LocalizationKeyDataPath={localizationKeysPath}, LocalizationDataPath={localizationDataPath}, DefaultLanguage={defaultLanguage}, EnableDebugLogging={enableDebugLogging}, EmitPhysicalFiles={emitPhysicalFiles}, PhysicalFilesPath={physicalFilesPath}, EmitYamlSerializers={emitYamlSerializers}");

// Filter out localization models
var filteredModels = dataModels
Expand All @@ -203,7 +207,7 @@ public void Execute(GeneratorExecutionContext context)
GeneratorLogger.Log($"Generated {contextName}.g.cs");

// Generate DataModel files
var dataModelGenerator = new DataModelGenerator(context);
var dataModelGenerator = new DataModelGenerator(emitYamlSerializers);
foreach (var model in dataModels)
{
var dataModelCode = dataModelGenerator.GenerateDataModelFile(model);
Expand Down Expand Up @@ -249,6 +253,30 @@ public void Execute(GeneratorExecutionContext context)
}
}

/// <summary>
/// Read a bool MSBuild property exposed to analyzers as
/// build_property.PropertyName.
/// </summary>
private static bool GetBoolBuildProperty(
GeneratorExecutionContext context,
string propertyName,
bool defaultValue)
{
if (!context.AnalyzerConfigOptions.GlobalOptions.TryGetValue(
$"build_property.{propertyName}",
out var value))
{
return defaultValue;
}

if (bool.TryParse(value, out var parsed))
{
return parsed;
}

return defaultValue;
}

/// <summary>
/// Emit a physical file for the DataContext to the project directory
/// </summary>
Expand Down Expand Up @@ -434,4 +462,4 @@ private static string SanitizeNamespace(string input)
return string.IsNullOrEmpty(result) ? "Generated" : result;
}
}
}
}
18 changes: 8 additions & 10 deletions Datra.Generators/Generators/DataModelGenerator.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using Datra.Generators.Builders;
using Datra.Generators.Models;

namespace Datra.Generators.Generators
{
internal class DataModelGenerator
{
private readonly GeneratorExecutionContext _context;
private readonly bool _emitYamlSerializers;

public DataModelGenerator(GeneratorExecutionContext context)
public DataModelGenerator(bool emitYamlSerializers = true)
{
_context = context;
_emitYamlSerializers = emitYamlSerializers;
}

private static bool IsPrimitiveType(string typeName)
Expand Down Expand Up @@ -253,7 +251,7 @@ private void GenerateTableSerializerMethods(CodeBuilder codeBuilder, DataModelIn

// Generate YAML-specific methods without serializer parameter
var isYamlFormat = CodeBuilder.IsYamlFormat(model.Format, model.FilePath);
if (isYamlFormat)
if (isYamlFormat && _emitYamlSerializers)
{
codeBuilder.AddBlankLine();

Expand Down Expand Up @@ -298,7 +296,7 @@ private void GenerateSingleSerializerMethods(CodeBuilder codeBuilder, DataModelI
var jsonBuilder = new JsonSerializerBuilder();
jsonBuilder.GenerateSingleDeserializer(codeBuilder, model, simpleTypeName);
break;
case "Yaml":
case "Yaml" when _emitYamlSerializers:
var yamlBuilder = new YamlSerializerBuilder();
yamlBuilder.GenerateSingleDeserializer(codeBuilder, model, simpleTypeName);
break;
Expand All @@ -319,7 +317,7 @@ private void GenerateSingleSerializerMethods(CodeBuilder codeBuilder, DataModelI
var jsonBuilder2 = new JsonSerializerBuilder();
jsonBuilder2.GenerateSingleSerializer(codeBuilder, model, simpleTypeName);
break;
case "Yaml":
case "Yaml" when _emitYamlSerializers:
var yamlBuilder2 = new YamlSerializerBuilder();
yamlBuilder2.GenerateSingleSerializer(codeBuilder, model, simpleTypeName);
break;
Expand All @@ -332,7 +330,7 @@ private void GenerateSingleSerializerMethods(CodeBuilder codeBuilder, DataModelI

// Generate YAML-specific methods without serializer parameter
var isYamlFormat = CodeBuilder.IsYamlFormat(model.Format, model.FilePath);
if (isYamlFormat)
if (isYamlFormat && _emitYamlSerializers)
{
codeBuilder.AddBlankLine();

Expand All @@ -352,4 +350,4 @@ private void GenerateSingleSerializerMethods(CodeBuilder codeBuilder, DataModelI
}
}
}
}
}
84 changes: 84 additions & 0 deletions Datra.Tests/DataModelGeneratorTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
using System.Collections.Generic;
using Datra.Generators.Generators;
using Datra.Generators.Models;
using Xunit;

namespace Datra.Tests
{
public class DataModelGeneratorTests
{
[Fact]
public void GenerateDataModelFile_YamlTable_EmitsYamlHelpersByDefault()
{
var generator = new DataModelGenerator();

var code = generator.GenerateDataModelFile(CreateYamlTableModel());

Assert.Contains("DeserializeYaml", code);
Assert.Contains("SerializeYaml", code);
Assert.Contains("YamlDotNet", code);
}

[Fact]
public void GenerateDataModelFile_YamlTable_CanSkipYamlHelpers()
{
var generator = new DataModelGenerator(emitYamlSerializers: false);

var code = generator.GenerateDataModelFile(CreateYamlTableModel());

Assert.Contains("serializer.DeserializeTable<int, MonsterData>(data);", code);
Assert.Contains("serializer.SerializeTable<int, MonsterData>(table);", code);
Assert.DoesNotContain("DeserializeYaml", code);
Assert.DoesNotContain("SerializeYaml", code);
Assert.DoesNotContain("YamlDotNet", code);
}

[Fact]
public void GenerateDataModelFile_YamlSingle_CanSkipDirectYamlDeserializer()
{
var generator = new DataModelGenerator(emitYamlSerializers: false);

var code = generator.GenerateDataModelFile(CreateYamlSingleModel());

Assert.Contains("serializer.DeserializeSingle<GameSettings>(data);", code);
Assert.Contains("serializer.SerializeSingle<GameSettings>(data);", code);
Assert.DoesNotContain("DeserializeYaml", code);
Assert.DoesNotContain("SerializeYaml", code);
Assert.DoesNotContain("YamlDotNet", code);
}

private static DataModelInfo CreateYamlTableModel()
{
return new DataModelInfo
{
TypeName = "Game.Data.MonsterData",
PropertyName = "Monsters",
IsTableData = true,
KeyType = "int",
Format = "Yaml",
FilePath = "monsters.yaml",
Properties = new List<PropertyInfo>
{
new PropertyInfo { Name = "Id", Type = "int" },
new PropertyInfo { Name = "Name", Type = "string" }
}
};
}

private static DataModelInfo CreateYamlSingleModel()
{
return new DataModelInfo
{
TypeName = "Game.Data.GameSettings",
PropertyName = "Settings",
IsTableData = false,
Format = "Yaml",
FilePath = "settings.yaml",
Properties = new List<PropertyInfo>
{
new PropertyInfo { Name = "DisplayName", Type = "string" }
}
};
}
}
}
Loading