From 6dc941fcd6df6a33c69074d55371d14626bbb275 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 7 Nov 2024 20:27:40 +0100 Subject: [PATCH 01/24] Use IIncrementalGenerator --- .../FileGenerators/ExtraFilesGenerator.cs | 280 +++++++++--------- ...uentBuilderClassesGenerator.IDictionary.cs | 4 +- ...uentBuilderClassesGenerator.IEnumerable.cs | 6 +- .../FluentBuilderClassesGenerator.cs | 87 +++--- .../FluentBuilderSourceGenerator.cs | 131 ++++---- .../AutoGenerateBuilderSyntaxReceiver.cs | 45 ++- .../IAutoGenerateBuilderSyntaxReceiver.cs | 9 - ...ContextWrapper.cs => CompilationHelper.cs} | 129 ++++---- .../IGeneratorExecutionContextWrapper.cs | 23 -- 9 files changed, 354 insertions(+), 360 deletions(-) delete mode 100644 src/FluentBuilderGenerator/SyntaxReceiver/IAutoGenerateBuilderSyntaxReceiver.cs rename src/FluentBuilderGenerator/Wrappers/{GeneratorExecutionContextWrapper.cs => CompilationHelper.cs} (52%) delete mode 100644 src/FluentBuilderGenerator/Wrappers/IGeneratorExecutionContextWrapper.cs diff --git a/src/FluentBuilderGenerator/FileGenerators/ExtraFilesGenerator.cs b/src/FluentBuilderGenerator/FileGenerators/ExtraFilesGenerator.cs index 2ae9143..be816f8 100644 --- a/src/FluentBuilderGenerator/FileGenerators/ExtraFilesGenerator.cs +++ b/src/FluentBuilderGenerator/FileGenerators/ExtraFilesGenerator.cs @@ -3,163 +3,157 @@ using FluentBuilderGenerator.Extensions; using FluentBuilderGenerator.Models; using FluentBuilderGenerator.Types; -using FluentBuilderGenerator.Wrappers; namespace FluentBuilderGenerator.FileGenerators; -internal class ExtraFilesGenerator(IGeneratorExecutionContextWrapper context) : IFileGenerator +internal class ExtraFilesGenerator : IFileGenerator { private const string Name = "FluentBuilder.Extra.g.cs"; - private readonly bool _supportsNullable = context.SupportsNullable; - private readonly bool _supportsGenericAttributes = context.SupportsGenericAttributes; + private readonly bool _supportsNullable; + private readonly bool _supportsGenericAttributes; + + public ExtraFilesGenerator(bool supportsNullable, bool supportsGenericAttributes) + { + _supportsNullable = supportsNullable; + _supportsGenericAttributes = supportsGenericAttributes; + } public FileData GenerateFile() { - var autoGenerateBuilderAttribute = - $$""" - [AttributeUsage(AttributeTargets.Class)] - internal sealed class AutoGenerateBuilderAttribute : Attribute - { - public Type{{_supportsNullable.IIf("?")}} Type { get; } - public bool HandleBaseClasses { get; } - public FluentBuilderAccessibility Accessibility { get; } - public FluentBuilderMethods Methods { get; } - - public AutoGenerateBuilderAttribute() : this(null, true, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) - { - } - - public AutoGenerateBuilderAttribute(bool handleBaseClasses) : this(null, handleBaseClasses, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) - { - } - - public AutoGenerateBuilderAttribute(FluentBuilderAccessibility accessibility) : this(null, true, accessibility, FluentBuilderMethods.WithOnly) - { - } - - public AutoGenerateBuilderAttribute(FluentBuilderMethods methods) : this(null, true, FluentBuilderAccessibility.Public, methods) - { - } - - public AutoGenerateBuilderAttribute(bool handleBaseClasses, FluentBuilderAccessibility accessibility) : this(null, handleBaseClasses, accessibility, FluentBuilderMethods.WithOnly) - { - } - - public AutoGenerateBuilderAttribute(bool handleBaseClasses, FluentBuilderMethods methods) : this(null, handleBaseClasses, FluentBuilderAccessibility.Public, methods) - { - } - - public AutoGenerateBuilderAttribute(Type{{_supportsNullable.IIf("?")}} type) : this(type, true, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) - { - } - - public AutoGenerateBuilderAttribute(Type{{_supportsNullable.IIf("?")}} type, bool handleBaseClasses) : this(type, handleBaseClasses, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) - { - } - - public AutoGenerateBuilderAttribute(Type{{_supportsNullable.IIf("?")}} type, FluentBuilderAccessibility accessibility) : this(type, true, accessibility, FluentBuilderMethods.WithOnly) - { - } - - public AutoGenerateBuilderAttribute(Type{{_supportsNullable.IIf("?")}} type, bool handleBaseClasses, FluentBuilderAccessibility accessibility) : this(type, handleBaseClasses, accessibility, FluentBuilderMethods.WithOnly) - { - } - - public AutoGenerateBuilderAttribute(Type{{_supportsNullable.IIf("?")}} type, bool handleBaseClasses, FluentBuilderMethods methods) : this(type, handleBaseClasses, FluentBuilderAccessibility.Public, methods) - { - } - - public AutoGenerateBuilderAttribute(Type{{_supportsNullable.IIf("?")}} type, bool handleBaseClasses, FluentBuilderAccessibility accessibility, FluentBuilderMethods methods) - { - Type = type; - HandleBaseClasses = handleBaseClasses; - Accessibility = accessibility; - Methods = methods; - } - } - """; - - const string autoGenerateBuilderAttributeGeneric = - """ - [AttributeUsage(AttributeTargets.Class)] - internal sealed class AutoGenerateBuilderAttribute : Attribute where T : class - { - public Type Type { get; } - public bool HandleBaseClasses { get; } - public FluentBuilderAccessibility Accessibility { get; } - public FluentBuilderMethods Methods { get; } - - public AutoGenerateBuilderAttribute() : this(true, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) - { - } - - public AutoGenerateBuilderAttribute(bool handleBaseClasses) : this(handleBaseClasses, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) - { - } - - public AutoGenerateBuilderAttribute(FluentBuilderAccessibility accessibility) : this(true, accessibility, FluentBuilderMethods.WithOnly) - { - } - - public AutoGenerateBuilderAttribute(bool handleBaseClasses, FluentBuilderAccessibility accessibility) : this(handleBaseClasses, accessibility, FluentBuilderMethods.WithOnly) - { - } - - public AutoGenerateBuilderAttribute(bool handleBaseClasses, FluentBuilderMethods methods) : this(handleBaseClasses, FluentBuilderAccessibility.Public, methods) - { - } - - public AutoGenerateBuilderAttribute(bool handleBaseClasses, FluentBuilderAccessibility accessibility, FluentBuilderMethods methods) - { - Type = typeof(T); - HandleBaseClasses = handleBaseClasses; - Accessibility = accessibility; - Methods = methods; - } - } - """; - - var text = - $$""" - {{Header.Text}} - - {{_supportsNullable.IIf("#nullable enable")}} - using System; - - namespace FluentBuilder - { - {{autoGenerateBuilderAttribute}} - - {{_supportsGenericAttributes.IIf(autoGenerateBuilderAttributeGeneric)}} - - [AttributeUsage(AttributeTargets.Property)] - internal sealed class FluentBuilderIgnoreAttribute : Attribute - { - } - - [Flags] - internal enum FluentBuilderAccessibility - { - Public = 0, - PublicAndPrivate = 1 - } - - [Flags] - internal enum FluentBuilderMethods - { - WithOnly = 0, - WithAndWithout = 1 - } - } - {{_supportsNullable.IIf("#nullable restore")}} - """; + var autoGenerateBuilderAttribute = $@"[AttributeUsage(AttributeTargets.Class)] + internal sealed class AutoGenerateBuilderAttribute : Attribute + {{ + public Type{_supportsNullable.IIf("?")} Type {{ get; }} + public bool HandleBaseClasses {{ get; }} + public FluentBuilderAccessibility Accessibility {{ get; }} + public FluentBuilderMethods Methods {{ get; }} + + public AutoGenerateBuilderAttribute() : this(null, true, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) + {{ + }} + + public AutoGenerateBuilderAttribute(bool handleBaseClasses) : this(null, handleBaseClasses, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) + {{ + }} + + public AutoGenerateBuilderAttribute(FluentBuilderAccessibility accessibility) : this(null, true, accessibility, FluentBuilderMethods.WithOnly) + {{ + }} + + public AutoGenerateBuilderAttribute(FluentBuilderMethods methods) : this(null, true, FluentBuilderAccessibility.Public, methods) + {{ + }} + + public AutoGenerateBuilderAttribute(bool handleBaseClasses, FluentBuilderAccessibility accessibility) : this(null, handleBaseClasses, accessibility, FluentBuilderMethods.WithOnly) + {{ + }} + + public AutoGenerateBuilderAttribute(bool handleBaseClasses, FluentBuilderMethods methods) : this(null, handleBaseClasses, FluentBuilderAccessibility.Public, methods) + {{ + }} + + public AutoGenerateBuilderAttribute(Type{_supportsNullable.IIf("?")} type) : this(type, true, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) + {{ + }} + + public AutoGenerateBuilderAttribute(Type{_supportsNullable.IIf("?")} type, bool handleBaseClasses) : this(type, handleBaseClasses, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) + {{ + }} + + public AutoGenerateBuilderAttribute(Type{_supportsNullable.IIf("?")} type, FluentBuilderAccessibility accessibility) : this(type, true, accessibility, FluentBuilderMethods.WithOnly) + {{ + }} + + public AutoGenerateBuilderAttribute(Type{_supportsNullable.IIf("?")} type, bool handleBaseClasses, FluentBuilderAccessibility accessibility) : this(type, handleBaseClasses, accessibility, FluentBuilderMethods.WithOnly) + {{ + }} + + public AutoGenerateBuilderAttribute(Type{_supportsNullable.IIf("?")} type, bool handleBaseClasses, FluentBuilderMethods methods) : this(type, handleBaseClasses, FluentBuilderAccessibility.Public, methods) + {{ + }} + + public AutoGenerateBuilderAttribute(Type{_supportsNullable.IIf("?")} type, bool handleBaseClasses, FluentBuilderAccessibility accessibility, FluentBuilderMethods methods) + {{ + Type = type; + HandleBaseClasses = handleBaseClasses; + Accessibility = accessibility; + Methods = methods; + }} + }}"; + + var autoGenerateBuilderAttributeGeneric = $@"[AttributeUsage(AttributeTargets.Class)] + internal sealed class AutoGenerateBuilderAttribute : Attribute where T : class + {{ + public Type Type {{ get; }} + public bool HandleBaseClasses {{ get; }} + public FluentBuilderAccessibility Accessibility {{ get; }} + public FluentBuilderMethods Methods {{ get; }} + + public AutoGenerateBuilderAttribute() : this(true, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) + {{ + }} + + public AutoGenerateBuilderAttribute(bool handleBaseClasses) : this(handleBaseClasses, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) + {{ + }} + + public AutoGenerateBuilderAttribute(FluentBuilderAccessibility accessibility) : this(true, accessibility, FluentBuilderMethods.WithOnly) + {{ + }} + + public AutoGenerateBuilderAttribute(bool handleBaseClasses, FluentBuilderAccessibility accessibility) : this(handleBaseClasses, accessibility, FluentBuilderMethods.WithOnly) + {{ + }} + + public AutoGenerateBuilderAttribute(bool handleBaseClasses, FluentBuilderMethods methods) : this(handleBaseClasses, FluentBuilderAccessibility.Public, methods) + {{ + }} + + public AutoGenerateBuilderAttribute(bool handleBaseClasses, FluentBuilderAccessibility accessibility, FluentBuilderMethods methods) + {{ + Type = typeof(T); + HandleBaseClasses = handleBaseClasses; + Accessibility = accessibility; + Methods = methods; + }} + }}"; return new FileData ( FileDataType.Attribute, Name, - text + $@"{Header.Text} + +{_supportsNullable.IIf("#nullable enable")} +using System; + +namespace FluentBuilder +{{ + {autoGenerateBuilderAttribute} + + {_supportsGenericAttributes.IIf(autoGenerateBuilderAttributeGeneric)} + + [AttributeUsage(AttributeTargets.Property)] + internal sealed class FluentBuilderIgnoreAttribute : Attribute + {{ + }} + + [Flags] + internal enum FluentBuilderAccessibility + {{ + Public = 0, + PublicAndPrivate = 1 + }} + + [Flags] + internal enum FluentBuilderMethods + {{ + WithOnly = 0, + WithAndWithout = 1 + }} +}} +{_supportsNullable.IIf("#nullable disable")}" ); } } \ No newline at end of file diff --git a/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.IDictionary.cs b/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.IDictionary.cs index f4cc327..d39192e 100644 --- a/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.IDictionary.cs +++ b/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.IDictionary.cs @@ -29,9 +29,9 @@ private StringBuilder GenerateWithIDictionaryBuilderActionMethod( var cast = property.Type.TypeKind == TypeKind.Interface ? "" : $"({property.Type}) "; return new StringBuilder() - .AppendLine($" public {className} With{property.Name}(Action<{_context.AssemblyName}.FluentBuilder.{dictionaryBuilderName}> action, bool useObjectInitializer = true) => With{property.Name}(() =>") + .AppendLine($" public {className} With{property.Name}(Action<{_compilationHelper.AssemblyName}.FluentBuilder.{dictionaryBuilderName}> action, bool useObjectInitializer = true) => With{property.Name}(() =>") .AppendLine(" {") - .AppendLine($" var builder = new {_context.AssemblyName}.FluentBuilder.{dictionaryBuilderName}();") + .AppendLine($" var builder = new {_compilationHelper.AssemblyName}.FluentBuilder.{dictionaryBuilderName}();") .AppendLine(" action(builder);") .AppendLine($" return {cast}builder.Build(useObjectInitializer);") .AppendLine(" });"); diff --git a/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.IEnumerable.cs b/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.IEnumerable.cs index b28566f..6884382 100644 --- a/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.IEnumerable.cs +++ b/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.IEnumerable.cs @@ -20,11 +20,11 @@ private string CreateIEnumerableBuilderCode(ClassSymbol classSymbol) // //------------------------------------------------------------------------------ -{(_context.SupportsNullable ? "#nullable enable" : string.Empty)} +{(_supportsNullable ? "#nullable enable" : string.Empty)} using System; using System.Collections; using System.Collections.Generic; -using {_context.AssemblyName}.FluentBuilder; +using {_compilationHelper.AssemblyName}.FluentBuilder; using {classSymbol.NamedTypeSymbol.ContainingNamespace}; namespace {classSymbol.BuilderNamespace} @@ -37,7 +37,7 @@ public partial class {classSymbol.BuilderClassName} : Builder<{t}> {GenerateBuildMethodForIEnumerableBuilder(classSymbol)} }} }} -{(_context.SupportsNullable ? "#nullable disable" : string.Empty)}"; +{(_supportsNullable ? "#nullable disable" : string.Empty)}"; } private static StringBuilder GenerateAddMethodsForIEnumerableBuilder(ClassSymbol classSymbol) diff --git a/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.cs b/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.cs index 606b6e0..7ca9cf5 100644 --- a/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.cs +++ b/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.cs @@ -1,12 +1,11 @@ // This source code is based on https://justsimplycode.com/2020/12/06/auto-generate-builders-using-source-generator-in-net-5 -using System.Text; using FluentBuilderGenerator.Extensions; using FluentBuilderGenerator.Helpers; using FluentBuilderGenerator.Models; -using FluentBuilderGenerator.SyntaxReceiver; using FluentBuilderGenerator.Types; using FluentBuilderGenerator.Wrappers; using Microsoft.CodeAnalysis; +using System.Text; namespace FluentBuilderGenerator.FileGenerators; @@ -37,14 +36,24 @@ internal partial class FluentBuilderClassesGenerator : IFilesGenerator FileDataType.IReadOnlyCollectionBuilder, FileDataType.IReadOnlyListBuilder }; + private readonly IList _items; + private readonly CompilationHelper _compilationHelper; + private readonly bool _supportsNullable; + + //private readonly IGeneratorExecutionContextWrapper _context; + //private readonly IAutoGenerateBuilderSyntaxReceiver _receiver; - private readonly IGeneratorExecutionContextWrapper _context; - private readonly IAutoGenerateBuilderSyntaxReceiver _receiver; + //public FluentBuilderClassesGenerator(IGeneratorExecutionContextWrapper context, IAutoGenerateBuilderSyntaxReceiver receiver) + //{ + // _context = context; + // _receiver = receiver; + //} - public FluentBuilderClassesGenerator(IGeneratorExecutionContextWrapper context, IAutoGenerateBuilderSyntaxReceiver receiver) + public FluentBuilderClassesGenerator(IList items, CompilationHelper compilationHelper, bool supportsNullable) { - _context = context; - _receiver = receiver; + _items = items; + _compilationHelper = compilationHelper; + _supportsNullable = supportsNullable; } public IReadOnlyList GenerateFiles() @@ -89,38 +98,42 @@ private string CreateClassBuilderCode(FluentData fluentData, ClassSymbol classSy var propertiesCode = GenerateWithPropertyCode(fluentData, classSymbol, allClassSymbols); var usings = SystemUsings.ToList(); - usings.Add($"{_context.AssemblyName}.FluentBuilder"); + usings.Add($"{_compilationHelper.AssemblyName}.FluentBuilder"); usings.Add($"{classSymbol.NamedTypeSymbol.ContainingNamespace}"); usings.AddRange(propertiesCode.ExtraUsings); var usingsAsStrings = string.Join("\r\n", usings.Distinct().Select(u => $"using {u};")); - return - $$""" - {{Header.Text}} - - {{(_context.SupportsNullable ? "#nullable enable" : string.Empty)}} - {{usingsAsStrings}} - - namespace {{classSymbol.BuilderNamespace}} - { - public static partial class {{classSymbol.BuilderClassName.ToSafeClassName()}}Extensions - { - {{fluentData.ClassModifier}} static {{classSymbol.BuilderClassName}} AsBuilder{{classSymbol.NamedTypeSymbol.GetTypeArguments()}}(this {{classSymbol.NamedTypeSymbol}} instance){{classSymbol.NamedTypeSymbol.GetWhereStatement()}} - { - return new {{classSymbol.BuilderClassName}}().UsingInstance(instance); - } - } - - {{fluentData.ClassModifier}} partial class {{classSymbol.BuilderClassName}} : Builder<{{classSymbol.NamedTypeSymbol}}>{{classSymbol.NamedTypeSymbol.GetWhereStatement()}} - { - {{propertiesCode.StringBuilder}} - {{constructorCode.StringBuilder}} - {{GenerateSeveralMethods(fluentData, classSymbol)}} - } - } - {{(_context.SupportsNullable ? "#nullable disable" : string.Empty)}} - """; + return $@"//------------------------------------------------------------------------------ +// +// This code was generated by https://github.com/StefH/FluentBuilder version {System.Reflection.Assembly.GetExecutingAssembly().GetName().Version} +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +{(_supportsNullable ? "#nullable enable" : string.Empty)} +{usingsAsStrings} + +namespace {classSymbol.BuilderNamespace} +{{ + public static partial class {classSymbol.BuilderClassName.ToSafeClassName()}Extensions + {{ + {fluentData.ClassModifier} static {classSymbol.BuilderClassName} AsBuilder{classSymbol.NamedTypeSymbol.GetTypeArguments()}(this {classSymbol.NamedTypeSymbol} instance){classSymbol.NamedTypeSymbol.GetWhereStatement()} + {{ + return new {classSymbol.BuilderClassName}().UsingInstance(instance); + }} + }} + + {fluentData.ClassModifier} partial class {classSymbol.BuilderClassName} : Builder<{classSymbol.NamedTypeSymbol}>{classSymbol.NamedTypeSymbol.GetWhereStatement()} + {{ +{propertiesCode.StringBuilder} +{constructorCode.StringBuilder} +{GenerateSeveralMethods(fluentData, classSymbol)} + }} +}} +{(_supportsNullable ? "#nullable disable" : string.Empty)}"; } private static (StringBuilder StringBuilder, IReadOnlyList ExtraUsings) GenerateUsingConstructorCode( @@ -353,7 +366,7 @@ private StringBuilder GenerateWithIEnumerableBuilderActionMethod( else { // Normal - fullBuilderName = $"{_context.AssemblyName}.FluentBuilder.{kind}Builder{(typeSymbol == null ? string.Empty : "<" + typeSymbol.GenerateFullTypeName() + ">")}"; + fullBuilderName = $"{_compilationHelper.AssemblyName}.FluentBuilder.{kind}Builder{(typeSymbol == null ? string.Empty : "<" + typeSymbol.GenerateFullTypeName() + ">")}"; } // If the property.Type is an interface or array, no cast is needed. Else cast the interface to the real type. @@ -511,9 +524,9 @@ private static void BuildPrivateSetMethod(StringBuilder output, string className private IReadOnlyList<(ClassSymbol ClassSymbol, FluentData FluentData)> GetClassSymbols() { var classSymbols = new List<(ClassSymbol ClassSymbol, FluentData FluentData)>(); - foreach (var fluentDataItem in _receiver.CandidateFluentDataItems) + foreach (var fluentDataItem in _items) { - if (_context.TryGetNamedTypeSymbolByFullMetadataName(fluentDataItem, out var classSymbol)) + if (_compilationHelper.TryGetNamedTypeSymbolByFullMetadataName(fluentDataItem, out var classSymbol)) { classSymbols.Add((classSymbol, fluentDataItem)); } diff --git a/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs b/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs index 0153112..efebb81 100644 --- a/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs +++ b/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs @@ -1,19 +1,27 @@ // This source code is based on https://justsimplycode.com/2020/12/06/auto-generate-builders-using-source-generator-in-net-5 -using System.Text; using FluentBuilderGenerator.FileGenerators; +using FluentBuilderGenerator.Models; using FluentBuilderGenerator.SyntaxReceiver; using FluentBuilderGenerator.Types; using FluentBuilderGenerator.Wrappers; using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Text; +using System.Text; namespace FluentBuilderGenerator; -[Generator] -internal class FluentBuilderSourceGenerator : ISourceGenerator +public struct LanguageData { - public void Initialize(GeneratorInitializationContext context) + public bool SupportsNullable { get; set; } + public bool SupportsGenericAttributes { get; set; } +} + +[Generator(LanguageNames.CSharp)] +internal class FluentBuilderSourceGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) { #if DEBUGATTACH if (!System.Diagnostics.Debugger.IsAttached) @@ -21,68 +29,91 @@ public void Initialize(GeneratorInitializationContext context) System.Diagnostics.Debugger.Launch(); } #endif - context.RegisterForSyntaxNotifications(() => new AutoGenerateBuilderSyntaxReceiver()); - } - public void Execute(GeneratorExecutionContext context) - { - var contextWrapper = new GeneratorExecutionContextWrapper(context); - - try + var languageDataProvider = context.ParseOptionsProvider.Select(static (options, _) => { - InjectGeneratedClasses(contextWrapper); - - if (context.SyntaxContextReceiver is not AutoGenerateBuilderSyntaxReceiver receiver) + if (options is not CSharpParseOptions csParseOptions) { - return; + throw new NotSupportedException("Only C# is supported."); } - InjectFluentBuilderClasses(contextWrapper, receiver); - } - catch (Exception exception) - { - GenerateError(contextWrapper, exception); - } - } + return new LanguageData + { + SupportsNullable = csParseOptions.LanguageVersion >= LanguageVersion.CSharp8, + SupportsGenericAttributes = csParseOptions.LanguageVersion >= LanguageVersion.CSharp11 + }; + }); - private static void GenerateError(IGeneratorExecutionContextWrapper context, Exception exception) - { - var message = $"/*\r\n{nameof(FluentBuilderSourceGenerator)}\r\n\r\n[Exception]\r\n{exception}\r\n\r\n[StackTrace]\r\n{exception.StackTrace}*/"; - context.AddSource("Error.g.cs", SourceText.From(message, Encoding.UTF8)); - } + var compilationHelperProvider = context.CompilationProvider.Select(static (compilation, _) => new CompilationHelper(compilation)); - private static void InjectGeneratedClasses(IGeneratorExecutionContextWrapper context) - { - var generators = new IFileGenerator[] + var commonProvider = languageDataProvider.Combine(compilationHelperProvider); + + context.RegisterSourceOutput(commonProvider, static (SourceProductionContext spc, (LanguageData LanguageData, CompilationHelper CompilationHelper) x) => { - new BaseBuilderGenerator(context.AssemblyName, context.SupportsNullable), + var assemblyName = x.CompilationHelper.AssemblyName; + var supportsNullable = x.LanguageData.SupportsNullable; - new ExtraFilesGenerator(context), + var generators = new IFileGenerator[] + { + new BaseBuilderGenerator(assemblyName, x.LanguageData.SupportsNullable), - new IDictionaryBuilderGenerator(context.AssemblyName, context.SupportsNullable), + new ExtraFilesGenerator(supportsNullable, x.LanguageData.SupportsGenericAttributes), - new IEnumerableBuilderGenerator(context.AssemblyName, FileDataType.ArrayBuilder, context.SupportsNullable), - new IEnumerableBuilderGenerator(context.AssemblyName, FileDataType.ICollectionBuilder, context.SupportsNullable), - new IEnumerableBuilderGenerator(context.AssemblyName, FileDataType.IEnumerableBuilder, context.SupportsNullable), - new IEnumerableBuilderGenerator(context.AssemblyName, FileDataType.IListBuilder, context.SupportsNullable), - new IEnumerableBuilderGenerator(context.AssemblyName, FileDataType.IReadOnlyCollectionBuilder, context.SupportsNullable), - new IEnumerableBuilderGenerator(context.AssemblyName, FileDataType.IReadOnlyListBuilder, context.SupportsNullable), - }; + new IDictionaryBuilderGenerator(assemblyName, supportsNullable), + + new IEnumerableBuilderGenerator(assemblyName, FileDataType.ArrayBuilder, supportsNullable), + new IEnumerableBuilderGenerator(assemblyName, FileDataType.ICollectionBuilder, supportsNullable), + new IEnumerableBuilderGenerator(assemblyName, FileDataType.IEnumerableBuilder, supportsNullable), + new IEnumerableBuilderGenerator(assemblyName, FileDataType.IListBuilder, supportsNullable), + new IEnumerableBuilderGenerator(assemblyName, FileDataType.IReadOnlyCollectionBuilder, supportsNullable), + new IEnumerableBuilderGenerator(assemblyName, FileDataType.IReadOnlyListBuilder, supportsNullable), + }; - foreach (var generator in generators) + foreach (var generator in generators) + { + var fileData = generator.GenerateFile(); + spc.AddSource(fileData.FileName, SourceText.From(fileData.Text, Encoding.UTF8)); + } + }); + + var fluentBuilderClassesProvider = context.SyntaxProvider + .CreateSyntaxProvider(ShouldHandle, Transform) + .Collect(); + + var combined2 = fluentBuilderClassesProvider.Combine(commonProvider).Select((x, _) => new { - var data = generator.GenerateFile(); - context.AddSource(data.FileName, SourceText.From(data.Text, Encoding.UTF8)); - } + Items = x.Left, + LanguageData = x.Right.Left, + CompilationHelper = x.Right.Right + }); + + context.RegisterSourceOutput(combined2, static (spc, data) => + { + var generator = new FluentBuilderClassesGenerator(data.Items, data.CompilationHelper, data.LanguageData.SupportsNullable); + + try + { + foreach (var fileData in generator.GenerateFiles()) + { + spc.AddSource(fileData.FileName, SourceText.From(fileData.Text, Encoding.UTF8)); + } + } + catch (Exception exception) + { + var message = $"/*\r\n{nameof(FluentBuilderSourceGenerator)}\r\n\r\n[Exception]\r\n{exception}\r\n\r\n[StackTrace]\r\n{exception.StackTrace}*/"; + spc.AddSource("Error.g.cs", SourceText.From(message, Encoding.UTF8)); + } + }); } - private static void InjectFluentBuilderClasses(IGeneratorExecutionContextWrapper context, IAutoGenerateBuilderSyntaxReceiver receiver) + + private static bool ShouldHandle(SyntaxNode syntaxNode, CancellationToken cancellationToken) { - var generator = new FluentBuilderClassesGenerator(context, receiver); + return AutoGenerateBuilderSyntaxReceiver.CheckSyntaxNode(syntaxNode); + } - foreach (var data in generator.GenerateFiles()) - { - context.AddSource(data.FileName, SourceText.From(data.Text, Encoding.UTF8)); - } + private static FluentData Transform(GeneratorSyntaxContext gsc, CancellationToken cancellationToken) + { + return AutoGenerateBuilderSyntaxReceiver.HandleSyntaxNode(gsc.Node, gsc.SemanticModel); } } \ No newline at end of file diff --git a/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs b/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs index 1426436..e246c9b 100644 --- a/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs +++ b/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs @@ -9,28 +9,18 @@ namespace FluentBuilderGenerator.SyntaxReceiver; -internal class AutoGenerateBuilderSyntaxReceiver : IAutoGenerateBuilderSyntaxReceiver +internal class AutoGenerateBuilderSyntaxReceiver { private const string ModifierPartial = "partial"; private const string ModifierPublic = "public"; private const string ModifierInternal = "internal"; - public IList CandidateFluentDataItems { get; } = new List(); - - public void OnVisitSyntaxNode(GeneratorSyntaxContext context) + public static bool CheckSyntaxNode(SyntaxNode syntaxNode) { - var syntaxNode = context.Node; - var semanticModel = context.SemanticModel; - - if (syntaxNode is ClassDeclarationSyntax classDeclarationSyntax && TryGet(classDeclarationSyntax, semanticModel, out var data)) + if (syntaxNode is not ClassDeclarationSyntax classDeclarationSyntax) { - CandidateFluentDataItems.Add(data); + return false; } - } - - private static bool TryGet(ClassDeclarationSyntax classDeclarationSyntax, SemanticModel semanticModel, out FluentData data) - { - data = default; var attributeList = classDeclarationSyntax.AttributeLists .FirstOrDefault(x => x.Attributes.Any(AttributeArgumentListParser.IsMatch)); @@ -40,12 +30,37 @@ private static bool TryGet(ClassDeclarationSyntax classDeclarationSyntax, Semant return false; } - if (!TryGetClassModifier(classDeclarationSyntax, out var classModifier)) + if (!TryGetClassModifier(classDeclarationSyntax, out _)) { Console.WriteLine("Class modifier should be 'public' or 'internal'."); return false; } + return true; + } + + public static FluentData HandleSyntaxNode(SyntaxNode syntaxNode, SemanticModel semanticModel) + { + if (TryGet((ClassDeclarationSyntax) syntaxNode, semanticModel, out var data)) + { + return data; + } + + throw new InvalidOperationException(); + } + + private static bool TryGet(ClassDeclarationSyntax classDeclarationSyntax, SemanticModel semanticModel, out FluentData data) + { + data = default; + + var attributeList = classDeclarationSyntax.AttributeLists + .FirstOrDefault(x => x.Attributes.Any(AttributeArgumentListParser.IsMatch))!; + + if (!TryGetClassModifier(classDeclarationSyntax, out var classModifier)) + { + return false; + } + var usings = new List(); var ns = classDeclarationSyntax.GetNamespace(); diff --git a/src/FluentBuilderGenerator/SyntaxReceiver/IAutoGenerateBuilderSyntaxReceiver.cs b/src/FluentBuilderGenerator/SyntaxReceiver/IAutoGenerateBuilderSyntaxReceiver.cs deleted file mode 100644 index 732493b..0000000 --- a/src/FluentBuilderGenerator/SyntaxReceiver/IAutoGenerateBuilderSyntaxReceiver.cs +++ /dev/null @@ -1,9 +0,0 @@ -using FluentBuilderGenerator.Models; -using Microsoft.CodeAnalysis; - -namespace FluentBuilderGenerator.SyntaxReceiver; - -internal interface IAutoGenerateBuilderSyntaxReceiver : ISyntaxContextReceiver -{ - public IList CandidateFluentDataItems { get; } -} \ No newline at end of file diff --git a/src/FluentBuilderGenerator/Wrappers/GeneratorExecutionContextWrapper.cs b/src/FluentBuilderGenerator/Wrappers/CompilationHelper.cs similarity index 52% rename from src/FluentBuilderGenerator/Wrappers/GeneratorExecutionContextWrapper.cs rename to src/FluentBuilderGenerator/Wrappers/CompilationHelper.cs index b3a93ee..29f80b4 100644 --- a/src/FluentBuilderGenerator/Wrappers/GeneratorExecutionContextWrapper.cs +++ b/src/FluentBuilderGenerator/Wrappers/CompilationHelper.cs @@ -1,79 +1,52 @@ -using System.Diagnostics.CodeAnalysis; -using FluentBuilderGenerator.Models; -using FluentBuilderGenerator.Types; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.Text; - -namespace FluentBuilderGenerator.Wrappers; - -internal class GeneratorExecutionContextWrapper : IGeneratorExecutionContextWrapper -{ - private readonly GeneratorExecutionContext _context; - - public GeneratorExecutionContextWrapper(GeneratorExecutionContext context) - { - _context = context; - - if (context.ParseOptions is not CSharpParseOptions csharpParseOptions) - { - throw new NotSupportedException("Only C# is supported."); - } - - // https://github.com/reactiveui/refit/blob/main/InterfaceStubGenerator.Core/InterfaceStubGenerator.cs - SupportsNullable = csharpParseOptions.LanguageVersion >= LanguageVersion.CSharp8; - SupportsGenericAttributes = csharpParseOptions.LanguageVersion >= LanguageVersion.CSharp11; - NullableEnabled = context.Compilation.Options.NullableContextOptions == NullableContextOptions.Enable; - } - - public string AssemblyName => _context.Compilation.AssemblyName ?? "FluentBuilder"; - - public bool SupportsNullable { get; } - - public bool NullableEnabled { get; } - - public bool SupportsGenericAttributes { get; } - - public void AddSource(string hintName, SourceText sourceText) => _context.AddSource(hintName, sourceText); - - public bool TryGetNamedTypeSymbolByFullMetadataName(FluentData fluentDataItem, [NotNullWhen(true)] out ClassSymbol? classSymbol) - { - classSymbol = null; - - // The GetTypeByMetadataName method returns null if no type matches the full name or if 2 or more types (in different assemblies) match the full name. - var symbol = _context.Compilation.GetTypeByMetadataName(fluentDataItem.MetadataName); - if (symbol is not null) - { - classSymbol = new ClassSymbol - { - Type = FileDataType.Builder, - FluentData = fluentDataItem, - //BuilderNamespace = fluentDataItem.Namespace, - //BuilderClassName = fluentDataItem.ShortBuilderClassName, - //FullBuilderClassName = fluentDataItem.FullBuilderClassName, - NamedTypeSymbol = symbol - }; - return true; - } - - foreach (var @using in fluentDataItem.Usings) - { - symbol = _context.Compilation.GetTypeByMetadataName($"{@using}.{fluentDataItem.MetadataName}"); - if (symbol is not null) - { - classSymbol = new ClassSymbol - { - Type = FileDataType.Builder, - FluentData = fluentDataItem, - //BuilderNamespace = fluentDataItem.Namespace, - //BuilderClassName = fluentDataItem.ShortBuilderClassName, - //FullBuilderClassName = fluentDataItem.FullBuilderClassName, - NamedTypeSymbol = symbol - }; - return true; - } - } - - return false; - } +using System.Diagnostics.CodeAnalysis; +using FluentBuilderGenerator.Models; +using FluentBuilderGenerator.Types; +using Microsoft.CodeAnalysis; + +namespace FluentBuilderGenerator.Wrappers; + +internal class CompilationHelper(Compilation compilation) +{ + public string AssemblyName { get; } = compilation.AssemblyName ?? "FluentBuilder"; + + public bool TryGetNamedTypeSymbolByFullMetadataName(FluentData fluentDataItem, [NotNullWhen(true)] out ClassSymbol? classSymbol) + { + classSymbol = null; + + // The GetTypeByMetadataName method returns null if no type matches the full name or if 2 or more types (in different assemblies) match the full name. + var symbol = compilation.GetTypeByMetadataName(fluentDataItem.MetadataName); + if (symbol is not null) + { + classSymbol = new ClassSymbol + { + Type = FileDataType.Builder, + FluentData = fluentDataItem, + //BuilderNamespace = fluentDataItem.Namespace, + //BuilderClassName = fluentDataItem.ShortBuilderClassName, + //FullBuilderClassName = fluentDataItem.FullBuilderClassName, + NamedTypeSymbol = symbol + }; + return true; + } + + foreach (var @using in fluentDataItem.Usings) + { + symbol = compilation.GetTypeByMetadataName($"{@using}.{fluentDataItem.MetadataName}"); + if (symbol is not null) + { + classSymbol = new ClassSymbol + { + Type = FileDataType.Builder, + FluentData = fluentDataItem, + //BuilderNamespace = fluentDataItem.Namespace, + //BuilderClassName = fluentDataItem.ShortBuilderClassName, + //FullBuilderClassName = fluentDataItem.FullBuilderClassName, + NamedTypeSymbol = symbol + }; + return true; + } + } + + return false; + } } \ No newline at end of file diff --git a/src/FluentBuilderGenerator/Wrappers/IGeneratorExecutionContextWrapper.cs b/src/FluentBuilderGenerator/Wrappers/IGeneratorExecutionContextWrapper.cs deleted file mode 100644 index ddf82e7..0000000 --- a/src/FluentBuilderGenerator/Wrappers/IGeneratorExecutionContextWrapper.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using FluentBuilderGenerator.Models; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Text; - -namespace FluentBuilderGenerator.Wrappers; - -internal interface IGeneratorExecutionContextWrapper -{ - /// - public string AssemblyName { get; } - - public bool SupportsNullable { get; } - - public bool NullableEnabled { get; } - - public bool SupportsGenericAttributes { get; } - - /// - public void AddSource(string hintName, SourceText sourceText); - - bool TryGetNamedTypeSymbolByFullMetadataName(FluentData fluentDataItem, [NotNullWhen(true)] out ClassSymbol? classSymbol); -} \ No newline at end of file From 79bfe6b46fa3c9bafa2cf321b61825e7ce1f3cc1 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Fri, 8 Nov 2024 08:57:53 +0100 Subject: [PATCH 02/24] . --- .../FluentBuilderSourceGenerator.cs | 11 ++--------- src/FluentBuilderGenerator/Models/LanguageData.cs | 7 +++++++ 2 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 src/FluentBuilderGenerator/Models/LanguageData.cs diff --git a/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs b/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs index efebb81..56bcaa6 100644 --- a/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs +++ b/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs @@ -12,12 +12,6 @@ namespace FluentBuilderGenerator; -public struct LanguageData -{ - public bool SupportsNullable { get; set; } - public bool SupportsGenericAttributes { get; set; } -} - [Generator(LanguageNames.CSharp)] internal class FluentBuilderSourceGenerator : IIncrementalGenerator { @@ -34,7 +28,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { if (options is not CSharpParseOptions csParseOptions) { - throw new NotSupportedException("Only C# is supported."); + throw new NotSupportedException($"Only {LanguageNames.CSharp} is supported."); } return new LanguageData @@ -60,7 +54,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) new ExtraFilesGenerator(supportsNullable, x.LanguageData.SupportsGenericAttributes), new IDictionaryBuilderGenerator(assemblyName, supportsNullable), - + new IEnumerableBuilderGenerator(assemblyName, FileDataType.ArrayBuilder, supportsNullable), new IEnumerableBuilderGenerator(assemblyName, FileDataType.ICollectionBuilder, supportsNullable), new IEnumerableBuilderGenerator(assemblyName, FileDataType.IEnumerableBuilder, supportsNullable), @@ -106,7 +100,6 @@ public void Initialize(IncrementalGeneratorInitializationContext context) }); } - private static bool ShouldHandle(SyntaxNode syntaxNode, CancellationToken cancellationToken) { return AutoGenerateBuilderSyntaxReceiver.CheckSyntaxNode(syntaxNode); diff --git a/src/FluentBuilderGenerator/Models/LanguageData.cs b/src/FluentBuilderGenerator/Models/LanguageData.cs new file mode 100644 index 0000000..9733bf1 --- /dev/null +++ b/src/FluentBuilderGenerator/Models/LanguageData.cs @@ -0,0 +1,7 @@ +namespace FluentBuilderGenerator.Models; + +internal struct LanguageData +{ + public bool SupportsNullable { get; set; } + public bool SupportsGenericAttributes { get; set; } +} \ No newline at end of file From 8e855a339055a67962c54c27deaf2441f3551bf7 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Fri, 8 Nov 2024 15:24:52 +0100 Subject: [PATCH 03/24] . --- .../CSharp.SourceGenerators.Extensions.csproj | 2 +- .../SourceGeneratorExtensions.cs | 69 +++++++- .../DTO/FluentBuilder.Extra.g.cs | 2 +- .../FluentBuilderClassesGeneratorTests.cs | 161 ------------------ ...uctor_Should_Create_ErrorFile.verified.txt | 18 +- 5 files changed, 75 insertions(+), 177 deletions(-) delete mode 100644 tests/FluentBuilderGeneratorTests/FileGenerator/FluentBuilderClassesGeneratorTests.cs diff --git a/src-extensions/CSharp.SourceGenerators.Extensions/CSharp.SourceGenerators.Extensions.csproj b/src-extensions/CSharp.SourceGenerators.Extensions/CSharp.SourceGenerators.Extensions.csproj index 8e7c9f5..9686e74 100644 --- a/src-extensions/CSharp.SourceGenerators.Extensions/CSharp.SourceGenerators.Extensions.csproj +++ b/src-extensions/CSharp.SourceGenerators.Extensions/CSharp.SourceGenerators.Extensions.csproj @@ -1,7 +1,7 @@ - 0.0.12 + 0.0.13 netstandard2.1 latest enable diff --git a/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs b/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs index 6d1802e..e86c7a1 100644 --- a/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs +++ b/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs @@ -29,7 +29,23 @@ public static ExecuteResult Execute( IReadOnlyList? additionalTextPaths = null ) { - return Execute(sourceGenerator, $"GeneratedNamespace_{Guid.NewGuid().ToString().Replace("-", "")}", sources, additionalTextPaths); + return ExecuteInternal(sourceGenerator, GetRandomAssemblyName(), sources, additionalTextPaths); + } + + /// + /// Executes and runs the specified . + /// + /// The SourceGenerator to execute. + /// Provide a list of sources which need to be analyzed and processed. + /// A list of additional files. + /// + public static ExecuteResult Execute( + this IIncrementalGenerator sourceGenerator, + IReadOnlyList sources, + IReadOnlyList? additionalTextPaths = null + ) + { + return ExecuteInternal(sourceGenerator, GetRandomAssemblyName(), sources, additionalTextPaths); } /// @@ -47,6 +63,48 @@ public static ExecuteResult Execute( IReadOnlyList? additionalTextPaths = null ) { + return ExecuteInternal(sourceGenerator, assemblyName, sources, additionalTextPaths); + } + + /// + /// Executes and runs the specified . + /// + /// The SourceGenerator to execute. + /// The assembly name. + /// Provide a list of sources which need to be analyzed and processed. + /// A list of additional files. + /// + public static ExecuteResult Execute( + this IIncrementalGenerator sourceGenerator, + string assemblyName, + IReadOnlyList sources, + IReadOnlyList? additionalTextPaths = null + ) + { + return ExecuteInternal(sourceGenerator, assemblyName, sources, additionalTextPaths); + } + + private static ExecuteResult ExecuteInternal( + object generator, + string assemblyName, + IReadOnlyList sources, + IReadOnlyList? additionalTextPaths = null + ) + { + GeneratorDriver driver; + if (generator is IIncrementalGenerator incrementalGenerator) + { + driver = CSharpGeneratorDriver.Create(incrementalGenerator); + } + else if (generator is ISourceGenerator sourceGenerator) + { + driver = CSharpGeneratorDriver.Create(sourceGenerator); + } + else + { + throw new NotSupportedException(); + } + var metadataReferences = AppDomain.CurrentDomain.GetAssemblies() .Where(a => !a.IsDynamic) .Select(a => MetadataReference.CreateFromFile(a.Location)); @@ -61,9 +119,7 @@ public static ExecuteResult Execute( metadataReferences, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); - var driver = CSharpGeneratorDriver - .Create(sourceGenerator) - .AddAdditionalTexts(ImmutableArray.CreateRange(additionalTexts)); + driver = driver.AddAdditionalTexts(ImmutableArray.CreateRange(additionalTexts)); var executedDriver = driver.RunGeneratorsAndUpdateCompilation( compilation, @@ -167,4 +223,9 @@ private static bool TryParseArguments(AnyOf attributeToA attributeArgumentListSyntax = null; return false; } + + private static string GetRandomAssemblyName() + { + return $"CSharp.SourceGenerators.Extensions.Generated_{Guid.NewGuid().ToString().Replace("-", "")}"; + } } \ No newline at end of file diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.Extra.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.Extra.g.cs index 3770846..1298b4b 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.Extra.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.Extra.g.cs @@ -129,4 +129,4 @@ internal enum FluentBuilderMethods WithAndWithout = 1 } } -#nullable restore \ No newline at end of file +#nullable disable \ No newline at end of file diff --git a/tests/FluentBuilderGeneratorTests/FileGenerator/FluentBuilderClassesGeneratorTests.cs b/tests/FluentBuilderGeneratorTests/FileGenerator/FluentBuilderClassesGeneratorTests.cs deleted file mode 100644 index e9171c7..0000000 --- a/tests/FluentBuilderGeneratorTests/FileGenerator/FluentBuilderClassesGeneratorTests.cs +++ /dev/null @@ -1,161 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.IO; -using System.Linq; -using FluentAssertions; -using FluentBuilderGenerator.FileGenerators; -using FluentBuilderGenerator.Models; -using FluentBuilderGenerator.SyntaxReceiver; -using FluentBuilderGenerator.Types; -using FluentBuilderGenerator.Wrappers; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using Moq; -using Xunit; - -namespace FluentBuilderGeneratorTests.FileGenerator; - -public class FluentBuilderClassesGeneratorTests -{ - private const bool Write = true; - - private readonly Mock _contextMock; - private readonly Mock _syntaxReceiverMock; - - private readonly FluentBuilderClassesGenerator _sut; - - public FluentBuilderClassesGeneratorTests() - { - _contextMock = new Mock(); - _contextMock.SetupGet(c => c.AssemblyName).Returns("FluentBuilderGeneratorTests"); - _contextMock.SetupGet(c => c.SupportsNullable).Returns(true); - _contextMock.SetupGet(c => c.NullableEnabled).Returns(true); - - _syntaxReceiverMock = new Mock(); - - _sut = new FluentBuilderClassesGenerator(_contextMock.Object, _syntaxReceiverMock.Object); - } - - [Fact] - public void GenerateFiles_WhenNoClassesFoundByReceiver_Should_NotGenerateFiles() - { - // Arrange - _syntaxReceiverMock.SetupGet(r => r.CandidateFluentDataItems).Returns(new List()); - - // Act - var result = _sut.GenerateFiles(); - - // Assert - result.Should().BeEmpty(); - - // Verify - _syntaxReceiverMock.Verify(r => r.CandidateFluentDataItems, Times.Once()); - _syntaxReceiverMock.VerifyNoOtherCalls(); - - _contextMock.VerifyNoOtherCalls(); - } - - [Fact(Skip = "needs fix")] - public void GenerateFiles_WhenOneClassIsFoundByReceiver_Should_GenerateOneFile() - { - // Arrange : SyntaxReceiverMock - var syntaxTree = CSharpSyntaxTree.ParseText(File.ReadAllText("./DTO/User.cs")); - var root = syntaxTree.GetRoot(); - var @namespace = root.ChildNodes().OfType().Single(); - var @class = @namespace.ChildNodes().OfType().Single(); - var properties = @class.ChildNodes().OfType().ToList(); - - var fluentData = new FluentData - { - BuilderType = BuilderType.Generated, - Namespace = "FluentBuilderGeneratorTests.DTO", - ShortBuilderClassName = "UserBuilder", - FullBuilderClassName = "FluentBuilderGeneratorTests.DTO.UserBuilder", - FullRawTypeName = "FluentBuilderGeneratorTests.DTO.User", - ShortTypeName = "User", - MetadataName = "FluentBuilderGeneratorTests.DTO.User", - Usings = new List() - }; - _syntaxReceiverMock.SetupGet(r => r.CandidateFluentDataItems).Returns(new[] { fluentData }); - - // Arrange : ContextMock - var namespaceSymbolMock = new Mock(); - namespaceSymbolMock.Setup(n => n.ToString()).Returns(@namespace.Name.ToString()); - - var namedTypeSymbolMock = new Mock(); - namedTypeSymbolMock.SetupGet(n => n.Name).Returns("User"); - namedTypeSymbolMock.SetupGet(n => n.TypeArguments).Returns(ImmutableArray.Create()); - - var membersMock = properties.Select(p => - { - var setMethodMock = new Mock(); - - var typeSymbol = new Mock(); - typeSymbol.SetupGet(t => t.Name).Returns(p.Type.ToString()); - typeSymbol.Setup(t => t.ToString()).Returns(p.Type.ToString()); - typeSymbol.SetupGet(ts => ts.AllInterfaces).Returns(ImmutableArray.Create()); - - var propertySymbolMock = new Mock(); - propertySymbolMock.SetupGet(pt => pt.CanBeReferencedByName).Returns(true); - propertySymbolMock.SetupGet(pt => pt.Name).Returns(p.Identifier.ValueText); - propertySymbolMock.SetupGet(pt => pt.SetMethod).Returns(setMethodMock.Object); - propertySymbolMock.SetupGet(pt => pt.Type).Returns(typeSymbol.Object); - - return propertySymbolMock; - }) - .Select(p => (ISymbol)p.Object) - .ToImmutableArray(); - - var originalDefinitionMock = new Mock(); - originalDefinitionMock.Setup(o => o.ToString()).Returns("FluentBuilderGeneratorTests.DTO.User"); - - var classSymbolMock = new Mock(); - classSymbolMock.SetupGet(n => n.ContainingNamespace).Returns(namespaceSymbolMock.Object); - classSymbolMock.SetupGet(n => n.Name).Returns("User"); - classSymbolMock.SetupGet(n => n.OriginalDefinition).Returns(originalDefinitionMock.Object); - classSymbolMock.Setup(n => n.GetMembers()).Returns(membersMock); - classSymbolMock.SetupGet(n => n.TypeArguments).Returns(ImmutableArray.Create()); - - var classSymbolConstructorMock = new Mock(); - classSymbolConstructorMock.SetupGet(c => c.DeclaredAccessibility).Returns(Accessibility.Public); - classSymbolConstructorMock.SetupGet(c => c.Parameters).Returns(ImmutableArray.Empty); - classSymbolMock.SetupGet(n => n.Constructors).Returns(ImmutableArray.Create(new[] { classSymbolConstructorMock.Object })); - - var classSymbol = new ClassSymbol - { - Type = FileDataType.Builder, - FluentData = fluentData, - //BuilderNamespace = fluentData.Namespace, - //BuilderClassName = fluentData.ShortBuilderClassName, - //FullBuilderClassName = fluentData.FullBuilderClassName, - NamedTypeSymbol = classSymbolMock.Object - }; - _contextMock.Setup(c => c.TryGetNamedTypeSymbolByFullMetadataName(It.IsAny(), out classSymbol)).Returns(true); - - // Act - var result = _sut.GenerateFiles().ToList(); - - // Assert - result.Should().HaveCount(1); - result[0].FileName.Should().Be("FluentBuilderGeneratorTests.DTO.UserBuilder.g.cs"); - - var generated = result[0].Text; - generated.Should().NotBeEmpty(); - - if (Write) File.WriteAllText("../../../DTO/FluentBuilderGeneratorTests.DTO.UserBuilder.g.cs", generated); - - var generatedCode = CSharpSyntaxTree.ParseText(generated); - var expectedCode = CSharpSyntaxTree.ParseText(File.ReadAllText("../../../DTO/FluentBuilderGeneratorTests.DTO.UserBuilder.g.cs")); - generatedCode.Should().BeEquivalentTo(expectedCode); - - // Verify - _syntaxReceiverMock.Verify(r => r.CandidateFluentDataItems, Times.Once()); - _syntaxReceiverMock.VerifyNoOtherCalls(); - - _contextMock.Verify(c => c.TryGetNamedTypeSymbolByFullMetadataName(It.IsAny(), out It.Ref.IsAny), Times.Once()); - _contextMock.Verify(c => c.AssemblyName, Times.Once()); - _contextMock.Verify(c => c.SupportsNullable, Times.AtLeast(1)); - _contextMock.VerifyNoOtherCalls(); - } -} \ No newline at end of file diff --git a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile.verified.txt b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile.verified.txt index 31d9337..b06740e 100644 --- a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile.verified.txt +++ b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile.verified.txt @@ -6,24 +6,22 @@ FluentBuilderSourceGenerator [Exception] System.NotSupportedException: Unable to generate a FluentBuilder for the class 'System.AppDomain' because no public constructor is defined. - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.CreateClassBuilderCode(FluentData fluentData, ClassSymbol classSymbol, List`1 allClassSymbols) in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 84 - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.<>c__DisplayClass6_0.b__1(ValueTuple`2 classSymbol) in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 55 + at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.CreateClassBuilderCode(FluentData fluentData, ClassSymbol classSymbol, List`1 allClassSymbols) in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 93 + at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.<>c__DisplayClass7_0.b__1(ValueTuple`2 classSymbol) in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 64 at System.Linq.Enumerable.SelectListIterator`2.MoveNext() at System.Collections.Generic.HashSet`1.UnionWith(IEnumerable`1 other) at System.Linq.Enumerable.UnionIterator`1.FillSet() at System.Linq.Enumerable.UnionIterator`1.ToList() - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.GenerateFiles() in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 73 - at FluentBuilderGenerator.FluentBuilderSourceGenerator.InjectFluentBuilderClasses(IGeneratorExecutionContextWrapper context, IAutoGenerateBuilderSyntaxReceiver receiver) in {SolutionDirectory}src\FluentBuilderGenerator\FluentBuilderSourceGenerator.cs:line 83 - at FluentBuilderGenerator.FluentBuilderSourceGenerator.Execute(GeneratorExecutionContext context) in {SolutionDirectory}src\FluentBuilderGenerator\FluentBuilderSourceGenerator.cs:line 40 + at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.GenerateFiles() in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 82 + at FluentBuilderGenerator.FluentBuilderSourceGenerator.<>c.b__0_4(SourceProductionContext spc, <>f__AnonymousType1`3 data) in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FluentBuilderSourceGenerator.cs:line 90 [StackTrace] - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.CreateClassBuilderCode(FluentData fluentData, ClassSymbol classSymbol, List`1 allClassSymbols) in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 84 - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.<>c__DisplayClass6_0.b__1(ValueTuple`2 classSymbol) in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 55 + at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.CreateClassBuilderCode(FluentData fluentData, ClassSymbol classSymbol, List`1 allClassSymbols) in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 93 + at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.<>c__DisplayClass7_0.b__1(ValueTuple`2 classSymbol) in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 64 at System.Linq.Enumerable.SelectListIterator`2.MoveNext() at System.Collections.Generic.HashSet`1.UnionWith(IEnumerable`1 other) at System.Linq.Enumerable.UnionIterator`1.FillSet() at System.Linq.Enumerable.UnionIterator`1.ToList() - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.GenerateFiles() in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 73 - at FluentBuilderGenerator.FluentBuilderSourceGenerator.InjectFluentBuilderClasses(IGeneratorExecutionContextWrapper context, IAutoGenerateBuilderSyntaxReceiver receiver) in {SolutionDirectory}src\FluentBuilderGenerator\FluentBuilderSourceGenerator.cs:line 83 - at FluentBuilderGenerator.FluentBuilderSourceGenerator.Execute(GeneratorExecutionContext context) in {SolutionDirectory}src\FluentBuilderGenerator\FluentBuilderSourceGenerator.cs:line 40*/ + at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.GenerateFiles() in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 82 + at FluentBuilderGenerator.FluentBuilderSourceGenerator.<>c.b__0_4(SourceProductionContext spc, <>f__AnonymousType1`3 data) in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FluentBuilderSourceGenerator.cs:line 90*/ } \ No newline at end of file From f956e5ca929c57ed7fb6720e81a99e8af62282a2 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 15 Apr 2025 14:13:00 +0200 Subject: [PATCH 04/24] . --- .../BuilderConsumerNET45_viaNuGet.csproj | 4 ++-- .../FluentBuilderClassesGenerator.cs | 17 ++++------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src-examples/BuilderConsumerNET45/BuilderConsumerNET45_viaNuGet.csproj b/src-examples/BuilderConsumerNET45/BuilderConsumerNET45_viaNuGet.csproj index 1c9b54f..a908642 100644 --- a/src-examples/BuilderConsumerNET45/BuilderConsumerNET45_viaNuGet.csproj +++ b/src-examples/BuilderConsumerNET45/BuilderConsumerNET45_viaNuGet.csproj @@ -6,11 +6,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.cs b/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.cs index 7ca9cf5..c528f61 100644 --- a/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.cs +++ b/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.cs @@ -12,20 +12,20 @@ namespace FluentBuilderGenerator.FileGenerators; internal partial class FluentBuilderClassesGenerator : IFilesGenerator { private static readonly string[] FluentBuilderIgnoreAttributeClassNames = - { + [ "FluentBuilder.FluentBuilderIgnoreAttribute", "FluentBuilderIgnoreAttribute", "FluentBuilder.FluentBuilderIgnore", "FluentBuilderIgnore" - }; + ]; private static readonly string[] SystemUsings = - { + [ "System", "System.Collections", "System.Collections.Generic", "System.Reflection" - }; + ]; private static readonly FileDataType[] ExtraBuilders = { @@ -40,15 +40,6 @@ internal partial class FluentBuilderClassesGenerator : IFilesGenerator private readonly CompilationHelper _compilationHelper; private readonly bool _supportsNullable; - //private readonly IGeneratorExecutionContextWrapper _context; - //private readonly IAutoGenerateBuilderSyntaxReceiver _receiver; - - //public FluentBuilderClassesGenerator(IGeneratorExecutionContextWrapper context, IAutoGenerateBuilderSyntaxReceiver receiver) - //{ - // _context = context; - // _receiver = receiver; - //} - public FluentBuilderClassesGenerator(IList items, CompilationHelper compilationHelper, bool supportsNullable) { _items = items; From a3ce1747fc3ce96819919e16d0f2a895f893f0e9 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 18 Jun 2025 10:23:35 +0200 Subject: [PATCH 05/24] test --- src/FluentBuilderGenerator/FluentBuilderGenerator.csproj | 4 +++- .../SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj b/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj index 1e7f57a..dbb72e8 100644 --- a/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj +++ b/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj @@ -1,4 +1,4 @@ - + 0.10.0.1 @@ -28,6 +28,8 @@ true enable Debug;Release;DebugAttach + + diff --git a/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs b/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs index e246c9b..b504fa5 100644 --- a/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs +++ b/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs @@ -9,7 +9,7 @@ namespace FluentBuilderGenerator.SyntaxReceiver; -internal class AutoGenerateBuilderSyntaxReceiver +internal static class AutoGenerateBuilderSyntaxReceiver { private const string ModifierPartial = "partial"; private const string ModifierPublic = "public"; From 6008eb735afce625d74eb1f260d94c45ac21de1e Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 18 Jun 2025 12:42:02 +0200 Subject: [PATCH 06/24] , --- FluentBuilder Solution.sln.DotSettings | 2 + .../Compatibility/RequiredMemberAttribute.cs | 13 ++++++ .../Models/ExecuteResult.cs | 17 ++++--- .../SourceGeneratorExtensions.cs | 5 ++- .../Constants/DiagnosticDescriptors.cs | 25 +++++++++++ .../Extensions/ExceptionExtensions.cs | 12 +++++ .../FluentBuilderGenerator.csproj | 2 +- .../FluentBuilderSourceGenerator.cs | 45 ++++++++++++++----- .../AutoGenerateBuilderSyntaxReceiver.cs | 20 ++++++--- ...uctor_Should_Create_ErrorFile.verified.txt | 16 +++---- .../FluentBuilderSourceGeneratorTests.cs | 3 +- 11 files changed, 124 insertions(+), 36 deletions(-) create mode 100644 src-extensions/CSharp.SourceGenerators.Extensions/Compatibility/RequiredMemberAttribute.cs create mode 100644 src/FluentBuilderGenerator/Constants/DiagnosticDescriptors.cs create mode 100644 src/FluentBuilderGenerator/Extensions/ExceptionExtensions.cs diff --git a/FluentBuilder Solution.sln.DotSettings b/FluentBuilder Solution.sln.DotSettings index d84748d..d197dba 100644 --- a/FluentBuilder Solution.sln.DotSettings +++ b/FluentBuilder Solution.sln.DotSettings @@ -1,3 +1,5 @@  True + True + True True \ No newline at end of file diff --git a/src-extensions/CSharp.SourceGenerators.Extensions/Compatibility/RequiredMemberAttribute.cs b/src-extensions/CSharp.SourceGenerators.Extensions/Compatibility/RequiredMemberAttribute.cs new file mode 100644 index 0000000..67c9a7b --- /dev/null +++ b/src-extensions/CSharp.SourceGenerators.Extensions/Compatibility/RequiredMemberAttribute.cs @@ -0,0 +1,13 @@ +// ReSharper disable once CheckNamespace +namespace System.Runtime.CompilerServices; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] +internal sealed class RequiredMemberAttribute : Attribute; + +[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)] +internal sealed class CompilerFeatureRequiredAttribute(string featureName) : Attribute +{ + public string FeatureName { get; } = featureName; + + public bool IsOptional { get; init; } +} \ No newline at end of file diff --git a/src-extensions/CSharp.SourceGenerators.Extensions/Models/ExecuteResult.cs b/src-extensions/CSharp.SourceGenerators.Extensions/Models/ExecuteResult.cs index 20e1617..1994d77 100644 --- a/src-extensions/CSharp.SourceGenerators.Extensions/Models/ExecuteResult.cs +++ b/src-extensions/CSharp.SourceGenerators.Extensions/Models/ExecuteResult.cs @@ -8,22 +8,27 @@ public class ExecuteResult /// /// The internally used GeneratorDriver is also returned here to support using https://github.com/VerifyTests/Verify.SourceGenerators. /// - public GeneratorDriver GeneratorDriver { get; set; } = null!; + public required GeneratorDriver GeneratorDriver { get; init; } /// /// A list of generated files. /// - public IReadOnlyList Files { get; set; } = new List(); + public required IReadOnlyList Files { get; init; } /// - /// A list of Errors + /// A list of Error messages /// - public IReadOnlyList ErrorMessages { get; set; } = new List(); + public required IReadOnlyList ErrorMessages { get; init; } /// - /// A list of Warnings + /// A list of Warning messages /// - public IReadOnlyList WarningMessages { get; set; } = new List(); + public required IReadOnlyList WarningMessages { get; init; } + + /// + /// A list of Information messages + /// + public required IReadOnlyList InformationMessages { get; init; } /// /// Is the result valid. diff --git a/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs b/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs index e86c7a1..f695d75 100644 --- a/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs +++ b/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs @@ -129,8 +129,9 @@ private static ExecuteResult ExecuteInternal( return new ExecuteResult { GeneratorDriver = executedDriver, - WarningMessages = diagnostics.Where(d => d.Severity == DiagnosticSeverity.Warning).Select(d => d.GetMessage()).ToList(), - ErrorMessages = diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error).Select(d => d.GetMessage()).ToList(), + InformationMessages = diagnostics.Where(d => d.Severity == DiagnosticSeverity.Info).Select(d => d.GetMessage()).ToArray(), + WarningMessages = diagnostics.Where(d => d.Severity == DiagnosticSeverity.Warning).Select(d => d.GetMessage()).ToArray(), + ErrorMessages = diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error).Select(d => d.GetMessage()).ToArray(), Files = outputCompilation.SyntaxTrees .Where(st => !sources.Any(s => s.Path == st.FilePath)) .Select(st => new FileResult diff --git a/src/FluentBuilderGenerator/Constants/DiagnosticDescriptors.cs b/src/FluentBuilderGenerator/Constants/DiagnosticDescriptors.cs new file mode 100644 index 0000000..cf3b4c5 --- /dev/null +++ b/src/FluentBuilderGenerator/Constants/DiagnosticDescriptors.cs @@ -0,0 +1,25 @@ +using Microsoft.CodeAnalysis; + +namespace FluentBuilderGenerator.Constants; + +internal static class DiagnosticDescriptors +{ + internal static readonly DiagnosticDescriptor ErrorException = new( + "SGERR0001", + "Source generator exception", + "An exception occurred during source generation: {0}", + nameof(FluentBuilderGenerator), + DiagnosticSeverity.Error, + true, + "An unhandled exception occurred while generating source code." + ); + + internal static readonly DiagnosticDescriptor Information = new( + "SGINF0001", + "Information", + "{0}", + nameof(FluentBuilderGenerator), + DiagnosticSeverity.Info, + true + ); +} \ No newline at end of file diff --git a/src/FluentBuilderGenerator/Extensions/ExceptionExtensions.cs b/src/FluentBuilderGenerator/Extensions/ExceptionExtensions.cs new file mode 100644 index 0000000..10b3b92 --- /dev/null +++ b/src/FluentBuilderGenerator/Extensions/ExceptionExtensions.cs @@ -0,0 +1,12 @@ +using FluentBuilderGenerator.Constants; +using Microsoft.CodeAnalysis; + +namespace FluentBuilderGenerator.Extensions; + +internal static class ExceptionExtensions +{ + internal static Diagnostic ToDiagnostic(this Exception exception) + { + return Diagnostic.Create(DiagnosticDescriptors.ErrorException, Location.None, exception); + } +} \ No newline at end of file diff --git a/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj b/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj index dbb72e8..d5bc3f3 100644 --- a/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj +++ b/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj @@ -29,7 +29,7 @@ enable Debug;Release;DebugAttach - + true diff --git a/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs b/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs index 56bcaa6..07bb5e1 100644 --- a/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs +++ b/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs @@ -1,5 +1,7 @@ // This source code is based on https://justsimplycode.com/2020/12/06/auto-generate-builders-using-source-generator-in-net-5 +using System.Text; +using FluentBuilderGenerator.Extensions; using FluentBuilderGenerator.FileGenerators; using FluentBuilderGenerator.Models; using FluentBuilderGenerator.SyntaxReceiver; @@ -8,7 +10,6 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Text; -using System.Text; namespace FluentBuilderGenerator; @@ -70,10 +71,15 @@ public void Initialize(IncrementalGeneratorInitializationContext context) } }); + var diagnostics = new List(); + var fluentBuilderClassesProvider = context.SyntaxProvider - .CreateSyntaxProvider(ShouldHandle, Transform) + .CreateSyntaxProvider( + (syntaxNode, ct) => ShouldHandle(syntaxNode, ct, diagnostics), + (generatorSyntaxContext, ct) => Transform(generatorSyntaxContext, ct, diagnostics) + ) .Collect(); - + var combined2 = fluentBuilderClassesProvider.Combine(commonProvider).Select((x, _) => new { Items = x.Left, @@ -81,32 +87,51 @@ public void Initialize(IncrementalGeneratorInitializationContext context) CompilationHelper = x.Right.Right }); - context.RegisterSourceOutput(combined2, static (spc, data) => + context.RegisterSourceOutput(combined2, (sourceProductionContext, data) => { + foreach (var diagnostic in diagnostics) + { + sourceProductionContext.ReportDiagnostic(diagnostic); + } + var generator = new FluentBuilderClassesGenerator(data.Items, data.CompilationHelper, data.LanguageData.SupportsNullable); try { foreach (var fileData in generator.GenerateFiles()) { - spc.AddSource(fileData.FileName, SourceText.From(fileData.Text, Encoding.UTF8)); + sourceProductionContext.AddSource(fileData.FileName, SourceText.From(fileData.Text, Encoding.UTF8)); } } catch (Exception exception) { var message = $"/*\r\n{nameof(FluentBuilderSourceGenerator)}\r\n\r\n[Exception]\r\n{exception}\r\n\r\n[StackTrace]\r\n{exception.StackTrace}*/"; - spc.AddSource("Error.g.cs", SourceText.From(message, Encoding.UTF8)); + sourceProductionContext.AddSource("Error.g.cs", SourceText.From(message, Encoding.UTF8)); + + sourceProductionContext.ReportDiagnostic(exception.ToDiagnostic()); } }); } - private static bool ShouldHandle(SyntaxNode syntaxNode, CancellationToken cancellationToken) + private static bool ShouldHandle(SyntaxNode syntaxNode, CancellationToken _, List diagnostics) { - return AutoGenerateBuilderSyntaxReceiver.CheckSyntaxNode(syntaxNode); + var result = AutoGenerateBuilderSyntaxReceiver.CheckSyntaxNode(syntaxNode, out var diagnostic); + if (diagnostic != null) + { + diagnostics.Add(diagnostic); + } + + return result; } - private static FluentData Transform(GeneratorSyntaxContext gsc, CancellationToken cancellationToken) + private static FluentData Transform(GeneratorSyntaxContext gsc, CancellationToken _, List diagnostics) { - return AutoGenerateBuilderSyntaxReceiver.HandleSyntaxNode(gsc.Node, gsc.SemanticModel); + var result = AutoGenerateBuilderSyntaxReceiver.HandleSyntaxNode(gsc.Node, gsc.SemanticModel, out var diagnostic); + if (diagnostic != null) + { + diagnostics.Add(diagnostic); + } + + return result; } } \ No newline at end of file diff --git a/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs b/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs index b504fa5..b3c1c2d 100644 --- a/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs +++ b/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs @@ -1,6 +1,7 @@ // This source code is based on https://justsimplycode.com/2020/12/06/auto-generate-builders-using-source-generator-in-net-5 using System.Diagnostics.CodeAnalysis; +using FluentBuilderGenerator.Constants; using FluentBuilderGenerator.Extensions; using FluentBuilderGenerator.Models; using FluentBuilderGenerator.Types; @@ -15,10 +16,11 @@ internal static class AutoGenerateBuilderSyntaxReceiver private const string ModifierPublic = "public"; private const string ModifierInternal = "internal"; - public static bool CheckSyntaxNode(SyntaxNode syntaxNode) + public static bool CheckSyntaxNode(SyntaxNode syntaxNode, out Diagnostic? diagnostic) { if (syntaxNode is not ClassDeclarationSyntax classDeclarationSyntax) { + diagnostic = null; return false; } @@ -26,22 +28,23 @@ public static bool CheckSyntaxNode(SyntaxNode syntaxNode) .FirstOrDefault(x => x.Attributes.Any(AttributeArgumentListParser.IsMatch)); if (attributeList is null) { - Console.WriteLine("ClassDeclarationSyntax should have the correct attribute."); + diagnostic = Diagnostic.Create(DiagnosticDescriptors.Information, classDeclarationSyntax.GetLocation(), "Skipping SyntaxNode: ClassDeclarationSyntax should have the correct attribute."); return false; } if (!TryGetClassModifier(classDeclarationSyntax, out _)) { - Console.WriteLine("Class modifier should be 'public' or 'internal'."); + diagnostic = Diagnostic.Create(DiagnosticDescriptors.Information, classDeclarationSyntax.GetLocation(), "Skipping SyntaxNode: Class modifier should be 'public' or 'internal'."); return false; } + diagnostic = null; return true; } - public static FluentData HandleSyntaxNode(SyntaxNode syntaxNode, SemanticModel semanticModel) + public static FluentData HandleSyntaxNode(SyntaxNode syntaxNode, SemanticModel semanticModel, out Diagnostic? diagnostic) { - if (TryGet((ClassDeclarationSyntax) syntaxNode, semanticModel, out var data)) + if (TryGet((ClassDeclarationSyntax) syntaxNode, semanticModel, out var data, out diagnostic)) { return data; } @@ -49,7 +52,7 @@ public static FluentData HandleSyntaxNode(SyntaxNode syntaxNode, SemanticModel s throw new InvalidOperationException(); } - private static bool TryGet(ClassDeclarationSyntax classDeclarationSyntax, SemanticModel semanticModel, out FluentData data) + private static bool TryGet(ClassDeclarationSyntax classDeclarationSyntax, SemanticModel semanticModel, out FluentData data, out Diagnostic? diagnostic) { data = default; @@ -58,6 +61,7 @@ private static bool TryGet(ClassDeclarationSyntax classDeclarationSyntax, Semant if (!TryGetClassModifier(classDeclarationSyntax, out var classModifier)) { + diagnostic = Diagnostic.Create(DiagnosticDescriptors.Information, classDeclarationSyntax.GetLocation(), "Skipping ClassDeclarationSyntax: Class modifier should be 'public' or 'internal'."); return false; } @@ -85,7 +89,7 @@ private static bool TryGet(ClassDeclarationSyntax classDeclarationSyntax, Semant { if (!AreBuilderClassModifiersValid(classDeclarationSyntax)) { - Console.WriteLine("Custom builder class should be 'partial' and 'public' or 'internal'."); + diagnostic = Diagnostic.Create(DiagnosticDescriptors.Information, classDeclarationSyntax.GetLocation(), "Skipping ClassDeclarationSyntax: Custom builder class should be 'partial' and 'public' or 'internal'."); return false; } @@ -105,6 +109,7 @@ private static bool TryGet(ClassDeclarationSyntax classDeclarationSyntax, Semant Methods = fluentBuilderAttributeArguments.Methods }; + diagnostic = null; return true; } @@ -128,6 +133,7 @@ private static bool TryGet(ClassDeclarationSyntax classDeclarationSyntax, Semant Methods = fluentBuilderAttributeArguments.Methods }; + diagnostic = null; return true; } diff --git a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile.verified.txt b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile.verified.txt index b06740e..6ee155c 100644 --- a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile.verified.txt +++ b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile.verified.txt @@ -6,22 +6,22 @@ FluentBuilderSourceGenerator [Exception] System.NotSupportedException: Unable to generate a FluentBuilder for the class 'System.AppDomain' because no public constructor is defined. - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.CreateClassBuilderCode(FluentData fluentData, ClassSymbol classSymbol, List`1 allClassSymbols) in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 93 - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.<>c__DisplayClass7_0.b__1(ValueTuple`2 classSymbol) in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 64 + at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.CreateClassBuilderCode(FluentData fluentData, ClassSymbol classSymbol, List`1 allClassSymbols) in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 84 + at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.<>c__DisplayClass7_0.b__1(ValueTuple`2 classSymbol) in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 55 at System.Linq.Enumerable.SelectListIterator`2.MoveNext() at System.Collections.Generic.HashSet`1.UnionWith(IEnumerable`1 other) at System.Linq.Enumerable.UnionIterator`1.FillSet() at System.Linq.Enumerable.UnionIterator`1.ToList() - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.GenerateFiles() in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 82 - at FluentBuilderGenerator.FluentBuilderSourceGenerator.<>c.b__0_4(SourceProductionContext spc, <>f__AnonymousType1`3 data) in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FluentBuilderSourceGenerator.cs:line 90 + at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.GenerateFiles() in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 73 + at FluentBuilderGenerator.FluentBuilderSourceGenerator.<>c__DisplayClass0_0.b__6(SourceProductionContext sourceProductionContext, <>f__AnonymousType1`3 data) in {SolutionDirectory}src\FluentBuilderGenerator\FluentBuilderSourceGenerator.cs:line 101 [StackTrace] - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.CreateClassBuilderCode(FluentData fluentData, ClassSymbol classSymbol, List`1 allClassSymbols) in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 93 - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.<>c__DisplayClass7_0.b__1(ValueTuple`2 classSymbol) in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 64 + at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.CreateClassBuilderCode(FluentData fluentData, ClassSymbol classSymbol, List`1 allClassSymbols) in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 84 + at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.<>c__DisplayClass7_0.b__1(ValueTuple`2 classSymbol) in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 55 at System.Linq.Enumerable.SelectListIterator`2.MoveNext() at System.Collections.Generic.HashSet`1.UnionWith(IEnumerable`1 other) at System.Linq.Enumerable.UnionIterator`1.FillSet() at System.Linq.Enumerable.UnionIterator`1.ToList() - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.GenerateFiles() in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 82 - at FluentBuilderGenerator.FluentBuilderSourceGenerator.<>c.b__0_4(SourceProductionContext spc, <>f__AnonymousType1`3 data) in C:\dev\GitHub\FluentBuilder\src\FluentBuilderGenerator\FluentBuilderSourceGenerator.cs:line 90*/ + at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.GenerateFiles() in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 73 + at FluentBuilderGenerator.FluentBuilderSourceGenerator.<>c__DisplayClass0_0.b__6(SourceProductionContext sourceProductionContext, <>f__AnonymousType1`3 data) in {SolutionDirectory}src\FluentBuilderGenerator\FluentBuilderSourceGenerator.cs:line 101*/ } \ No newline at end of file diff --git a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs index 229356b..20279ac 100644 --- a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs +++ b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs @@ -732,8 +732,7 @@ public void GenerateFiles_ClassWithPropertyWhichHasAValue_Should_GenerateCorrect if (Write) File.WriteAllText($"../../../DTO/{builderFileName}", builder.Text); builder.Text.Should().Be(File.ReadAllText($"../../../DTO/{builderFileName}")); - //var b = new ClassWithCultureInfoBuilder(); - //var c = b.Build(); + result.InformationMessages.Should().HaveCount(3); } [Fact] From a2858ddf73f845c2cb87a2ec3f6319528e13865d Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Mon, 23 Jun 2025 21:40:06 +0200 Subject: [PATCH 07/24] 0.11.0-preview-01 --- src/FluentBuilderGenerator/FluentBuilderGenerator.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj b/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj index d5bc3f3..48a0cb1 100644 --- a/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj +++ b/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj @@ -1,7 +1,7 @@  - 0.10.0.1 + 0.11.0-preview-01 netstandard2.0 latest true From cb1cef3312a3c8b139946213d79608c6b3223692 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Mon, 23 Jun 2025 21:42:59 +0200 Subject: [PATCH 08/24] 0.11.0-preview-01 --- Generate-ReleaseNotes.bat | 2 +- PackageReleaseNotes.txt | 4 +- ReleaseNotes.md | 92 +-------------------------------------- 3 files changed, 5 insertions(+), 93 deletions(-) diff --git a/Generate-ReleaseNotes.bat b/Generate-ReleaseNotes.bat index 8bd4bb7..6a370c7 100644 --- a/Generate-ReleaseNotes.bat +++ b/Generate-ReleaseNotes.bat @@ -1,6 +1,6 @@ rem https://github.com/StefH/GitHubReleaseNotes -SET version=0.10.0 +SET version=0.11.0-preview-01 GitHubReleaseNotes --output ReleaseNotes.md --skip-empty-releases --exclude-labels question invalid documentation --version %version% diff --git a/PackageReleaseNotes.txt b/PackageReleaseNotes.txt index 8a8ef63..aeaee1d 100644 --- a/PackageReleaseNotes.txt +++ b/PackageReleaseNotes.txt @@ -1,4 +1,4 @@ -# 0.10.0 (19 October 2024) -- #65 Add support for generic AutoGenerateBuilderAttribute [enhancement] +# 0.11.0-preview-01 (23 June 2025) +- #69 Add support for Internal types The full release notes can be found here: https://github.com/StefH/FluentBuilder/blob/main/ReleaseNotes.md \ No newline at end of file diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 0499f0d..1bcc7f3 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,129 +1,41 @@ -# 0.10.0 (19 October 2024) -- [#65](https://github.com/StefH/FluentBuilder/pull/65) - Add support for generic AutoGenerateBuilderAttribute [enhancement] contributed by [StefH](https://github.com/StefH) - -# 0.9.2 (30 August 2024) -- [#64](https://github.com/StefH/FluentBuilder/pull/64) - Support "internal" for class and custom builder [enhancement] contributed by [StefH](https://github.com/StefH) - -# 0.9.1 (24 August 2024) -- [#63](https://github.com/StefH/FluentBuilder/pull/63) - Fixed support for IReadOnlyCollection and IReadOnlyList [bug] contributed by [StefH](https://github.com/StefH) +# 0.11.0-preview-01 (23 June 2025) +- [#69](https://github.com/StefH/FluentBuilder/issues/69) - Add support for Internal types # 0.9.0 (08 April 2023) -- [#55](https://github.com/StefH/FluentBuilder/pull/55) - UsingInstance returns correct generated builder [enhancement] contributed by [StefH](https://github.com/StefH) -- [#56](https://github.com/StefH/FluentBuilder/pull/56) - Add AsBuilder extension method [enhancement] contributed by [StefH](https://github.com/StefH) - [#54](https://github.com/StefH/FluentBuilder/issues/54) - Automatic extension method generation for easy updating of existing class instances [enhancement] -# 0.8.0 (03 April 2023) -- [#52](https://github.com/StefH/FluentBuilder/pull/52) - AttributeArgumentListParser : Update TryParseAsEnum [enhancement] contributed by [StefH](https://github.com/StefH) -- [#53](https://github.com/StefH/FluentBuilder/pull/53) - By default : generate only the With*** builder methods [enhancement] contributed by [StefH](https://github.com/StefH) - # 0.7.1 (14 March 2023) -- [#50](https://github.com/StefH/FluentBuilder/pull/50) - Take the namespace of generated files from the RootNamespace property [enhancement] contributed by [justinwritescode](https://github.com/justinwritescode) -- [#51](https://github.com/StefH/FluentBuilder/pull/51) - Add support for parameterless constructors [enhancement] contributed by [StefH](https://github.com/StefH) - [#41](https://github.com/StefH/FluentBuilder/issues/41) - Builder could handle classes without default constructor [enhancement] # 0.7.0 (20 September 2022) -- [#49](https://github.com/StefH/FluentBuilder/pull/49) - Fix IListBuilder namespace [bug] contributed by [StefH](https://github.com/StefH) - [#48](https://github.com/StefH/FluentBuilder/issues/48) - Child builders for properties not generating correct code # 0.6.0 (20 August 2022) -- [#46](https://github.com/StefH/FluentBuilder/pull/46) - Add support to exclude properties from base-classes + fixed default value if SuppressNullableWarningExpression contributed by [StefH](https://github.com/StefH) -- [#47](https://github.com/StefH/FluentBuilder/pull/47) - Support Properties which have 'private set' [enhancement] contributed by [StefH](https://github.com/StefH) - [#40](https://github.com/StefH/FluentBuilder/issues/40) - Builder code should handle private setters # 0.5.0 (12 July 2022) -- [#44](https://github.com/StefH/FluentBuilder/pull/44) - Adds an attribute called IgnoreProperty that tells the generator to skip the property [enhancement] contributed by [emorell96](https://github.com/emorell96) -- [#45](https://github.com/StefH/FluentBuilder/pull/45) - If a propert has a default set, use that in the builder [enhancement] contributed by [StefH](https://github.com/StefH) - [#43](https://github.com/StefH/FluentBuilder/issues/43) - Bug with a class with CultureInfo # 0.4.9 (25 June 2022) -- [#38](https://github.com/StefH/FluentBuilder/pull/38) - Support for init-only properties [enhancement] contributed by [StefH](https://github.com/StefH) -- [#42](https://github.com/StefH/FluentBuilder/pull/42) - Use params in 'With'-method in case the type is an array [enhancement] contributed by [StefH](https://github.com/StefH) - [#35](https://github.com/StefH/FluentBuilder/issues/35) - Builder code should handle init setter so that it doesn't generate non-compilable code - [#39](https://github.com/StefH/FluentBuilder/issues/39) - [enhancement]: for array `with` methods, consider adding the `params` keyword for easier use [enhancement] # 0.4.8 (21 June 2022) -- [#37](https://github.com/StefH/FluentBuilder/pull/37) - Support different namespace for class in custom builder class [enhancement] contributed by [StefH](https://github.com/StefH) - [#36](https://github.com/StefH/FluentBuilder/issues/36) - Issues with generating builder from an object in another namespace [bug] # 0.4.7 (04 June 2022) -- [#33](https://github.com/StefH/FluentBuilder/pull/33) - Fix StackOverflow when there is a constructor with itself contributed by [StefH](https://github.com/StefH) -- [#34](https://github.com/StefH/FluentBuilder/pull/34) - Implement Func and Action [enhancement] contributed by [StefH](https://github.com/StefH) - [#28](https://github.com/StefH/FluentBuilder/issues/28) - Generating a builder for a property of a type where the ctor with the least parameters expects the property type itself causes a stack overflow - [#32](https://github.com/StefH/FluentBuilder/issues/32) - Unable to use `Func` and `Action` with the builder methods # 0.4.6 (20 May 2022) -- [#31](https://github.com/StefH/FluentBuilder/pull/31) - Fix generation failing when the target type has at least one ctor with parameters contributed by [iam-mholle](https://github.com/iam-mholle) - [#30](https://github.com/StefH/FluentBuilder/issues/30) - Builder generation fails if the target type has at least one ctor with parameters [bug] # 0.4.5 (16 May 2022) -- [#29](https://github.com/StefH/FluentBuilder/pull/29) - Support IReadOnlyCollection and ReadOnlyCollection [enhancement] contributed by [StefH](https://github.com/StefH) - [#27](https://github.com/StefH/FluentBuilder/issues/27) - Wrong initialization is generated for ReadOnlyCollection<> properties [bug] -# 0.4.4 (27 April 2022) -- [#26](https://github.com/StefH/FluentBuilder/pull/26) - Replace Array.Empty by new T[0] (supporting .NET45) [bug] contributed by [StefH](https://github.com/StefH) - # 0.4.3 (27 April 2022) -- [#24](https://github.com/StefH/FluentBuilder/pull/24) - Use correct default value for reference types [bug] contributed by [StefH](https://github.com/StefH) -- [#25](https://github.com/StefH/FluentBuilder/pull/25) - Create correct default() statement (use New constructor when possible) [enhancement] contributed by [StefH](https://github.com/StefH) - [#22](https://github.com/StefH/FluentBuilder/issues/22) - The type or namespace name 'UserBuilder' does not exist in the namespace 'FluentBuilder' (are you missing an assembly reference?) [bug] -# 0.4.2 (03 April 2022) -- [#23](https://github.com/StefH/FluentBuilder/pull/23) - Add support for file scoped namespaces [enhancement] contributed by [StefH](https://github.com/StefH) - -# 0.4.0 (18 February 2022) -- [#21](https://github.com/StefH/FluentBuilder/pull/21) - Use full type name + change namespace from builders [bug] contributed by [StefH](https://github.com/StefH) - -# 0.3.2 (16 February 2022) -- [#20](https://github.com/StefH/FluentBuilder/pull/20) - Do not inherit IEnumerableBuilder anymore [enhancement] contributed by [StefH](https://github.com/StefH) - -# 0.3.1 (14 February 2022) -- [#19](https://github.com/StefH/FluentBuilder/pull/19) - Generate Error.g.cs file in case no public and parameterless constructor is present in the target class contributed by [StefH](https://github.com/StefH) - -# 0.3.0 (12 February 2022) -- [#18](https://github.com/StefH/FluentBuilder/pull/18) - Add support to use this FluentBuilder for all classes [enhancement] contributed by [StefH](https://github.com/StefH) - -# 0.2.5 (08 February 2022) -- [#17](https://github.com/StefH/FluentBuilder/pull/17) - For interface or array, no cast is needed [bug] contributed by [StefH](https://github.com/StefH) - -# 0.2.4 (06 February 2022) -- [#16](https://github.com/StefH/FluentBuilder/pull/16) - Fix support for normal Dictionary<,> [bug] contributed by [StefH](https://github.com/StefH) - -# 0.2.3 (01 February 2022) -- [#15](https://github.com/StefH/FluentBuilder/pull/15) - Refactor IEumerable builders [enhancement] contributed by [StefH](https://github.com/StefH) - -# 0.2.2 (31 January 2022) -- [#14](https://github.com/StefH/FluentBuilder/pull/14) - Add support for IDictionary [enhancement] contributed by [StefH](https://github.com/StefH) - -# 0.2.1 (30 January 2022) -- [#12](https://github.com/StefH/FluentBuilder/pull/12) - Add support for Array and IEnumerable [enhancement] contributed by [StefH](https://github.com/StefH) -- [#13](https://github.com/StefH/FluentBuilder/pull/13) - Skip Dictionary for IEnumerableBuilder logic [bug] contributed by [StefH](https://github.com/StefH) - -# 0.1.2 (20 January 2022) -- [#11](https://github.com/StefH/FluentBuilder/pull/11) - Also add 'useObjectInitializer' in With* methods [enhancement] contributed by [StefH](https://github.com/StefH) - -# 0.1.1 (15 January 2022) -- [#10](https://github.com/StefH/FluentBuilder/pull/10) - Remove runtime check for parameterless constructor [enhancement] contributed by [StefH](https://github.com/StefH) - -# 0.1.0 (13 January 2022) -- [#9](https://github.com/StefH/FluentBuilder/pull/9) - Add support for calling DefaultConstructor instead of using ObjectInitializer [enhancement] contributed by [StefH](https://github.com/StefH) - -# 0.0.11 (10 August 2021) -- [#8](https://github.com/StefH/FluentBuilder/pull/8) - Add DevelopmentDependency = true to csproj [enhancement] contributed by [StefH](https://github.com/StefH) - -# 0.0.8 (06 August 2021) -- [#7](https://github.com/StefH/FluentBuilder/pull/7) - Add support for generics + update generated filename [enhancement] contributed by [StefH](https://github.com/StefH) - -# 0.0.7 (05 August 2021) -- [#5](https://github.com/StefH/FluentBuilder/pull/5) - Add autogenerated header [enhancement] contributed by [StefH](https://github.com/StefH) -- [#6](https://github.com/StefH/FluentBuilder/pull/6) - Only emit #nullable when nullable is supported (>= LanguageVersion.CS… [enhancement] contributed by [StefH](https://github.com/StefH) - # 0.0.5 (05 August 2021) -- [#4](https://github.com/StefH/FluentBuilder/pull/4) - Add support for Action<builder> [enhancement] contributed by [StefH](https://github.com/StefH) - [#3](https://github.com/StefH/FluentBuilder/issues/3) - Add WithProperty overloads that accepts the property's builder when available [enhancement] -# 0.0.4 (21 July 2021) -- [#2](https://github.com/StefH/FluentBuilder/pull/2) - Make project Unit-Testable [enhancement] contributed by [StefH](https://github.com/StefH) - -# 0.0.2 (19 July 2021) -- [#1](https://github.com/StefH/FluentBuilder/pull/1) - Update Lazy constructor to fix issues with .NET 4.5 [bug] contributed by [StefH](https://github.com/StefH) - From a58656320e40e75eec5d6986013457f1794cc8cb Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Mon, 23 Jun 2025 21:45:52 +0200 Subject: [PATCH 09/24] i --- PackageReleaseNotes.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PackageReleaseNotes.txt b/PackageReleaseNotes.txt index aeaee1d..2b3d71b 100644 --- a/PackageReleaseNotes.txt +++ b/PackageReleaseNotes.txt @@ -1,4 +1,4 @@ # 0.11.0-preview-01 (23 June 2025) -- #69 Add support for Internal types +- Incremental The full release notes can be found here: https://github.com/StefH/FluentBuilder/blob/main/ReleaseNotes.md \ No newline at end of file From 62b7c05a4bfc9bfaac17fd87ed1c56f89777b2f5 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Mon, 23 Jun 2025 21:47:01 +0200 Subject: [PATCH 10/24] nug --- .../BuilderConsumerNET6_ViaNuGet.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src-examples/BuilderConsumerNET6_ViaNuGet/BuilderConsumerNET6_ViaNuGet.csproj b/src-examples/BuilderConsumerNET6_ViaNuGet/BuilderConsumerNET6_ViaNuGet.csproj index e197fc9..a804dfd 100644 --- a/src-examples/BuilderConsumerNET6_ViaNuGet/BuilderConsumerNET6_ViaNuGet.csproj +++ b/src-examples/BuilderConsumerNET6_ViaNuGet/BuilderConsumerNET6_ViaNuGet.csproj @@ -10,12 +10,12 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive From 9a18cf22f06bd20827484d8fe0367bffea09c844 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 24 Jun 2025 11:04:23 +0200 Subject: [PATCH 11/24] # 0.11.0-preview-02 (24 June 2025) --- PackageReleaseNotes.txt | 2 +- .../ClassWithPrivateSetter.cs | 6 ++++++ .../Constants/DiagnosticDescriptors.cs | 15 ++++++++++++--- .../Extensions/ExceptionExtensions.cs | 2 +- .../FluentBuilderGenerator.csproj | 2 +- .../AutoGenerateBuilderSyntaxReceiver.cs | 8 ++++---- 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/PackageReleaseNotes.txt b/PackageReleaseNotes.txt index 2b3d71b..6261d05 100644 --- a/PackageReleaseNotes.txt +++ b/PackageReleaseNotes.txt @@ -1,4 +1,4 @@ -# 0.11.0-preview-01 (23 June 2025) +# 0.11.0-preview-02 (24 June 2025) - Incremental The full release notes can be found here: https://github.com/StefH/FluentBuilder/blob/main/ReleaseNotes.md \ No newline at end of file diff --git a/src-examples/BuilderConsumerNET6_ViaNuGet/ClassWithPrivateSetter.cs b/src-examples/BuilderConsumerNET6_ViaNuGet/ClassWithPrivateSetter.cs index e04b54d..58ee24c 100644 --- a/src-examples/BuilderConsumerNET6_ViaNuGet/ClassWithPrivateSetter.cs +++ b/src-examples/BuilderConsumerNET6_ViaNuGet/ClassWithPrivateSetter.cs @@ -8,5 +8,11 @@ public class ClassWithPrivateSetter public int Value1 { get; private set; } public int Value2 { get; set; } + + [AutoGenerateBuilder(FluentBuilderAccessibility.PublicAndPrivate)] + private class PrivateClass + { + public int Test { get; set; } + } } } \ No newline at end of file diff --git a/src/FluentBuilderGenerator/Constants/DiagnosticDescriptors.cs b/src/FluentBuilderGenerator/Constants/DiagnosticDescriptors.cs index cf3b4c5..3e31cef 100644 --- a/src/FluentBuilderGenerator/Constants/DiagnosticDescriptors.cs +++ b/src/FluentBuilderGenerator/Constants/DiagnosticDescriptors.cs @@ -4,7 +4,7 @@ namespace FluentBuilderGenerator.Constants; internal static class DiagnosticDescriptors { - internal static readonly DiagnosticDescriptor ErrorException = new( + internal static readonly DiagnosticDescriptor Error = new( "SGERR0001", "Source generator exception", "An exception occurred during source generation: {0}", @@ -14,10 +14,19 @@ internal static class DiagnosticDescriptors "An unhandled exception occurred while generating source code." ); - internal static readonly DiagnosticDescriptor Information = new( + internal static readonly DiagnosticDescriptor ClassModifierShouldBeInternalOrPublic = new( "SGINF0001", "Information", - "{0}", + "Class modifier should be 'public' or 'internal'", + nameof(FluentBuilderGenerator), + DiagnosticSeverity.Info, + true + ); + + internal static readonly DiagnosticDescriptor CustomBuilderClassModifierShouldBePartialAndInternalOrPublic = new( + "SGINF0002", + "Information", + "Custom builder class should be 'partial' and 'public' or 'internal'", nameof(FluentBuilderGenerator), DiagnosticSeverity.Info, true diff --git a/src/FluentBuilderGenerator/Extensions/ExceptionExtensions.cs b/src/FluentBuilderGenerator/Extensions/ExceptionExtensions.cs index 10b3b92..ce7edec 100644 --- a/src/FluentBuilderGenerator/Extensions/ExceptionExtensions.cs +++ b/src/FluentBuilderGenerator/Extensions/ExceptionExtensions.cs @@ -7,6 +7,6 @@ internal static class ExceptionExtensions { internal static Diagnostic ToDiagnostic(this Exception exception) { - return Diagnostic.Create(DiagnosticDescriptors.ErrorException, Location.None, exception); + return Diagnostic.Create(DiagnosticDescriptors.Error, Location.None, exception); } } \ No newline at end of file diff --git a/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj b/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj index 48a0cb1..c0a8ca4 100644 --- a/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj +++ b/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj @@ -1,7 +1,7 @@  - 0.11.0-preview-01 + 0.11.0-preview-02 netstandard2.0 latest true diff --git a/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs b/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs index b3c1c2d..e4d6060 100644 --- a/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs +++ b/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs @@ -28,13 +28,13 @@ public static bool CheckSyntaxNode(SyntaxNode syntaxNode, out Diagnostic? diagno .FirstOrDefault(x => x.Attributes.Any(AttributeArgumentListParser.IsMatch)); if (attributeList is null) { - diagnostic = Diagnostic.Create(DiagnosticDescriptors.Information, classDeclarationSyntax.GetLocation(), "Skipping SyntaxNode: ClassDeclarationSyntax should have the correct attribute."); + diagnostic = null; return false; } if (!TryGetClassModifier(classDeclarationSyntax, out _)) { - diagnostic = Diagnostic.Create(DiagnosticDescriptors.Information, classDeclarationSyntax.GetLocation(), "Skipping SyntaxNode: Class modifier should be 'public' or 'internal'."); + diagnostic = Diagnostic.Create(DiagnosticDescriptors.ClassModifierShouldBeInternalOrPublic, classDeclarationSyntax.GetLocation()); return false; } @@ -61,7 +61,7 @@ private static bool TryGet(ClassDeclarationSyntax classDeclarationSyntax, Semant if (!TryGetClassModifier(classDeclarationSyntax, out var classModifier)) { - diagnostic = Diagnostic.Create(DiagnosticDescriptors.Information, classDeclarationSyntax.GetLocation(), "Skipping ClassDeclarationSyntax: Class modifier should be 'public' or 'internal'."); + diagnostic = Diagnostic.Create(DiagnosticDescriptors.ClassModifierShouldBeInternalOrPublic, classDeclarationSyntax.GetLocation()); return false; } @@ -89,7 +89,7 @@ private static bool TryGet(ClassDeclarationSyntax classDeclarationSyntax, Semant { if (!AreBuilderClassModifiersValid(classDeclarationSyntax)) { - diagnostic = Diagnostic.Create(DiagnosticDescriptors.Information, classDeclarationSyntax.GetLocation(), "Skipping ClassDeclarationSyntax: Custom builder class should be 'partial' and 'public' or 'internal'."); + diagnostic = Diagnostic.Create(DiagnosticDescriptors.CustomBuilderClassModifierShouldBePartialAndInternalOrPublic, classDeclarationSyntax.GetLocation()); return false; } From c644810714349ac6011c5e47fccccb18aebab845 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 24 Jun 2025 11:19:11 +0200 Subject: [PATCH 12/24] tests --- .../Models/ExecuteResult.cs | 5 +++++ .../SourceGeneratorExtensions.cs | 1 + ...amespace.ClassOnOtherNamespaceBuilder.g.cs | 2 +- ...ce.ClassOnOtherNamespace_IListBuilder.g.cs | 2 +- ...lderGeneratorTests.DTO.AddressBuilder.g.cs | 2 +- ...neratorTests.DTO.Address_ArrayBuilder.g.cs | 2 +- ...rTests.DTO.Address_ICollectionBuilder.g.cs | 2 +- ...rTests.DTO.Address_IEnumerableBuilder.g.cs | 2 +- ...neratorTests.DTO.Address_IListBuilder.g.cs | 2 +- ...TO.Address_IReadOnlyCollectionBuilder.g.cs | 2 +- ...ests.DTO.Address_IReadOnlyListBuilder.g.cs | 2 +- .../DTO/ClassWithPrivateBuilderClass.cs | 12 +++++++++++ .../DTO/FluentBuilder.ArrayBuilder.g.cs | 2 +- .../DTO/FluentBuilder.BaseBuilder.g.cs | 2 +- .../DTO/FluentBuilder.Extra.g.cs | 2 +- .../DTO/FluentBuilder.ICollectionBuilder.g.cs | 2 +- .../DTO/FluentBuilder.IDictionaryBuilder.g.cs | 2 +- .../DTO/FluentBuilder.IEnumerableBuilder.g.cs | 2 +- .../DTO/FluentBuilder.IListBuilder.g.cs | 2 +- ...entBuilder.IReadOnlyCollectionBuilder.g.cs | 2 +- .../FluentBuilder.IReadOnlyListBuilder.g.cs | 2 +- ...rGeneratorTests.DTO.AddressBuilder_T_.g.cs | 2 +- ...atorTests.DTO.AddressTTBuilder_T1_T2_.g.cs | 2 +- ...sts.DTO.ClassWithFuncAndActionBuilder.g.cs | 2 +- ...neratorTests.DTO.ClassWithInitBuilder.g.cs | 2 +- ...ts.DTO.ClassWithPrivateSetter1Builder.g.cs | 2 +- ...ts.DTO.ClassWithPrivateSetter2Builder.g.cs | 2 +- ....DTO.ClassWithPropertyValueSetBuilder.g.cs | 2 +- ...neratorTests.DTO.InternalClassBuilder.g.cs | 2 +- ...eneratorTests.DTO.MyDummyClassBuilder.g.cs | 2 +- ...ratorTests.DTO.MyInternalClassBuilder.g.cs | 2 +- ...BuilderGeneratorTests.DTO.TestBuilder.g.cs | 2 +- ...uilderGeneratorTests.DTO.ThingBuilder.g.cs | 2 +- ...BuilderGeneratorTests.DTO.UserBuilder.g.cs | 2 +- ...derGeneratorTests.DTO.UserTBuilder_T_.g.cs | 2 +- ...rTWithAddressAndConstructorBuilder_T_.g.cs | 2 +- ...Tests.DTO.UserTWithAddressTBuilder_T_.g.cs | 2 +- ...eneratorTests.DTO.Option_IListBuilder.g.cs | 2 +- ...erGeneratorTests.DTO2.MyOptionBuilder.g.cs | 2 +- ...e_Should_GenerateCorrectFiles.verified.txt | 2 +- ...t_Should_GenerateCorrectFiles.verified.txt | 2 +- ...y_Should_GenerateCorrectFiles.verified.txt | 2 +- .../FluentBuilderSourceGeneratorTests.cs | 21 +++++++++++++++++-- 43 files changed, 76 insertions(+), 41 deletions(-) create mode 100644 tests/FluentBuilderGeneratorTests/DTO/ClassWithPrivateBuilderClass.cs diff --git a/src-extensions/CSharp.SourceGenerators.Extensions/Models/ExecuteResult.cs b/src-extensions/CSharp.SourceGenerators.Extensions/Models/ExecuteResult.cs index 1994d77..fd7cd01 100644 --- a/src-extensions/CSharp.SourceGenerators.Extensions/Models/ExecuteResult.cs +++ b/src-extensions/CSharp.SourceGenerators.Extensions/Models/ExecuteResult.cs @@ -15,6 +15,11 @@ public class ExecuteResult /// public required IReadOnlyList Files { get; init; } + /// + /// Gets the collection of diagnostics associated with the current operation or state. + /// + public required IReadOnlyList Diagnostics { get; init; } + /// /// A list of Error messages /// diff --git a/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs b/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs index f695d75..0cb96fb 100644 --- a/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs +++ b/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs @@ -129,6 +129,7 @@ private static ExecuteResult ExecuteInternal( return new ExecuteResult { GeneratorDriver = executedDriver, + Diagnostics = diagnostics, InformationMessages = diagnostics.Where(d => d.Severity == DiagnosticSeverity.Info).Select(d => d.GetMessage()).ToArray(), WarningMessages = diagnostics.Where(d => d.Severity == DiagnosticSeverity.Warning).Select(d => d.GetMessage()).ToArray(), ErrorMessages = diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error).Select(d => d.GetMessage()).ToArray(), diff --git a/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespaceBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespaceBuilder.g.cs index b68b1e2..9aec061 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespaceBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespaceBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespace_IListBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespace_IListBuilder.g.cs index f1bd83d..a555ce8 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespace_IListBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespace_IListBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.AddressBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.AddressBuilder.g.cs index bb7a5d6..4fdc483 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.AddressBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.AddressBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ArrayBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ArrayBuilder.g.cs index 3b3b08c..0239cba 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ArrayBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ArrayBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ICollectionBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ICollectionBuilder.g.cs index 042012f..89e254e 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ICollectionBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ICollectionBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IEnumerableBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IEnumerableBuilder.g.cs index 2bcc94a..98cb2c5 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IEnumerableBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IEnumerableBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IListBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IListBuilder.g.cs index 9e080f2..ad072c4 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IListBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IListBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyCollectionBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyCollectionBuilder.g.cs index 24dc745..786f164 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyCollectionBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyCollectionBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyListBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyListBuilder.g.cs index 5c16276..ac05e71 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyListBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyListBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/ClassWithPrivateBuilderClass.cs b/tests/FluentBuilderGeneratorTests/DTO/ClassWithPrivateBuilderClass.cs new file mode 100644 index 0000000..e70afcc --- /dev/null +++ b/tests/FluentBuilderGeneratorTests/DTO/ClassWithPrivateBuilderClass.cs @@ -0,0 +1,12 @@ +using FluentBuilder; + +namespace FluentBuilderGeneratorTests.DTO; + +public class ClassWithPrivateBuilderClass +{ + [AutoGenerateBuilder(FluentBuilderAccessibility.PublicAndPrivate)] + private class PrivateClass + { + public int Test { get; set; } + } +} \ No newline at end of file diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ArrayBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ArrayBuilder.g.cs index 3b4cd82..0948134 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ArrayBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ArrayBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.BaseBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.BaseBuilder.g.cs index 183225a..6e3ee3c 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.BaseBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.BaseBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.Extra.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.Extra.g.cs index 6d7f740..aa824ee 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.Extra.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.Extra.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ICollectionBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ICollectionBuilder.g.cs index 46bf979..7c7e7d0 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ICollectionBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ICollectionBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IDictionaryBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IDictionaryBuilder.g.cs index 1b75872..b2ef15c 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IDictionaryBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IDictionaryBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IEnumerableBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IEnumerableBuilder.g.cs index b66b144..46a1bce 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IEnumerableBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IEnumerableBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IListBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IListBuilder.g.cs index 74a9eb4..ff8b9cc 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IListBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IListBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyCollectionBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyCollectionBuilder.g.cs index cefd7b7..89dd673 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyCollectionBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyCollectionBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyListBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyListBuilder.g.cs index a7a2446..686fff7 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyListBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyListBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressBuilder_T_.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressBuilder_T_.g.cs index b7682ed..cad11dc 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressBuilder_T_.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressBuilder_T_.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressTTBuilder_T1_T2_.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressTTBuilder_T1_T2_.g.cs index 315e52e..1bf5b6b 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressTTBuilder_T1_T2_.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressTTBuilder_T1_T2_.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithFuncAndActionBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithFuncAndActionBuilder.g.cs index da9536a..77fc406 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithFuncAndActionBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithFuncAndActionBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithInitBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithInitBuilder.g.cs index 09c47f0..496c808 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithInitBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithInitBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter1Builder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter1Builder.g.cs index 0a01d30..9233fc2 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter1Builder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter1Builder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter2Builder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter2Builder.g.cs index 96cd1c5..454b978 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter2Builder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter2Builder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPropertyValueSetBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPropertyValueSetBuilder.g.cs index 2a3c45b..cf36e8a 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPropertyValueSetBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPropertyValueSetBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.InternalClassBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.InternalClassBuilder.g.cs index 4362dca..7c8158b 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.InternalClassBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.InternalClassBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyDummyClassBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyDummyClassBuilder.g.cs index e3adb06..0247e04 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyDummyClassBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyDummyClassBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyInternalClassBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyInternalClassBuilder.g.cs index 7ecbd1a..e777e50 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyInternalClassBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyInternalClassBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.TestBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.TestBuilder.g.cs index a2bd547..455ac51 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.TestBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.TestBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ThingBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ThingBuilder.g.cs index 38f2cb8..633710f 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ThingBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ThingBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserBuilder.g.cs index ef92b1a..f9fc878 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTBuilder_T_.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTBuilder_T_.g.cs index 9d068d4..0949f30 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTBuilder_T_.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTBuilder_T_.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressAndConstructorBuilder_T_.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressAndConstructorBuilder_T_.g.cs index b645979..2d85ade 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressAndConstructorBuilder_T_.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressAndConstructorBuilder_T_.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressTBuilder_T_.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressTBuilder_T_.g.cs index 83b236c..005dd74 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressTBuilder_T_.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressTBuilder_T_.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO.Option_IListBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO.Option_IListBuilder.g.cs index 855ab5e..d6acb27 100644 --- a/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO.Option_IListBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO.Option_IListBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO2.MyOptionBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO2.MyOptionBuilder.g.cs index 44f2b73..676181f 100644 --- a/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO2.MyOptionBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO2.MyOptionBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ClassWithFluentBuilderIgnore_Should_GenerateCorrectFiles.verified.txt b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ClassWithFluentBuilderIgnore_Should_GenerateCorrectFiles.verified.txt index cab582c..9c83a6c 100644 --- a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ClassWithFluentBuilderIgnore_Should_GenerateCorrectFiles.verified.txt +++ b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ClassWithFluentBuilderIgnore_Should_GenerateCorrectFiles.verified.txt @@ -3,7 +3,7 @@ Source: //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithAndWithout_Should_GenerateCorrectFiles.verified.txt b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithAndWithout_Should_GenerateCorrectFiles.verified.txt index cab582c..9c83a6c 100644 --- a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithAndWithout_Should_GenerateCorrectFiles.verified.txt +++ b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithAndWithout_Should_GenerateCorrectFiles.verified.txt @@ -3,7 +3,7 @@ Source: //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithOnly_Should_GenerateCorrectFiles.verified.txt b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithOnly_Should_GenerateCorrectFiles.verified.txt index cab582c..9c83a6c 100644 --- a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithOnly_Should_GenerateCorrectFiles.verified.txt +++ b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithOnly_Should_GenerateCorrectFiles.verified.txt @@ -3,7 +3,7 @@ Source: //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs index 20279ac..907afac 100644 --- a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs +++ b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs @@ -31,6 +31,25 @@ public FluentBuilderSourceGeneratorTests() [ModuleInitializer] public static void ModuleInitializer() => VerifySourceGenerators.Enable(); + [Fact] + public void GenerateFiles_ForClassWithPrivateBuilderClass_ShouldReturnDiagnostics() + { + // Arrange + var path = "./DTO/ClassWithPrivateBuilderClass.cs"; + var sourceFile = new SourceFile + { + Path = path, + Text = File.ReadAllText(path) + }; + + // Act + var result = _sut.Execute(Namespace, [sourceFile]); + + // Assert + result.InformationMessages.Should().HaveCount(1); + result.InformationMessages[0].Should().Be("Class modifier should be 'public' or 'internal'"); + } + [Fact] public Task GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile() { @@ -731,8 +750,6 @@ public void GenerateFiles_ClassWithPropertyWhichHasAValue_Should_GenerateCorrect if (Write) File.WriteAllText($"../../../DTO/{builderFileName}", builder.Text); builder.Text.Should().Be(File.ReadAllText($"../../../DTO/{builderFileName}")); - - result.InformationMessages.Should().HaveCount(3); } [Fact] From d05592af66f61b73210b5e95c99a734701d56bff Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 24 Jun 2025 11:27:54 +0200 Subject: [PATCH 13/24] . --- .../SourceGeneratorExtensions.cs | 36 +++++++------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs b/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs index 0cb96fb..ec40e40 100644 --- a/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs +++ b/src-extensions/CSharp.SourceGenerators.Extensions/SourceGeneratorExtensions.cs @@ -29,41 +29,41 @@ public static ExecuteResult Execute( IReadOnlyList? additionalTextPaths = null ) { - return ExecuteInternal(sourceGenerator, GetRandomAssemblyName(), sources, additionalTextPaths); + return Execute(sourceGenerator, GetRandomAssemblyName(), sources, additionalTextPaths); } /// - /// Executes and runs the specified . + /// Executes and runs the specified . /// /// The SourceGenerator to execute. + /// The assembly name. /// Provide a list of sources which need to be analyzed and processed. /// A list of additional files. /// public static ExecuteResult Execute( - this IIncrementalGenerator sourceGenerator, + this ISourceGenerator sourceGenerator, + string assemblyName, IReadOnlyList sources, IReadOnlyList? additionalTextPaths = null ) { - return ExecuteInternal(sourceGenerator, GetRandomAssemblyName(), sources, additionalTextPaths); + return ExecuteInternal(() => CSharpGeneratorDriver.Create(sourceGenerator), assemblyName, sources, additionalTextPaths); } /// - /// Executes and runs the specified . + /// Executes and runs the specified . /// /// The SourceGenerator to execute. - /// The assembly name. /// Provide a list of sources which need to be analyzed and processed. /// A list of additional files. /// public static ExecuteResult Execute( - this ISourceGenerator sourceGenerator, - string assemblyName, + this IIncrementalGenerator sourceGenerator, IReadOnlyList sources, IReadOnlyList? additionalTextPaths = null ) { - return ExecuteInternal(sourceGenerator, assemblyName, sources, additionalTextPaths); + return Execute(sourceGenerator, GetRandomAssemblyName(), sources, additionalTextPaths); } /// @@ -81,29 +81,17 @@ public static ExecuteResult Execute( IReadOnlyList? additionalTextPaths = null ) { - return ExecuteInternal(sourceGenerator, assemblyName, sources, additionalTextPaths); + return ExecuteInternal(() => CSharpGeneratorDriver.Create(sourceGenerator), assemblyName, sources, additionalTextPaths); } private static ExecuteResult ExecuteInternal( - object generator, + Func driverFactory, string assemblyName, IReadOnlyList sources, IReadOnlyList? additionalTextPaths = null ) { - GeneratorDriver driver; - if (generator is IIncrementalGenerator incrementalGenerator) - { - driver = CSharpGeneratorDriver.Create(incrementalGenerator); - } - else if (generator is ISourceGenerator sourceGenerator) - { - driver = CSharpGeneratorDriver.Create(sourceGenerator); - } - else - { - throw new NotSupportedException(); - } + var driver = driverFactory(); var metadataReferences = AppDomain.CurrentDomain.GetAssemblies() .Where(a => !a.IsDynamic) From 064fa8c62b80986e1f834d3c6c0e77025b871071 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 24 Jun 2025 12:15:27 +0200 Subject: [PATCH 14/24] c --- src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs b/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs index 07bb5e1..cc2173b 100644 --- a/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs +++ b/src/FluentBuilderGenerator/FluentBuilderSourceGenerator.cs @@ -41,9 +41,9 @@ public void Initialize(IncrementalGeneratorInitializationContext context) var compilationHelperProvider = context.CompilationProvider.Select(static (compilation, _) => new CompilationHelper(compilation)); - var commonProvider = languageDataProvider.Combine(compilationHelperProvider); + var combinedProvider = languageDataProvider.Combine(compilationHelperProvider); - context.RegisterSourceOutput(commonProvider, static (SourceProductionContext spc, (LanguageData LanguageData, CompilationHelper CompilationHelper) x) => + context.RegisterSourceOutput(combinedProvider, static (SourceProductionContext spc, (LanguageData LanguageData, CompilationHelper CompilationHelper) x) => { var assemblyName = x.CompilationHelper.AssemblyName; var supportsNullable = x.LanguageData.SupportsNullable; @@ -80,7 +80,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) ) .Collect(); - var combined2 = fluentBuilderClassesProvider.Combine(commonProvider).Select((x, _) => new + var combined2 = fluentBuilderClassesProvider.Combine(combinedProvider).Select((x, _) => new { Items = x.Left, LanguageData = x.Right.Left, From c9664cec5ac82e873d5106f966921c24c3771dc4 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 24 Jun 2025 13:29:19 +0200 Subject: [PATCH 15/24] 2 --- .../BuilderConsumerNET6_ViaNuGet.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-examples/BuilderConsumerNET6_ViaNuGet/BuilderConsumerNET6_ViaNuGet.csproj b/src-examples/BuilderConsumerNET6_ViaNuGet/BuilderConsumerNET6_ViaNuGet.csproj index a804dfd..c1acec2 100644 --- a/src-examples/BuilderConsumerNET6_ViaNuGet/BuilderConsumerNET6_ViaNuGet.csproj +++ b/src-examples/BuilderConsumerNET6_ViaNuGet/BuilderConsumerNET6_ViaNuGet.csproj @@ -10,7 +10,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive From aec228a78ed981cfb4745bb9d4b202dc320c1b62 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 26 Jun 2025 12:37:18 +0200 Subject: [PATCH 16/24] 11 --- ...uilderGeneratorTests.DTO.ClassWithInitPropertiesBuilder.g.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithInitPropertiesBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithInitPropertiesBuilder.g.cs index 10ffc84..d0062c0 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithInitPropertiesBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithInitPropertiesBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.10.0.1 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. From c25dce29a22a83a824ba161c11175f31f76f9454 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 26 Jun 2025 12:55:10 +0200 Subject: [PATCH 17/24] [] --- .../FluentBuilderSourceGeneratorTests.cs | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs index a0e4cef..5f9d797 100644 --- a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs +++ b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs @@ -7,6 +7,7 @@ using CSharp.SourceGenerators.Extensions.Models; using FluentBuilderGenerator; using FluentBuilderGeneratorTests.DTO; +using Microsoft.CodeAnalysis; using VerifyTests; using VerifyXunit; using Xunit; @@ -41,9 +42,10 @@ public void GenerateFiles_ForClassWithPrivateBuilderClass_ShouldReturnDiagnostic Path = path, Text = File.ReadAllText(path) }; + IIncrementalGenerator sut = new FluentBuilderSourceGenerator(); // Act - var result = _sut.Execute(Namespace, [sourceFile]); + var result = sut.Execute(Namespace, [sourceFile]); // Assert result.InformationMessages.Should().HaveCount(1); @@ -67,7 +69,7 @@ public Task GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_Error }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Files.Should().HaveCount(NumFiles); @@ -91,7 +93,7 @@ public void GenerateFiles_ForAClassWithPublicParameterlessConstructors_Should_Ge }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Valid.Should().BeTrue(); @@ -122,7 +124,7 @@ public void GenerateFiles_ForAClassWithOnlyParameterizedConstructors_Should_Gene }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Valid.Should().BeTrue(); @@ -197,7 +199,7 @@ public void GenerateFiles_For2Classes_Should_GenerateCorrectFiles() }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFileUser, sourceFileBuilder }); + var result = _sut.Execute(Namespace, [sourceFileUser, sourceFileBuilder]); // Assert result.Valid.Should().BeTrue(); @@ -300,7 +302,7 @@ public void GenerateFiles_ClassWithPrivateSetter_And_AccessibilityPublicAndPriva }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Valid.Should().BeTrue(); @@ -337,7 +339,7 @@ public void GenerateFiles_ClassWithPrivateSetter_And_AccessibilityPublic_Should_ }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Valid.Should().BeTrue(); @@ -371,7 +373,7 @@ public Task GenerateFiles_ClassWithFluentBuilderIgnore_Should_GenerateCorrectFil }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Valid.Should().BeTrue(); @@ -395,7 +397,7 @@ public Task GenerateFiles_ForSimpleClass_MethodsIsWithOnly_Should_GenerateCorrec }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Valid.Should().BeTrue(); @@ -423,7 +425,7 @@ public Task GenerateFiles_ForSimpleClass_MethodsIsWithAndWithout_Should_Generate }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Valid.Should().BeTrue(); @@ -471,7 +473,7 @@ public void GenerateFiles_ForClassWithArrayAndDictionaryProperty_Should_Generate }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Valid.Should().BeTrue(); @@ -503,7 +505,7 @@ public void GenerateFiles_For1GenericClass_Should_GenerateCorrectFiles() }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Valid.Should().BeTrue(); @@ -533,7 +535,7 @@ public void GenerateFiles_For1GenericClassTT_Should_GenerateCorrectFiles() }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Valid.Should().BeTrue(); @@ -573,7 +575,7 @@ public void GenerateFiles_For2GenericClasses_Should_GenerateCorrectFiles() }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile1, sourceFile2 }); + var result = _sut.Execute(Namespace, [sourceFile1, sourceFile2]); // Assert result.Valid.Should().BeTrue(); @@ -619,7 +621,7 @@ public void GenerateFiles_For2GenericClasses_WithDefaultConstructor_Should_Gener }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile1, sourceFile2 }); + var result = _sut.Execute(Namespace, [sourceFile1, sourceFile2]); // Assert result.Valid.Should().BeTrue(); @@ -649,7 +651,7 @@ public void GenerateFiles_ClassWithReferenceToItself_Should_GenerateCorrectFiles }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Valid.Should().BeTrue(); @@ -679,7 +681,7 @@ public void GenerateFiles_ClassWithFuncAndAction_Should_GenerateCorrectFiles() }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Valid.Should().BeTrue(); @@ -709,7 +711,7 @@ public void GenerateFiles_ClassWithPropertyWhichHasAValue_Should_GenerateCorrect }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFile }); + var result = _sut.Execute(Namespace, [sourceFile]); // Assert result.Valid.Should().BeTrue(); @@ -785,7 +787,7 @@ public void GenerateFiles_For2ClassesWithListBuilder_Should_GenerateCorrectFiles }; // Act - var result = _sut.Execute(Namespace, new[] { sourceFileTest, sourceFileOther }); + var result = _sut.Execute(Namespace, [sourceFileTest, sourceFileOther]); // Assert result.Valid.Should().BeTrue(); @@ -813,8 +815,7 @@ public void GenerateFiles_ClassWithInitProperties_Should_GenerateCorrectFiles() Text = File.ReadAllText(path), AttributeToAddToClass = new ExtraAttribute { - Name = "FluentBuilder.AutoGenerateBuilder", - //ArgumentList = new[] { "FluentBuilderAccessibility.PublicAndPrivate" } + Name = "FluentBuilder.AutoGenerateBuilder" } }; From 0c7054f1df024841d332ba6e88713c9707065344 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 23 Aug 2025 12:05:01 +0200 Subject: [PATCH 18/24] build and test --- .github/workflows/BuildAndTest.yml | 31 +++++++++++++++++++ FluentBuilder Solution.sln | 1 + .../BuilderConsumerFileScopedNamespace.csproj | 4 +-- src-examples/BuilderConsumerNET45/Program.cs | 2 +- .../BuilderConsumerNET72.csproj | 2 +- .../BuilderConsumerNET8_ViaNuGet.csproj | 2 +- 6 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/BuildAndTest.yml diff --git a/.github/workflows/BuildAndTest.yml b/.github/workflows/BuildAndTest.yml new file mode 100644 index 0000000..53208e8 --- /dev/null +++ b/.github/workflows/BuildAndTest.yml @@ -0,0 +1,31 @@ +name: Build and Test + +on: + pull_request: + branches: + - '**' + push: + branches: + - 'main' + +jobs: + build-and-test: + name: Build and Test on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-2022] + + steps: + - uses: actions/checkout@v4 + + - name: Setup .NET 8 SDK + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: 'Build' + run: dotnet build ./FluentBuilder Solution.sln -c Release + + - name: 'Test' + run: dotnet test ./tests/FluentBuilderGeneratorTests/FluentBuilderGeneratorTests.csproj --no-build -c Release \ No newline at end of file diff --git a/FluentBuilder Solution.sln b/FluentBuilder Solution.sln index 08f6784..07eea4b 100644 --- a/FluentBuilder Solution.sln +++ b/FluentBuilder Solution.sln @@ -46,6 +46,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BuilderConsumerFileScopedNa EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GitHub Actions", "GitHub Actions", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" ProjectSection(SolutionItems) = preProject + .github\workflows\BuildAndTest.yml = .github\workflows\BuildAndTest.yml .github\workflows\CreateRelease.yml = .github\workflows\CreateRelease.yml EndProjectSection EndProject diff --git a/src-examples/BuilderConsumerFileScopedNamespace/BuilderConsumerFileScopedNamespace.csproj b/src-examples/BuilderConsumerFileScopedNamespace/BuilderConsumerFileScopedNamespace.csproj index d4efa64..285d5de 100644 --- a/src-examples/BuilderConsumerFileScopedNamespace/BuilderConsumerFileScopedNamespace.csproj +++ b/src-examples/BuilderConsumerFileScopedNamespace/BuilderConsumerFileScopedNamespace.csproj @@ -12,8 +12,8 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src-examples/BuilderConsumerNET45/Program.cs b/src-examples/BuilderConsumerNET45/Program.cs index c72526b..e92b991 100644 --- a/src-examples/BuilderConsumerNET45/Program.cs +++ b/src-examples/BuilderConsumerNET45/Program.cs @@ -14,7 +14,7 @@ static void Main(string[] args) Console.WriteLine("t0 = " + JsonConvert.SerializeObject(t0)); var t1 = new ThingWithOnlyParameterizedConstructorsBuilder() - .WithConstructor(1,2,"xxx") + .UsingConstructor(1,2,"xxx") .Build(); Console.WriteLine("t1 = " + JsonConvert.SerializeObject(t1)); diff --git a/src-examples/BuilderConsumerNET72/BuilderConsumerNET72.csproj b/src-examples/BuilderConsumerNET72/BuilderConsumerNET72.csproj index 65f4ae0..c7eaa31 100644 --- a/src-examples/BuilderConsumerNET72/BuilderConsumerNET72.csproj +++ b/src-examples/BuilderConsumerNET72/BuilderConsumerNET72.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/src-examples/BuilderConsumerNET8_ViaNuGet/BuilderConsumerNET8_ViaNuGet.csproj b/src-examples/BuilderConsumerNET8_ViaNuGet/BuilderConsumerNET8_ViaNuGet.csproj index 7e9a32e..8017749 100644 --- a/src-examples/BuilderConsumerNET8_ViaNuGet/BuilderConsumerNET8_ViaNuGet.csproj +++ b/src-examples/BuilderConsumerNET8_ViaNuGet/BuilderConsumerNET8_ViaNuGet.csproj @@ -10,7 +10,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive From ff3f180f5beb275ec4fb3818af7f783c920dbb96 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 23 Aug 2025 12:06:38 +0200 Subject: [PATCH 19/24] " --- .github/workflows/BuildAndTest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/BuildAndTest.yml b/.github/workflows/BuildAndTest.yml index 53208e8..db86bae 100644 --- a/.github/workflows/BuildAndTest.yml +++ b/.github/workflows/BuildAndTest.yml @@ -25,7 +25,7 @@ jobs: dotnet-version: '8.0.x' - name: 'Build' - run: dotnet build ./FluentBuilder Solution.sln -c Release + run: dotnet build "./FluentBuilder Solution.sln" -c Release - name: 'Test' run: dotnet test ./tests/FluentBuilderGeneratorTests/FluentBuilderGeneratorTests.csproj --no-build -c Release \ No newline at end of file From bd921549a33bd33818ba293e2e12a0e9a5a71bed Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 23 Aug 2025 12:29:08 +0200 Subject: [PATCH 20/24] . --- FluentBuilder Solution.sln.DotSettings | 2 ++ .../CSharp.SourceGenerators.Extensions.csproj | 4 ++-- src/FluentBuilderGenerator/AnalyzerReleases.Shipped.md | 3 +++ .../AnalyzerReleases.Unshipped.md | 10 ++++++++++ .../Constants/DiagnosticDescriptors.cs | 8 ++++---- .../FluentBuilderGenerator.csproj | 9 +++++---- .../Helpers/DefaultValueHelper.cs | 6 +++--- .../AutoGenerateBuilderSyntaxReceiver.cs | 4 ++-- 8 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 src/FluentBuilderGenerator/AnalyzerReleases.Shipped.md create mode 100644 src/FluentBuilderGenerator/AnalyzerReleases.Unshipped.md diff --git a/FluentBuilder Solution.sln.DotSettings b/FluentBuilder Solution.sln.DotSettings index d197dba..74a6126 100644 --- a/FluentBuilder Solution.sln.DotSettings +++ b/FluentBuilder Solution.sln.DotSettings @@ -1,4 +1,6 @@  + True + True True True True diff --git a/src-extensions/CSharp.SourceGenerators.Extensions/CSharp.SourceGenerators.Extensions.csproj b/src-extensions/CSharp.SourceGenerators.Extensions/CSharp.SourceGenerators.Extensions.csproj index fc08acb..01bb368 100644 --- a/src-extensions/CSharp.SourceGenerators.Extensions/CSharp.SourceGenerators.Extensions.csproj +++ b/src-extensions/CSharp.SourceGenerators.Extensions/CSharp.SourceGenerators.Extensions.csproj @@ -27,8 +27,8 @@ - - + + \ No newline at end of file diff --git a/src/FluentBuilderGenerator/AnalyzerReleases.Shipped.md b/src/FluentBuilderGenerator/AnalyzerReleases.Shipped.md new file mode 100644 index 0000000..2080dcd --- /dev/null +++ b/src/FluentBuilderGenerator/AnalyzerReleases.Shipped.md @@ -0,0 +1,3 @@ +; Shipped analyzer releases +; https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/Microsoft.CodeAnalysis.Analyzers/ReleaseTrackingAnalyzers.Help.md + diff --git a/src/FluentBuilderGenerator/AnalyzerReleases.Unshipped.md b/src/FluentBuilderGenerator/AnalyzerReleases.Unshipped.md new file mode 100644 index 0000000..418950c --- /dev/null +++ b/src/FluentBuilderGenerator/AnalyzerReleases.Unshipped.md @@ -0,0 +1,10 @@ +; Unshipped analyzer release +; https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/Microsoft.CodeAnalysis.Analyzers/ReleaseTrackingAnalyzers.Help.md + +### New Rules + +Rule ID | Category | Severity | Notes +--------|----------|----------|------- +FBGERR0001 | FluentBuilderGenerator | Error | DiagnosticDescriptors +FBGINF0001 | FluentBuilderGenerator | Info | DiagnosticDescriptors +FBGINF0002 | FluentBuilderGenerator | Info | DiagnosticDescriptors \ No newline at end of file diff --git a/src/FluentBuilderGenerator/Constants/DiagnosticDescriptors.cs b/src/FluentBuilderGenerator/Constants/DiagnosticDescriptors.cs index 1895ac3..42afe16 100644 --- a/src/FluentBuilderGenerator/Constants/DiagnosticDescriptors.cs +++ b/src/FluentBuilderGenerator/Constants/DiagnosticDescriptors.cs @@ -5,7 +5,7 @@ namespace FluentBuilderGenerator.Constants; internal static class DiagnosticDescriptors { internal static readonly DiagnosticDescriptor Error = new( - "SGERR0001", + "FBGERR0001", "Source generator exception", "An exception occurred during source generation: {0}", nameof(FluentBuilderGenerator), @@ -14,8 +14,8 @@ internal static class DiagnosticDescriptors "An unhandled exception occurred while generating source code." ); - internal static readonly DiagnosticDescriptor ClassModifierShouldBeInternalOrPublic = new( - "SGINF0001", + internal static readonly DiagnosticDescriptor ClassOrRecordModifierShouldBeInternalOrPublic = new( + "FBGINF0001", "Information", "Class or Record modifier should be 'public' or 'internal'", nameof(FluentBuilderGenerator), @@ -24,7 +24,7 @@ internal static class DiagnosticDescriptors ); internal static readonly DiagnosticDescriptor CustomBuilderClassModifierShouldBePartialAndInternalOrPublic = new( - "SGINF0002", + "FBGINF0002", "Information", "Custom builder class should be 'partial' and 'public' or 'internal'", nameof(FluentBuilderGenerator), diff --git a/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj b/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj index baa87b5..36abfa4 100644 --- a/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj +++ b/src/FluentBuilderGenerator/FluentBuilderGenerator.csproj @@ -1,7 +1,7 @@ - + - 0.11.0 + 0.12.0 netstandard2.0 latest true @@ -28,6 +28,7 @@ true enable Debug;Release;DebugAttach + true @@ -52,11 +53,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/FluentBuilderGenerator/Helpers/DefaultValueHelper.cs b/src/FluentBuilderGenerator/Helpers/DefaultValueHelper.cs index 8f73587..37db62b 100644 --- a/src/FluentBuilderGenerator/Helpers/DefaultValueHelper.cs +++ b/src/FluentBuilderGenerator/Helpers/DefaultValueHelper.cs @@ -8,7 +8,7 @@ namespace FluentBuilderGenerator.Helpers; internal static class DefaultValueHelper { - private static readonly SyntaxKind[] ExcludedSyntaxKinds = { SyntaxKind.SuppressNullableWarningExpression }; + private static readonly SyntaxKind[] ExcludedSyntaxKinds = [SyntaxKind.SuppressNullableWarningExpression]; /// /// Check if the has a value set, in that case try to get that value and return it, and return the usings. @@ -26,9 +26,9 @@ internal static (string DefaultValue, IReadOnlyList? ExtraUsings) GetDef if (propertyDeclarationSyntax?.Initializer != null && !ExcludedSyntaxKinds.Contains(propertyDeclarationSyntax.Initializer.Value.Kind())) { - var thisUsings = rootSyntaxNode.FindDescendantNodes().Select(ud => ud.Name.ToString()); + var thisUsings = rootSyntaxNode.FindDescendantNodes().Select(ud => ud.Name?.ToString()).OfType(); - var ancestorUsings = rootSyntaxNode.GetAncestorsUsings().Select(ud => ud.Name.ToString()); + var ancestorUsings = rootSyntaxNode.GetAncestorsUsings().Select(ud => ud.Name?.ToString()).OfType(); var extraUsings = thisUsings.Union(ancestorUsings).Distinct().ToList(); diff --git a/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs b/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs index 80cc48c..c6f68e8 100644 --- a/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs +++ b/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs @@ -43,7 +43,7 @@ public static bool CheckSyntaxNode(SyntaxNode syntaxNode, out Diagnostic? diagno if (!TryGetModifier(typeDeclarationSyntax, out _)) { - diagnostic = Diagnostic.Create(DiagnosticDescriptors.ClassModifierShouldBeInternalOrPublic, typeDeclarationSyntax.GetLocation()); + diagnostic = Diagnostic.Create(DiagnosticDescriptors.ClassOrRecordModifierShouldBeInternalOrPublic, typeDeclarationSyntax.GetLocation()); return false; } @@ -70,7 +70,7 @@ private static bool TryGet(TypeDeclarationSyntax typeDeclarationSyntax, Semantic if (!TryGetModifier(typeDeclarationSyntax, out var modifier)) { - diagnostic = Diagnostic.Create(DiagnosticDescriptors.ClassModifierShouldBeInternalOrPublic, typeDeclarationSyntax.GetLocation()); + diagnostic = Diagnostic.Create(DiagnosticDescriptors.ClassOrRecordModifierShouldBeInternalOrPublic, typeDeclarationSyntax.GetLocation()); return false; } From 78666ecf451b943b8fd34d00399a187bcbf58c14 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 23 Aug 2025 12:33:39 +0200 Subject: [PATCH 21/24] tst --- ...amespace.ClassOnOtherNamespaceBuilder.g.cs | 2 +- ...ce.ClassOnOtherNamespace_IListBuilder.g.cs | 2 +- ...lderGeneratorTests.DTO.AddressBuilder.g.cs | 2 +- ...neratorTests.DTO.Address_ArrayBuilder.g.cs | 2 +- ...rTests.DTO.Address_ICollectionBuilder.g.cs | 2 +- ...rTests.DTO.Address_IEnumerableBuilder.g.cs | 2 +- ...neratorTests.DTO.Address_IListBuilder.g.cs | 2 +- ...TO.Address_IReadOnlyCollectionBuilder.g.cs | 2 +- ...ests.DTO.Address_IReadOnlyListBuilder.g.cs | 2 +- .../DTO/FluentBuilder.ArrayBuilder.g.cs | 2 +- .../DTO/FluentBuilder.BaseBuilder.g.cs | 2 +- .../DTO/FluentBuilder.Extra.g.cs | 2 +- .../DTO/FluentBuilder.ICollectionBuilder.g.cs | 2 +- .../DTO/FluentBuilder.IDictionaryBuilder.g.cs | 2 +- .../DTO/FluentBuilder.IEnumerableBuilder.g.cs | 2 +- .../DTO/FluentBuilder.IListBuilder.g.cs | 2 +- ...entBuilder.IReadOnlyCollectionBuilder.g.cs | 2 +- .../FluentBuilder.IReadOnlyListBuilder.g.cs | 2 +- ...rGeneratorTests.DTO.AddressBuilder_T_.g.cs | 2 +- ...atorTests.DTO.AddressTTBuilder_T1_T2_.g.cs | 2 +- ...sts.DTO.ClassWithFuncAndActionBuilder.g.cs | 2 +- ...ts.DTO.ClassWithInitPropertiesBuilder.g.cs | 2 +- ...TO.ClassWithPrimaryConstructorBuilder.g.cs | 2 +- ...ts.DTO.ClassWithPrivateSetter1Builder.g.cs | 2 +- ...ts.DTO.ClassWithPrivateSetter2Builder.g.cs | 2 +- ....DTO.ClassWithPropertyValueSetBuilder.g.cs | 2 +- ...neratorTests.DTO.InternalClassBuilder.g.cs | 2 +- ...eneratorTests.DTO.MyDummyClassBuilder.g.cs | 2 +- ...ratorTests.DTO.MyInternalClassBuilder.g.cs | 2 +- ...O.RecordWithPrimaryConstructorBuilder.g.cs | 2 +- ...BuilderGeneratorTests.DTO.TestBuilder.g.cs | 2 +- ...uilderGeneratorTests.DTO.ThingBuilder.g.cs | 2 +- ...BuilderGeneratorTests.DTO.UserBuilder.g.cs | 2 +- ...derGeneratorTests.DTO.UserTBuilder_T_.g.cs | 2 +- ...rTWithAddressAndConstructorBuilder_T_.g.cs | 2 +- ...Tests.DTO.UserTWithAddressTBuilder_T_.g.cs | 2 +- ...eneratorTests.DTO.Option_IListBuilder.g.cs | 2 +- ...erGeneratorTests.DTO2.MyOptionBuilder.g.cs | 2 +- ...e_Should_GenerateCorrectFiles.verified.txt | 2 +- ...uctor_Should_Create_ErrorFile.verified.txt | 27 ------------------- ...t_Should_GenerateCorrectFiles.verified.txt | 2 +- ...y_Should_GenerateCorrectFiles.verified.txt | 2 +- .../FluentBuilderSourceGeneratorTests.cs | 7 ++--- 43 files changed, 43 insertions(+), 73 deletions(-) delete mode 100644 tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile.verified.txt diff --git a/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespaceBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespaceBuilder.g.cs index 9aec061..b771389 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespaceBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespaceBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespace_IListBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespace_IListBuilder.g.cs index a555ce8..ef7aea3 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespace_IListBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/AbcTest.OtherNamespace.ClassOnOtherNamespace_IListBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.AddressBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.AddressBuilder.g.cs index 4fdc483..f4830fe 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.AddressBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.AddressBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ArrayBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ArrayBuilder.g.cs index 0239cba..27a4646 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ArrayBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ArrayBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ICollectionBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ICollectionBuilder.g.cs index 89e254e..6a3cd65 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ICollectionBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_ICollectionBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IEnumerableBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IEnumerableBuilder.g.cs index 98cb2c5..66b4b07 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IEnumerableBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IEnumerableBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IListBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IListBuilder.g.cs index ad072c4..08f5f32 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IListBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IListBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyCollectionBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyCollectionBuilder.g.cs index 786f164..0c07284 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyCollectionBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyCollectionBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyListBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyListBuilder.g.cs index ac05e71..38d1df8 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyListBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/BuilderGeneratorTests.DTO.Address_IReadOnlyListBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ArrayBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ArrayBuilder.g.cs index 0948134..d9d3afd 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ArrayBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ArrayBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.BaseBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.BaseBuilder.g.cs index 6e3ee3c..dc5009b 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.BaseBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.BaseBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.Extra.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.Extra.g.cs index aa824ee..4c9ee5e 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.Extra.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.Extra.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ICollectionBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ICollectionBuilder.g.cs index 7c7e7d0..30fd5a9 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ICollectionBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.ICollectionBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IDictionaryBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IDictionaryBuilder.g.cs index b2ef15c..f70deaa 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IDictionaryBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IDictionaryBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IEnumerableBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IEnumerableBuilder.g.cs index 46a1bce..b3adba9 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IEnumerableBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IEnumerableBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IListBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IListBuilder.g.cs index ff8b9cc..fef14f7 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IListBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IListBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyCollectionBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyCollectionBuilder.g.cs index 89dd673..b0097ea 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyCollectionBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyCollectionBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyListBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyListBuilder.g.cs index 686fff7..bb1717b 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyListBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilder.IReadOnlyListBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressBuilder_T_.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressBuilder_T_.g.cs index cad11dc..f239bc9 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressBuilder_T_.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressBuilder_T_.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressTTBuilder_T1_T2_.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressTTBuilder_T1_T2_.g.cs index 1bf5b6b..1c447bc 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressTTBuilder_T1_T2_.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.AddressTTBuilder_T1_T2_.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithFuncAndActionBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithFuncAndActionBuilder.g.cs index 77fc406..47b073d 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithFuncAndActionBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithFuncAndActionBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithInitPropertiesBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithInitPropertiesBuilder.g.cs index d0062c0..e35c965 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithInitPropertiesBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithInitPropertiesBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrimaryConstructorBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrimaryConstructorBuilder.g.cs index 1bd03f4..63b33a8 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrimaryConstructorBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrimaryConstructorBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter1Builder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter1Builder.g.cs index 9233fc2..7b66466 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter1Builder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter1Builder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter2Builder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter2Builder.g.cs index 454b978..7f6d049 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter2Builder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPrivateSetter2Builder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPropertyValueSetBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPropertyValueSetBuilder.g.cs index cf36e8a..fd87873 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPropertyValueSetBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ClassWithPropertyValueSetBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.InternalClassBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.InternalClassBuilder.g.cs index 7c8158b..2635b25 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.InternalClassBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.InternalClassBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyDummyClassBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyDummyClassBuilder.g.cs index 0247e04..928adf6 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyDummyClassBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyDummyClassBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyInternalClassBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyInternalClassBuilder.g.cs index e777e50..d8d31d1 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyInternalClassBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.MyInternalClassBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.RecordWithPrimaryConstructorBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.RecordWithPrimaryConstructorBuilder.g.cs index 2ced2b2..17f3ac3 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.RecordWithPrimaryConstructorBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.RecordWithPrimaryConstructorBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.TestBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.TestBuilder.g.cs index 455ac51..ba78426 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.TestBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.TestBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ThingBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ThingBuilder.g.cs index 633710f..f7c7738 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ThingBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.ThingBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserBuilder.g.cs index f9fc878..dfb8723 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTBuilder_T_.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTBuilder_T_.g.cs index 0949f30..a79e4ad 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTBuilder_T_.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTBuilder_T_.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressAndConstructorBuilder_T_.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressAndConstructorBuilder_T_.g.cs index 2d85ade..f65b4ee 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressAndConstructorBuilder_T_.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressAndConstructorBuilder_T_.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressTBuilder_T_.g.cs b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressTBuilder_T_.g.cs index 005dd74..4edc14b 100644 --- a/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressTBuilder_T_.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO/FluentBuilderGeneratorTests.DTO.UserTWithAddressTBuilder_T_.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO.Option_IListBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO.Option_IListBuilder.g.cs index d6acb27..845c4f0 100644 --- a/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO.Option_IListBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO.Option_IListBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO2.MyOptionBuilder.g.cs b/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO2.MyOptionBuilder.g.cs index 676181f..d64e9ff 100644 --- a/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO2.MyOptionBuilder.g.cs +++ b/tests/FluentBuilderGeneratorTests/DTO2/FluentBuilderGeneratorTests.DTO2.MyOptionBuilder.g.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ClassWithFluentBuilderIgnore_Should_GenerateCorrectFiles.verified.txt b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ClassWithFluentBuilderIgnore_Should_GenerateCorrectFiles.verified.txt index 9c83a6c..8fa5c48 100644 --- a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ClassWithFluentBuilderIgnore_Should_GenerateCorrectFiles.verified.txt +++ b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ClassWithFluentBuilderIgnore_Should_GenerateCorrectFiles.verified.txt @@ -3,7 +3,7 @@ Source: //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile.verified.txt b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile.verified.txt deleted file mode 100644 index 7b0bc8f..0000000 --- a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile.verified.txt +++ /dev/null @@ -1,27 +0,0 @@ -{ - HintName: Error.g.cs, - Source: -/* -FluentBuilderSourceGenerator - -[Exception] -System.NotSupportedException: Unable to generate a FluentBuilder for the class 'System.AppDomain' because no public constructor is defined. - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.CreateClassBuilderCode(FluentData fluentData, ClassSymbol classSymbol, List`1 allClassSymbols) in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 85 - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.<>c__DisplayClass7_0.b__1(ValueTuple`2 classSymbol) in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 56 - at System.Linq.Enumerable.SelectListIterator`2.MoveNext() - at System.Collections.Generic.HashSet`1.UnionWith(IEnumerable`1 other) - at System.Linq.Enumerable.UnionIterator`1.FillSet() - at System.Linq.Enumerable.UnionIterator`1.ToList() - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.GenerateFiles() in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 74 - at FluentBuilderGenerator.FluentBuilderSourceGenerator.<>c__DisplayClass0_0.b__6(SourceProductionContext sourceProductionContext, <>f__AnonymousType1`3 data) in {SolutionDirectory}src\FluentBuilderGenerator\FluentBuilderSourceGenerator.cs:line 101 - -[StackTrace] - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.CreateClassBuilderCode(FluentData fluentData, ClassSymbol classSymbol, List`1 allClassSymbols) in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 85 - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.<>c__DisplayClass7_0.b__1(ValueTuple`2 classSymbol) in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 56 - at System.Linq.Enumerable.SelectListIterator`2.MoveNext() - at System.Collections.Generic.HashSet`1.UnionWith(IEnumerable`1 other) - at System.Linq.Enumerable.UnionIterator`1.FillSet() - at System.Linq.Enumerable.UnionIterator`1.ToList() - at FluentBuilderGenerator.FileGenerators.FluentBuilderClassesGenerator.GenerateFiles() in {SolutionDirectory}src\FluentBuilderGenerator\FileGenerators\FluentBuilderClassesGenerator.cs:line 74 - at FluentBuilderGenerator.FluentBuilderSourceGenerator.<>c__DisplayClass0_0.b__6(SourceProductionContext sourceProductionContext, <>f__AnonymousType1`3 data) in {SolutionDirectory}src\FluentBuilderGenerator\FluentBuilderSourceGenerator.cs:line 101*/ -} \ No newline at end of file diff --git a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithAndWithout_Should_GenerateCorrectFiles.verified.txt b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithAndWithout_Should_GenerateCorrectFiles.verified.txt index 9c83a6c..8fa5c48 100644 --- a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithAndWithout_Should_GenerateCorrectFiles.verified.txt +++ b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithAndWithout_Should_GenerateCorrectFiles.verified.txt @@ -3,7 +3,7 @@ Source: //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithOnly_Should_GenerateCorrectFiles.verified.txt b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithOnly_Should_GenerateCorrectFiles.verified.txt index 9c83a6c..8fa5c48 100644 --- a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithOnly_Should_GenerateCorrectFiles.verified.txt +++ b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.GenerateFiles_ForSimpleClass_MethodsIsWithOnly_Should_GenerateCorrectFiles.verified.txt @@ -3,7 +3,7 @@ Source: //------------------------------------------------------------------------------ // -// This code was generated by https://github.com/StefH/FluentBuilder version 0.11.0.0 +// This code was generated by https://github.com/StefH/FluentBuilder version 0.12.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs index f0705d0..39af48e 100644 --- a/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs +++ b/tests/FluentBuilderGeneratorTests/FluentBuilderSourceGeneratorTests.cs @@ -53,7 +53,7 @@ public void GenerateFiles_ForClassWithPrivateBuilderClass_ShouldReturnDiagnostic } [Fact] - public Task GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile() + public void GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_ErrorFile() { // Arrange var path = "./DTO2/MyAppDomainBuilder.cs"; @@ -74,10 +74,7 @@ public Task GenerateFiles_ForAClassWithoutAPublicConstructor_Should_Create_Error // Assert result.Files.Should().HaveCount(NumFiles); result.Files[NumFiles - 1].Path.Should().EndWith("Error.g.cs"); - - // Verify - var errorResult = result.GeneratorDriver.GetRunResult().Results.First().GeneratedSources.First(s => s.HintName.Contains("Error.g.cs")); - return Verifier.Verify(errorResult); + result.Files[NumFiles - 1].Text.Should().NotBeEmpty(); } [Fact] From ef00223492a5cf3ace6a5eab176b9cc03e21f357 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 23 Aug 2025 12:38:07 +0200 Subject: [PATCH 22/24] IIncrementalGenerator --- .../CSharp.SourceGenerators.Extensions.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-extensions/CSharp.SourceGenerators.Extensions/CSharp.SourceGenerators.Extensions.csproj b/src-extensions/CSharp.SourceGenerators.Extensions/CSharp.SourceGenerators.Extensions.csproj index 01bb368..d8c172f 100644 --- a/src-extensions/CSharp.SourceGenerators.Extensions/CSharp.SourceGenerators.Extensions.csproj +++ b/src-extensions/CSharp.SourceGenerators.Extensions/CSharp.SourceGenerators.Extensions.csproj @@ -6,7 +6,7 @@ latest enable Stef Heyenrath - Some extensions for a ISourceGenerator which can be used to execute a SourceGenerator manually which makes unit-testing easy. + Some extensions for a ISourceGenerator and IIncrementalGenerator which can be used to execute a SourceGenerator manually which makes unit-testing easy. CSharp;SourceGenerator;SourceGenerators;Extensions;Execute;UnitTest;Test icon.png MIT From d6cf45e52a3449b3a61355883906c531d63eff6d Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 23 Aug 2025 12:42:32 +0200 Subject: [PATCH 23/24] mv --- .../Interfaces/IPropertyOrParameterSymbol.cs | 7 ------- .../Models/PropertyOrParameterSymbol.cs | 12 ++++++++++++ 2 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 src/FluentBuilderGenerator/Models/PropertyOrParameterSymbol.cs diff --git a/src/FluentBuilderGenerator/Interfaces/IPropertyOrParameterSymbol.cs b/src/FluentBuilderGenerator/Interfaces/IPropertyOrParameterSymbol.cs index 62a7dea..19f2902 100644 --- a/src/FluentBuilderGenerator/Interfaces/IPropertyOrParameterSymbol.cs +++ b/src/FluentBuilderGenerator/Interfaces/IPropertyOrParameterSymbol.cs @@ -14,11 +14,4 @@ internal interface IPropertyOrParameterSymbol ITypeSymbol Type { get; } bool ExcludeFromIsSetLogic { get; } -} - -internal record PropertyOrParameterSymbol(ISymbol Symbol, ITypeSymbol Type, bool ExcludeFromIsSetLogic) : IPropertyOrParameterSymbol -{ - public PropertyType PropertyType => Symbol is IPropertySymbol ? PropertyType.Property : PropertyType.Parameter; - - public string Name => Symbol.Name; } \ No newline at end of file diff --git a/src/FluentBuilderGenerator/Models/PropertyOrParameterSymbol.cs b/src/FluentBuilderGenerator/Models/PropertyOrParameterSymbol.cs new file mode 100644 index 0000000..17f1f93 --- /dev/null +++ b/src/FluentBuilderGenerator/Models/PropertyOrParameterSymbol.cs @@ -0,0 +1,12 @@ +using FluentBuilderGenerator.Interfaces; +using FluentBuilderGenerator.Types; +using Microsoft.CodeAnalysis; + +namespace FluentBuilderGenerator.Models; + +internal record PropertyOrParameterSymbol(ISymbol Symbol, ITypeSymbol Type, bool ExcludeFromIsSetLogic) : IPropertyOrParameterSymbol +{ + public PropertyType PropertyType => Symbol is IPropertySymbol ? PropertyType.Property : PropertyType.Parameter; + + public string Name => Symbol.Name; +} \ No newline at end of file From 65cadbbdb5d2fabd336951fda5196b09681b36ca Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 23 Aug 2025 12:49:27 +0200 Subject: [PATCH 24/24] . --- .../Compatibility/IsExternalInit.cs | 1 + .../Compatibility/NullableAttributes.cs | 2 +- .../Extensions/PropertySymbolExtensions.cs | 4 +- .../Extensions/SymbolExtensions.cs | 4 +- .../Extensions/SyntaxNodeExtensions.cs | 7 ++-- .../TypeDeclarationSyntaxExtensions.cs | 12 +++--- .../FileGenerators/ExtraFilesGenerator.cs | 38 +++++++++---------- .../FluentBuilderClassesGenerator.cs | 4 +- .../Helpers/DefaultValueHelper.cs | 2 +- .../AttributeArgumentListParser.cs | 3 +- .../AutoGenerateBuilderSyntaxReceiver.cs | 2 +- 11 files changed, 39 insertions(+), 40 deletions(-) diff --git a/src/FluentBuilderGenerator/Compatibility/IsExternalInit.cs b/src/FluentBuilderGenerator/Compatibility/IsExternalInit.cs index ec49e6d..12b2b60 100644 --- a/src/FluentBuilderGenerator/Compatibility/IsExternalInit.cs +++ b/src/FluentBuilderGenerator/Compatibility/IsExternalInit.cs @@ -2,4 +2,5 @@ // ReSharper disable once CheckNamespace namespace System.Runtime.CompilerServices; +// ReSharper disable once RedundantTypeDeclarationBody internal class IsExternalInit { } \ No newline at end of file diff --git a/src/FluentBuilderGenerator/Compatibility/NullableAttributes.cs b/src/FluentBuilderGenerator/Compatibility/NullableAttributes.cs index a5fbb0e..066cbcb 100644 --- a/src/FluentBuilderGenerator/Compatibility/NullableAttributes.cs +++ b/src/FluentBuilderGenerator/Compatibility/NullableAttributes.cs @@ -4,7 +4,7 @@ namespace System.Diagnostics.CodeAnalysis; /// Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. -[AttributeUsage(AttributeTargets.Parameter, Inherited = false)] +[AttributeUsage(AttributeTargets.Parameter)] internal sealed class NotNullWhenAttribute : Attribute { /// Initializes the attribute with the specified return value condition. diff --git a/src/FluentBuilderGenerator/Extensions/PropertySymbolExtensions.cs b/src/FluentBuilderGenerator/Extensions/PropertySymbolExtensions.cs index fe7fc89..77f11ed 100644 --- a/src/FluentBuilderGenerator/Extensions/PropertySymbolExtensions.cs +++ b/src/FluentBuilderGenerator/Extensions/PropertySymbolExtensions.cs @@ -37,7 +37,7 @@ internal static bool TryGetIDictionaryElementTypes(this IPropertyOrParameterSymb if (type == FluentTypeKind.IDictionary && property.Type is INamedTypeSymbol namedTypeSymbol) { - if (namedTypeSymbol.IsGenericType && namedTypeSymbol.TypeArguments.Length == 2) + if (namedTypeSymbol is { IsGenericType: true, TypeArguments.Length: 2 }) { if (namedTypeSymbol.TypeArguments[0] is INamedTypeSymbol key && namedTypeSymbol.TypeArguments[1] is INamedTypeSymbol value) { @@ -47,7 +47,7 @@ internal static bool TryGetIDictionaryElementTypes(this IPropertyOrParameterSymb } } - tuple = default; + tuple = null; return false; } diff --git a/src/FluentBuilderGenerator/Extensions/SymbolExtensions.cs b/src/FluentBuilderGenerator/Extensions/SymbolExtensions.cs index a9a6630..12f6634 100644 --- a/src/FluentBuilderGenerator/Extensions/SymbolExtensions.cs +++ b/src/FluentBuilderGenerator/Extensions/SymbolExtensions.cs @@ -7,10 +7,10 @@ namespace FluentBuilderGenerator.Extensions; internal static class SymbolExtensions { private static readonly string[] ExcludedAttributes = - { + [ InternalClassNames.AsyncStateMachineAttribute , InternalClassNames.NullableAttribute - }; + ]; public static string GetDeterministicHashCodeAsString(this ISymbol symbol) { diff --git a/src/FluentBuilderGenerator/Extensions/SyntaxNodeExtensions.cs b/src/FluentBuilderGenerator/Extensions/SyntaxNodeExtensions.cs index adda0a9..75d5e7a 100644 --- a/src/FluentBuilderGenerator/Extensions/SyntaxNodeExtensions.cs +++ b/src/FluentBuilderGenerator/Extensions/SyntaxNodeExtensions.cs @@ -17,14 +17,13 @@ public static string GetNamespace(this SyntaxNode syntaxNode) { // If we don't have a namespace at all we'll return an empty string // This accounts for the "default namespace" case - string nameSpace = string.Empty; + var nameSpace = string.Empty; // Get the containing syntax node for the type declaration // (could be a nested type, for example) - SyntaxNode? potentialNamespaceParent = syntaxNode.Parent; + var potentialNamespaceParent = syntaxNode.Parent; - // Keep moving "out" of nested classes etc until we get to a namespace - // or until we run out of parents + // Keep moving "out" of nested classes until we get to a namespace or until we run out of parents while (potentialNamespaceParent != null && potentialNamespaceParent is not NamespaceDeclarationSyntax && potentialNamespaceParent is not FileScopedNamespaceDeclarationSyntax) diff --git a/src/FluentBuilderGenerator/Extensions/TypeDeclarationSyntaxExtensions.cs b/src/FluentBuilderGenerator/Extensions/TypeDeclarationSyntaxExtensions.cs index 680575a..3e9dd3b 100644 --- a/src/FluentBuilderGenerator/Extensions/TypeDeclarationSyntaxExtensions.cs +++ b/src/FluentBuilderGenerator/Extensions/TypeDeclarationSyntaxExtensions.cs @@ -8,9 +8,9 @@ namespace FluentBuilderGenerator.Extensions; /// internal static class TypeDeclarationSyntaxExtensions { - const char NESTED_CLASS_DELIMITER = '+'; - const char NAMESPACE_CLASS_DELIMITER = '.'; - const char TYPEPARAMETER_CLASS_DELIMITER = '`'; + private const char NestedClassDelimiter = '+'; + private const char NamespaceClassDelimiter = '.'; + private const char TypeparameterClassDelimiter = '`'; public static string GetMetadataName(this TypeDeclarationSyntax source) { @@ -31,14 +31,14 @@ public static string GetMetadataName(this TypeDeclarationSyntax source) var result = new StringBuilder(); for (var item = namespaces.First; item is not null; item = item.Next) { - result.Append(item.Value.Name).Append(NAMESPACE_CLASS_DELIMITER); + result.Append(item.Value.Name).Append(NamespaceClassDelimiter); } for (var item = types.First; item is not null; item = item.Next) { var type = item.Value; AppendName(result, type); - result.Append(NESTED_CLASS_DELIMITER); + result.Append(NestedClassDelimiter); } AppendName(result, source); @@ -51,7 +51,7 @@ private static void AppendName(StringBuilder builder, TypeDeclarationSyntax type var typeArguments = type.TypeParameterList?.ChildNodes().Count(node => node is TypeParameterSyntax) ?? 0; if (typeArguments != 0) { - builder.Append(TYPEPARAMETER_CLASS_DELIMITER).Append(typeArguments); + builder.Append(TypeparameterClassDelimiter).Append(typeArguments); } } } \ No newline at end of file diff --git a/src/FluentBuilderGenerator/FileGenerators/ExtraFilesGenerator.cs b/src/FluentBuilderGenerator/FileGenerators/ExtraFilesGenerator.cs index be816f8..f5f6931 100644 --- a/src/FluentBuilderGenerator/FileGenerators/ExtraFilesGenerator.cs +++ b/src/FluentBuilderGenerator/FileGenerators/ExtraFilesGenerator.cs @@ -82,42 +82,42 @@ public AutoGenerateBuilderAttribute(Type{_supportsNullable.IIf("?")} type, bool }} }}"; - var autoGenerateBuilderAttributeGeneric = $@"[AttributeUsage(AttributeTargets.Class)] + var autoGenerateBuilderAttributeGeneric = @"[AttributeUsage(AttributeTargets.Class)] internal sealed class AutoGenerateBuilderAttribute : Attribute where T : class - {{ - public Type Type {{ get; }} - public bool HandleBaseClasses {{ get; }} - public FluentBuilderAccessibility Accessibility {{ get; }} - public FluentBuilderMethods Methods {{ get; }} + { + public Type Type { get; } + public bool HandleBaseClasses { get; } + public FluentBuilderAccessibility Accessibility { get; } + public FluentBuilderMethods Methods { get; } public AutoGenerateBuilderAttribute() : this(true, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) - {{ - }} + { + } public AutoGenerateBuilderAttribute(bool handleBaseClasses) : this(handleBaseClasses, FluentBuilderAccessibility.Public, FluentBuilderMethods.WithOnly) - {{ - }} + { + } public AutoGenerateBuilderAttribute(FluentBuilderAccessibility accessibility) : this(true, accessibility, FluentBuilderMethods.WithOnly) - {{ - }} + { + } public AutoGenerateBuilderAttribute(bool handleBaseClasses, FluentBuilderAccessibility accessibility) : this(handleBaseClasses, accessibility, FluentBuilderMethods.WithOnly) - {{ - }} + { + } public AutoGenerateBuilderAttribute(bool handleBaseClasses, FluentBuilderMethods methods) : this(handleBaseClasses, FluentBuilderAccessibility.Public, methods) - {{ - }} + { + } public AutoGenerateBuilderAttribute(bool handleBaseClasses, FluentBuilderAccessibility accessibility, FluentBuilderMethods methods) - {{ + { Type = typeof(T); HandleBaseClasses = handleBaseClasses; Accessibility = accessibility; Methods = methods; - }} - }}"; + } + }"; return new FileData ( diff --git a/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.cs b/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.cs index 2453d12..57258d1 100644 --- a/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.cs +++ b/src/FluentBuilderGenerator/FileGenerators/FluentBuilderClassesGenerator.cs @@ -29,14 +29,14 @@ internal partial class FluentBuilderClassesGenerator : IFilesGenerator ]; private static readonly FileDataType[] ExtraBuilders = - { + [ FileDataType.ArrayBuilder, FileDataType.ICollectionBuilder, FileDataType.IEnumerableBuilder, FileDataType.IListBuilder, FileDataType.IReadOnlyCollectionBuilder, FileDataType.IReadOnlyListBuilder - }; + ]; private readonly IList _items; private readonly CompilationHelper _compilationHelper; private readonly bool _supportsNullable; diff --git a/src/FluentBuilderGenerator/Helpers/DefaultValueHelper.cs b/src/FluentBuilderGenerator/Helpers/DefaultValueHelper.cs index 37db62b..94b5ffb 100644 --- a/src/FluentBuilderGenerator/Helpers/DefaultValueHelper.cs +++ b/src/FluentBuilderGenerator/Helpers/DefaultValueHelper.cs @@ -108,7 +108,7 @@ private static string GetNewConstructor(ITypeSymbol typeSymbol) var body = namedTypeSymbol.DelegateInvokeMethod.ReturnsVoid ? "{ }" // It's an Action - : GetDefault(namedTypeSymbol.DelegateInvokeMethod.ReturnType); // It's an Func + : GetDefault(namedTypeSymbol.DelegateInvokeMethod.ReturnType); // It's a Func return $"new {typeSymbol}(({string.Join(", ", delegateParameters)}) => {body})"; } diff --git a/src/FluentBuilderGenerator/SyntaxReceiver/AttributeArgumentListParser.cs b/src/FluentBuilderGenerator/SyntaxReceiver/AttributeArgumentListParser.cs index c3c6ca7..17b5e3a 100644 --- a/src/FluentBuilderGenerator/SyntaxReceiver/AttributeArgumentListParser.cs +++ b/src/FluentBuilderGenerator/SyntaxReceiver/AttributeArgumentListParser.cs @@ -76,14 +76,13 @@ public static FluentBuilderAttributeArguments Parse(AttributeSyntax? attributeSy private static bool TryParseAsBoolean(ExpressionSyntax expressionSyntax, out bool value) { - value = default; - if (expressionSyntax is LiteralExpressionSyntax literalExpressionSyntax) { value = literalExpressionSyntax.Kind() == SyntaxKind.TrueLiteralExpression; return true; } + value = false; return false; } diff --git a/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs b/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs index c6f68e8..2f686d2 100644 --- a/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs +++ b/src/FluentBuilderGenerator/SyntaxReceiver/AutoGenerateBuilderSyntaxReceiver.cs @@ -167,7 +167,7 @@ private static bool TryGetModifier(MemberDeclarationSyntax classDeclarationSynta return true; } - modifier = default; + modifier = null; return false; }