From cfef83eb19def6eb5bd96b255b24da9e5430115d Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 14 Jan 2025 09:20:10 +0100 Subject: [PATCH 1/2] Fix ProxyAttribute --- .../FileGenerators/ExtraFilesGenerator.cs | 10 +++++----- ...sWithArray_Should_GenerateCorrectFiles.verified.txt | 10 +++++----- ...Test.GenerateFiles_ForClassWithIgnores.verified.txt | 10 +++++----- ...enerateFiles_ForClassWithIgnores_Regex.verified.txt | 10 +++++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/ProxyInterfaceSourceGenerator/FileGenerators/ExtraFilesGenerator.cs b/src/ProxyInterfaceSourceGenerator/FileGenerators/ExtraFilesGenerator.cs index e943fb1..edbe998 100644 --- a/src/ProxyInterfaceSourceGenerator/FileGenerators/ExtraFilesGenerator.cs +++ b/src/ProxyInterfaceSourceGenerator/FileGenerators/ExtraFilesGenerator.cs @@ -66,23 +66,23 @@ public ProxyAttribute() : this(false, ProxyClassAccessibility.Public) {{ }} - public ProxyAttribute(bool proxyBaseClasses) : this(type, proxyBaseClasses, ProxyClassAccessibility.Public) + public ProxyAttribute(bool proxyBaseClasses) : this(proxyBaseClasses, ProxyClassAccessibility.Public) {{ }} - public ProxyAttribute(ProxyClassAccessibility accessibility) : this(type, false, accessibility) + public ProxyAttribute(ProxyClassAccessibility accessibility) : this(false, accessibility) {{ }} - public ProxyAttribute(ProxyClassAccessibility accessibility, {stringArray} membersToIgnore) : this(type, false, accessibility, membersToIgnore) + public ProxyAttribute(ProxyClassAccessibility accessibility, {stringArray} membersToIgnore) : this(false, accessibility, membersToIgnore) {{ }} - public ProxyAttribute(bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(type, proxyBaseClasses, accessibility, null) + public ProxyAttribute(bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(proxyBaseClasses, accessibility, null) {{ }} - public ProxyAttribute({stringArray} membersToIgnore) : this(type, false, ProxyClassAccessibility.Public, null) + public ProxyAttribute({stringArray} membersToIgnore) : this(false, ProxyClassAccessibility.Public, null) {{ }} diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.verified.txt b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.verified.txt index 47a5091..f1e043e 100644 --- a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.verified.txt +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.verified.txt @@ -71,23 +71,23 @@ namespace ProxyInterfaceGenerator { } - public ProxyAttribute(bool proxyBaseClasses) : this(type, proxyBaseClasses, ProxyClassAccessibility.Public) + public ProxyAttribute(bool proxyBaseClasses) : this(proxyBaseClasses, ProxyClassAccessibility.Public) { } - public ProxyAttribute(ProxyClassAccessibility accessibility) : this(type, false, accessibility) + public ProxyAttribute(ProxyClassAccessibility accessibility) : this(false, accessibility) { } - public ProxyAttribute(ProxyClassAccessibility accessibility, string[]? membersToIgnore) : this(type, false, accessibility, membersToIgnore) + public ProxyAttribute(ProxyClassAccessibility accessibility, string[]? membersToIgnore) : this(false, accessibility, membersToIgnore) { } - public ProxyAttribute(bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(type, proxyBaseClasses, accessibility, null) + public ProxyAttribute(bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(proxyBaseClasses, accessibility, null) { } - public ProxyAttribute(string[]? membersToIgnore) : this(type, false, ProxyClassAccessibility.Public, null) + public ProxyAttribute(string[]? membersToIgnore) : this(false, ProxyClassAccessibility.Public, null) { } diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.verified.txt b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.verified.txt index b7d1cdd..a452d2c 100644 --- a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.verified.txt +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.verified.txt @@ -71,23 +71,23 @@ namespace ProxyInterfaceGenerator { } - public ProxyAttribute(bool proxyBaseClasses) : this(type, proxyBaseClasses, ProxyClassAccessibility.Public) + public ProxyAttribute(bool proxyBaseClasses) : this(proxyBaseClasses, ProxyClassAccessibility.Public) { } - public ProxyAttribute(ProxyClassAccessibility accessibility) : this(type, false, accessibility) + public ProxyAttribute(ProxyClassAccessibility accessibility) : this(false, accessibility) { } - public ProxyAttribute(ProxyClassAccessibility accessibility, string[]? membersToIgnore) : this(type, false, accessibility, membersToIgnore) + public ProxyAttribute(ProxyClassAccessibility accessibility, string[]? membersToIgnore) : this(false, accessibility, membersToIgnore) { } - public ProxyAttribute(bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(type, proxyBaseClasses, accessibility, null) + public ProxyAttribute(bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(proxyBaseClasses, accessibility, null) { } - public ProxyAttribute(string[]? membersToIgnore) : this(type, false, ProxyClassAccessibility.Public, null) + public ProxyAttribute(string[]? membersToIgnore) : this(false, ProxyClassAccessibility.Public, null) { } diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores_Regex.verified.txt b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores_Regex.verified.txt index 0c276ef..fb2a170 100644 --- a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores_Regex.verified.txt +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores_Regex.verified.txt @@ -71,23 +71,23 @@ namespace ProxyInterfaceGenerator { } - public ProxyAttribute(bool proxyBaseClasses) : this(type, proxyBaseClasses, ProxyClassAccessibility.Public) + public ProxyAttribute(bool proxyBaseClasses) : this(proxyBaseClasses, ProxyClassAccessibility.Public) { } - public ProxyAttribute(ProxyClassAccessibility accessibility) : this(type, false, accessibility) + public ProxyAttribute(ProxyClassAccessibility accessibility) : this(false, accessibility) { } - public ProxyAttribute(ProxyClassAccessibility accessibility, string[]? membersToIgnore) : this(type, false, accessibility, membersToIgnore) + public ProxyAttribute(ProxyClassAccessibility accessibility, string[]? membersToIgnore) : this(false, accessibility, membersToIgnore) { } - public ProxyAttribute(bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(type, proxyBaseClasses, accessibility, null) + public ProxyAttribute(bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(proxyBaseClasses, accessibility, null) { } - public ProxyAttribute(string[]? membersToIgnore) : this(type, false, ProxyClassAccessibility.Public, null) + public ProxyAttribute(string[]? membersToIgnore) : this(false, ProxyClassAccessibility.Public, null) { } From 17423b3ec763e36c018017dd58b93b6c8823af15 Mon Sep 17 00:00:00 2001 From: Stef Date: Tue, 14 Jan 2025 20:18:49 +0100 Subject: [PATCH 2/2] . --- .../ProxyInterfaceGenerator.Extra.g.cs | 107 ++++++++++++++++++ .../ProxyInterfaceSourceGeneratorTest.cs | 42 ++----- 2 files changed, 119 insertions(+), 30 deletions(-) create mode 100644 tests/ProxyInterfaceSourceGeneratorTests/Destination/ProxyInterfaceGenerator.Extra.g.cs diff --git a/tests/ProxyInterfaceSourceGeneratorTests/Destination/ProxyInterfaceGenerator.Extra.g.cs b/tests/ProxyInterfaceSourceGeneratorTests/Destination/ProxyInterfaceGenerator.Extra.g.cs new file mode 100644 index 0000000..2400cac --- /dev/null +++ b/tests/ProxyInterfaceSourceGeneratorTests/Destination/ProxyInterfaceGenerator.Extra.g.cs @@ -0,0 +1,107 @@ +//---------------------------------------------------------------------------------------- +// +// This code was generated by https://github.com/StefH/ProxyInterfaceSourceGenerator. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//---------------------------------------------------------------------------------------- + +#nullable enable +using System; + +namespace ProxyInterfaceGenerator +{ + + [AttributeUsage(AttributeTargets.Interface)] + internal sealed class ProxyAttribute : Attribute + { + public Type Type { get; } + public bool ProxyBaseClasses { get; } + public ProxyClassAccessibility Accessibility { get; } + public string[]? MembersToIgnore { get; } + + public ProxyAttribute(Type type) : this(type, false, ProxyClassAccessibility.Public) + { + } + + public ProxyAttribute(Type type, bool proxyBaseClasses) : this(type, proxyBaseClasses, ProxyClassAccessibility.Public) + { + } + + public ProxyAttribute(Type type, ProxyClassAccessibility accessibility) : this(type, false, accessibility) + { + } + + public ProxyAttribute(Type type, ProxyClassAccessibility accessibility, string[]? membersToIgnore) : this(type, false, accessibility, membersToIgnore) + { + } + + public ProxyAttribute(Type type, bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(type, proxyBaseClasses, accessibility, null) + { + } + + public ProxyAttribute(Type type, string[]? membersToIgnore) : this(type, false, ProxyClassAccessibility.Public, null) + { + } + + public ProxyAttribute(Type type, bool proxyBaseClasses, ProxyClassAccessibility accessibility, string[]? membersToIgnore) + { + Type = type; + ProxyBaseClasses = proxyBaseClasses; + Accessibility = accessibility; + MembersToIgnore = membersToIgnore; + } + } + + + [AttributeUsage(AttributeTargets.Interface)] + internal sealed class ProxyAttribute : Attribute where T : class + { + public Type Type { get; } + public bool ProxyBaseClasses { get; } + public ProxyClassAccessibility Accessibility { get; } + public string[]? MembersToIgnore { get; } + + public ProxyAttribute() : this(false, ProxyClassAccessibility.Public) + { + } + + public ProxyAttribute(bool proxyBaseClasses) : this(proxyBaseClasses, ProxyClassAccessibility.Public) + { + } + + public ProxyAttribute(ProxyClassAccessibility accessibility) : this(false, accessibility) + { + } + + public ProxyAttribute(ProxyClassAccessibility accessibility, string[]? membersToIgnore) : this(false, accessibility, membersToIgnore) + { + } + + public ProxyAttribute(bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(proxyBaseClasses, accessibility, null) + { + } + + public ProxyAttribute(string[]? membersToIgnore) : this(false, ProxyClassAccessibility.Public, null) + { + } + + public ProxyAttribute(bool proxyBaseClasses, ProxyClassAccessibility accessibility, string[]? membersToIgnore) + { + Type = typeof(T); + ProxyBaseClasses = proxyBaseClasses; + Accessibility = accessibility; + MembersToIgnore = membersToIgnore; + } + } + + [Flags] + internal enum ProxyClassAccessibility + { + Public = 0, + + Internal = 1 + } +} +#nullable restore \ No newline at end of file diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs index 627b227..803f477 100644 --- a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs @@ -314,9 +314,12 @@ public void GenerateFiles_When_MixedVisibility_Should_GenerateCorrectFiles() public void GenerateFiles_ForSingleClass_Should_GenerateCorrectFiles() { // Arrange - var attributeFilename = "ProxyInterfaceGenerator.Extra.g.cs"; - var interfaceFilename = "ProxyInterfaceSourceGeneratorTests.Source.IPersonExtends.g.cs"; - var proxyClassFilename = "ProxyInterfaceSourceGeneratorTests.Source.PersonExtendsProxy.g.cs"; + var fileNames = new[] + { + "ProxyInterfaceGenerator.Extra.g.cs", + "ProxyInterfaceSourceGeneratorTests.Source.IPersonExtends.g.cs", + "ProxyInterfaceSourceGeneratorTests.Source.PersonExtendsProxy.g.cs", + }; var path = Path.Combine(_basePath, "Source", "IPersonExtends.cs"); var sourceFile = new SourceFile @@ -334,30 +337,7 @@ public void GenerateFiles_ForSingleClass_Should_GenerateCorrectFiles() var result = _sut.Execute([sourceFile]); // Assert - result.Valid.Should().BeTrue(); - result.Files.Should().HaveCount(3); - - // Assert attribute - var attribute = result.Files[0].SyntaxTree; - attribute.FilePath.Should().EndWith(attributeFilename); - - // Assert interface - var @interface = result.Files[1].SyntaxTree; - @interface.FilePath.Should().EndWith(interfaceFilename); - - var interfaceCode = @interface.ToString(); - var interfaceCodeFilename = Path.Combine(_basePath, "Destination", interfaceFilename); - if (Write) File.WriteAllText(interfaceCodeFilename, interfaceCode); - interfaceCode.Should().NotBeNullOrEmpty().And.Be(File.ReadAllText(interfaceCodeFilename)); - - // Assert Proxy - var proxyClass = result.Files[2].SyntaxTree; - proxyClass.FilePath.Should().EndWith(proxyClassFilename); - - var proxyCode = proxyClass.ToString(); - var proxyCodeFilename = Path.Combine(_basePath, "Destination", proxyClassFilename); - if (Write) File.WriteAllText(proxyCodeFilename, proxyCode); - proxyCode.Should().NotBeNullOrEmpty().And.Be(File.ReadAllText(proxyCodeFilename)); + Assert(result, fileNames, false); } [Fact] @@ -816,14 +796,16 @@ public void GenerateFiles_ForTimeProvider_Should_GenerateCorrectFiles() Assert(result, fileNames); } - private void Assert(ExecuteResult result, string[] fileNames) + private void Assert(ExecuteResult result, string[] fileNames, bool skipExtra = true) { + var skip = skipExtra ? 1 : 0; + result.Valid.Should().BeTrue(); - result.Files.Should().HaveCount(fileNames.Length + 1); + result.Files.Should().HaveCount(fileNames.Length + skip); foreach (var fileName in fileNames.Select((fileName, index) => new { fileName, index })) { - var builder = result.Files[fileName.index + 1]; // +1 means skip the attribute + var builder = result.Files[fileName.index + skip]; // +1 means skip the attribute builder.Path.Should().EndWith(fileName.fileName); var destinationFilename = Path.Combine(_basePath, $"Destination/{fileName.fileName}");