From 5568a98e0be17f35ac5b21bdd01dde2b578ce808 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 21 May 2024 13:03:43 +0100 Subject: [PATCH 1/6] add MembersToIgnore --- .gitignore | 2 + .../ProxyInterfaceConsumer/Address.cs | 1 + .../ProxyInterfaceConsumer/IAddress.cs | 4 +- .../ProxyInterfaceConsumerForPnP/Program.cs | 2 +- .../ProxyInterfaceConsumerViaNuGet/IPerson.cs | 4 +- .../ProxyInterfaceConsumerViaNuGet/Person.cs | 2 +- .../FileGenerators/ExtraFilesGenerator.cs | 8 +- .../AttributeArgumentListParser.cs | 2 +- .../Types/FluentBuilderAttributeArguments.cs | 1 + ...y_Should_GenerateCorrectFiles.verified.txt | 8 +- ...rateFiles_ForClassWithIgnores.verified.txt | 132 ++++++++++++++++++ .../ProxyInterfaceSourceGeneratorTest.cs | 38 +++++ .../ProxyInterfaceSourceGeneratorTests.csproj | 6 + .../Source/Foo2.cs | 31 ++++ .../Source/IFoo2.cs | 6 + 15 files changed, 240 insertions(+), 7 deletions(-) create mode 100644 tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.verified.txt create mode 100644 tests/ProxyInterfaceSourceGeneratorTests/Source/Foo2.cs create mode 100644 tests/ProxyInterfaceSourceGeneratorTests/Source/IFoo2.cs diff --git a/.gitignore b/.gitignore index 7508c6d..313797d 100644 --- a/.gitignore +++ b/.gitignore @@ -349,3 +349,5 @@ MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ /tests/ProxyInterfaceSourceGeneratorTests/Destination/Disposable/*.g.cs + +.idea/.idea.ProxyInterfaceSourceGenerator Solution/.idea/ diff --git a/src-examples/ProxyInterfaceConsumer/Address.cs b/src-examples/ProxyInterfaceConsumer/Address.cs index c9e80b8..71395f3 100644 --- a/src-examples/ProxyInterfaceConsumer/Address.cs +++ b/src-examples/ProxyInterfaceConsumer/Address.cs @@ -7,5 +7,6 @@ namespace ProxyInterfaceConsumer public int HouseNumber { get; set; } public event EventHandler MyEvent; + public int Weird { get; set; } } } \ No newline at end of file diff --git a/src-examples/ProxyInterfaceConsumer/IAddress.cs b/src-examples/ProxyInterfaceConsumer/IAddress.cs index f7e3242..2343753 100644 --- a/src-examples/ProxyInterfaceConsumer/IAddress.cs +++ b/src-examples/ProxyInterfaceConsumer/IAddress.cs @@ -1,6 +1,8 @@ +using ProxyInterfaceGenerator; + namespace ProxyInterfaceConsumer { - [ProxyInterfaceGenerator.Proxy(typeof(Address))] + [ProxyInterfaceGenerator.Proxy(typeof(Address), false, ProxyClassAccessibility.Public, new []{"Weird"})] public partial interface IAddress { } diff --git a/src-examples/ProxyInterfaceConsumerForPnP/Program.cs b/src-examples/ProxyInterfaceConsumerForPnP/Program.cs index 5fbba12..b5ee24a 100644 --- a/src-examples/ProxyInterfaceConsumerForPnP/Program.cs +++ b/src-examples/ProxyInterfaceConsumerForPnP/Program.cs @@ -28,7 +28,7 @@ public class Program IClientContext cp = new ClientContextProxy(clientContext); - cp.Load(cp.Web, w => w.Lists, w => w.Language, w => w.Author); + cp.Load(cp.Web, w => w.Lists, w => w.Language, w => w.Author); await cp.ExecuteQueryRetryAsync(); diff --git a/src-examples/ProxyInterfaceConsumerViaNuGet/IPerson.cs b/src-examples/ProxyInterfaceConsumerViaNuGet/IPerson.cs index 2969bc2..f6f5b19 100644 --- a/src-examples/ProxyInterfaceConsumerViaNuGet/IPerson.cs +++ b/src-examples/ProxyInterfaceConsumerViaNuGet/IPerson.cs @@ -1,6 +1,8 @@ +using ProxyInterfaceGenerator; + namespace ProxyInterfaceConsumer { - [ProxyInterfaceGenerator.Proxy(typeof(ProxyInterfaceConsumer.Person), ProxyClassAccessibility.Internal))] + [Proxy(typeof(Person), ProxyClassAccessibility.Internal)] public partial interface IPerson { } diff --git a/src-examples/ProxyInterfaceConsumerViaNuGet/Person.cs b/src-examples/ProxyInterfaceConsumerViaNuGet/Person.cs index b21a785..b999002 100644 --- a/src-examples/ProxyInterfaceConsumerViaNuGet/Person.cs +++ b/src-examples/ProxyInterfaceConsumerViaNuGet/Person.cs @@ -52,7 +52,7 @@ namespace ProxyInterfaceConsumer b = 1; } - public int In_Out_Ref2(in Address a, out Address b, ref Address c) + public int In_Out_Ref2(in IAddress a, out Address b, ref IAddress c) { b = new Address(); return 404; diff --git a/src/ProxyInterfaceSourceGenerator/FileGenerators/ExtraFilesGenerator.cs b/src/ProxyInterfaceSourceGenerator/FileGenerators/ExtraFilesGenerator.cs index 32f7a13..eb8fb9b 100644 --- a/src/ProxyInterfaceSourceGenerator/FileGenerators/ExtraFilesGenerator.cs +++ b/src/ProxyInterfaceSourceGenerator/FileGenerators/ExtraFilesGenerator.cs @@ -27,6 +27,7 @@ namespace ProxyInterfaceGenerator 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) {{ @@ -40,11 +41,16 @@ namespace ProxyInterfaceGenerator {{ }} - public ProxyAttribute(Type type, bool proxyBaseClasses, ProxyClassAccessibility accessibility) + public ProxyAttribute(Type type, bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(type, proxyBaseClasses, accessibility, Array.Empty()) + {{ + }} + + public ProxyAttribute(Type type, bool proxyBaseClasses, ProxyClassAccessibility accessibility, string[] membersToIgnore) {{ Type = type; ProxyBaseClasses = proxyBaseClasses; Accessibility = accessibility; + MembersToIgnore = membersToIgnore; }} }} diff --git a/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/AttributeArgumentListParser.cs b/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/AttributeArgumentListParser.cs index a8fafcf..91a8e66 100644 --- a/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/AttributeArgumentListParser.cs +++ b/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/AttributeArgumentListParser.cs @@ -12,7 +12,7 @@ internal static class AttributeArgumentListParser { public static ProxyInterfaceGeneratorAttributeArguments ParseAttributeArguments(AttributeArgumentListSyntax? argumentList, SemanticModel semanticModel) { - if (argumentList is null || argumentList.Arguments.Count is < 1 or > 3) + if (argumentList is null || argumentList.Arguments.Count is < 1 or > 4) { throw new ArgumentException("The ProxyAttribute requires 1, 2 or 3 arguments."); } diff --git a/src/ProxyInterfaceSourceGenerator/Types/FluentBuilderAttributeArguments.cs b/src/ProxyInterfaceSourceGenerator/Types/FluentBuilderAttributeArguments.cs index 0e4ae9b..b1af428 100644 --- a/src/ProxyInterfaceSourceGenerator/Types/FluentBuilderAttributeArguments.cs +++ b/src/ProxyInterfaceSourceGenerator/Types/FluentBuilderAttributeArguments.cs @@ -5,4 +5,5 @@ internal record ProxyInterfaceGeneratorAttributeArguments(string FullyQualifiedD public bool ProxyBaseClasses { get; set; } public ProxyClassAccessibility Accessibility { get; set; } + public string[] MembersToIgnore { get; set; } = Array.Empty(); } \ No newline at end of file diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.verified.txt b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.verified.txt index 1f66b57..0c9e0a8 100644 --- a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.verified.txt +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.verified.txt @@ -21,6 +21,7 @@ namespace ProxyInterfaceGenerator 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) { @@ -34,11 +35,16 @@ namespace ProxyInterfaceGenerator { } - public ProxyAttribute(Type type, bool proxyBaseClasses, ProxyClassAccessibility accessibility) + public ProxyAttribute(Type type, bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(type, proxyBaseClasses, accessibility, Array.Empty()) + { + } + + public ProxyAttribute(Type type, bool proxyBaseClasses, ProxyClassAccessibility accessibility, string[] membersToIgnore) { Type = type; ProxyBaseClasses = proxyBaseClasses; Accessibility = accessibility; + MembersToIgnore = membersToIgnore; } } diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.verified.txt b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.verified.txt new file mode 100644 index 0000000..a78d037 --- /dev/null +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.verified.txt @@ -0,0 +1,132 @@ +[ + { + HintName: ProxyInterfaceGenerator.Extra.g.cs, + Source: +//---------------------------------------------------------------------------------------- +// +// 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. +// +//---------------------------------------------------------------------------------------- + +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, bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(type, proxyBaseClasses, accessibility, Array.Empty()) + { + } + + public ProxyAttribute(Type type, bool proxyBaseClasses, ProxyClassAccessibility accessibility, string[] membersToIgnore) + { + Type = type; + ProxyBaseClasses = proxyBaseClasses; + Accessibility = accessibility; + MembersToIgnore = membersToIgnore; + } + } + + [Flags] + internal enum ProxyClassAccessibility + { + Public = 0, + + Internal = 1 + } +} + }, + { + HintName: ProxyInterfaceSourceGeneratorTests.Source.IFoo2.g.cs, + Source: +//---------------------------------------------------------------------------------------- +// +// 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 ProxyInterfaceSourceGeneratorTests.Source +{ + public partial interface IFoo2 + { + global::ProxyInterfaceSourceGeneratorTests.Source.Foo2 _Instance { get; } + + global::ProxyInterfaceSourceGeneratorTests.Source.IFoo2[] Foos { get; set; } + + global::ProxyInterfaceSourceGeneratorTests.Source.IFoo2[] DoSomethingAndGetAnArrayOfFoos(); + } +} +#nullable restore + }, + { + HintName: ProxyInterfaceSourceGeneratorTests.Source.Foo2Proxy.g.cs, + Source: +//---------------------------------------------------------------------------------------- +// +// 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 ProxyInterfaceSourceGeneratorTests.Source +{ + public partial class Foo2Proxy : global::ProxyInterfaceSourceGeneratorTests.Source.IFoo2 + { + public global::ProxyInterfaceSourceGeneratorTests.Source.Foo2 _Instance { get; } + + public global::ProxyInterfaceSourceGeneratorTests.Source.IFoo2[] Foos { get => Mapster.TypeAdapter.Adapt(_Instance.Foos); set => _Instance.Foos = Mapster.TypeAdapter.Adapt(value); } + + public global::ProxyInterfaceSourceGeneratorTests.Source.IFoo2[] DoSomethingAndGetAnArrayOfFoos() + { + var result_1603865878 = _Instance.DoSomethingAndGetAnArrayOfFoos(); + return Mapster.TypeAdapter.Adapt(result_1603865878); + } + + + public Foo2Proxy(global::ProxyInterfaceSourceGeneratorTests.Source.Foo2 instance) + { + _Instance = instance; + + + Mapster.TypeAdapterConfig.NewConfig().ConstructUsing(instance1325374861 => new global::ProxyInterfaceSourceGeneratorTests.Source.Foo2Proxy(instance1325374861)); + Mapster.TypeAdapterConfig.NewConfig().MapWith(proxy1047178445 => ((global::ProxyInterfaceSourceGeneratorTests.Source.Foo2Proxy) proxy1047178445)._Instance); + + + } + } +} +#nullable restore + } +] \ No newline at end of file diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs index 1a1f749..758cfe9 100644 --- a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs @@ -86,6 +86,44 @@ public class ProxyInterfaceSourceGeneratorTest return Verify(results); } + + [Fact] + public Task GenerateFiles_ForClassWithIgnores() + { + // Arrange + var fileNames = new[] + { + "ProxyInterfaceSourceGeneratorTests.Source.IFoo2.g.cs", + "ProxyInterfaceSourceGeneratorTests.Source.Foo2Proxy.g.cs" + }; + + var path = "./Source/IFoo2.cs"; + var sourceFile = new SourceFile + { + Path = path, + Text = File.ReadAllText(path), + AttributeToAddToInterface = new ExtraAttribute + { + Name = "ProxyInterfaceGenerator.Proxy", + ArgumentList = "typeof(ProxyInterfaceSourceGeneratorTests.Source.Foo2)" + } + }; + + // Act + var result = _sut.Execute(new[] + { + sourceFile + }); + + // Assert + result.Valid.Should().BeTrue(); + result.Files.Should().HaveCount(fileNames.Length + 1); + + // Verify + var results = result.GeneratorDriver.GetRunResult().Results.First().GeneratedSources; + return Verify(results); + } + [Fact] public void GenerateFiles_ForGenericType_Should_GenerateCorrectFiles() { diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTests.csproj b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTests.csproj index 5acaa96..6266499 100644 --- a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTests.csproj +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTests.csproj @@ -49,6 +49,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + diff --git a/tests/ProxyInterfaceSourceGeneratorTests/Source/Foo2.cs b/tests/ProxyInterfaceSourceGeneratorTests/Source/Foo2.cs new file mode 100644 index 0000000..6d316de --- /dev/null +++ b/tests/ProxyInterfaceSourceGeneratorTests/Source/Foo2.cs @@ -0,0 +1,31 @@ +namespace ProxyInterfaceSourceGeneratorTests.Source; + +public class Foo2 +{ + //public Bar DoSomethingAndGetABar() + //{ + // return new Bar(); + //} + + //public Bar[] DoSomethingAndGetAnArrayOfBars() + //{ + // return new[] { new Bar() }; + //} + + //public Foo DoSomethingAndGetAFoo() + //{ + // return new Foo(); + //} + + public Foo2[] Foos { get; set; } + + public Foo2[] DoSomethingAndGetAnArrayOfFoos() + { + return new[] { new Foo2() }; + } + + //public List DoSomethingAndGetAListOfFoos() + //{ + // return new[] { new Foo() }.ToList(); + //} +} \ No newline at end of file diff --git a/tests/ProxyInterfaceSourceGeneratorTests/Source/IFoo2.cs b/tests/ProxyInterfaceSourceGeneratorTests/Source/IFoo2.cs new file mode 100644 index 0000000..c10a3a4 --- /dev/null +++ b/tests/ProxyInterfaceSourceGeneratorTests/Source/IFoo2.cs @@ -0,0 +1,6 @@ +namespace ProxyInterfaceSourceGeneratorTests.Source +{ + public partial interface IFoo2 + { + } +} \ No newline at end of file From e5a0b7b7d31f36bce53068068d80eb64b74f4d33 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 21 May 2024 13:55:59 +0100 Subject: [PATCH 2/6] intermediate commit --- .../ProxyInterfaceConsumer/IAddress.cs | 2 +- ...y_Should_GenerateCorrectFiles.received.txt | 117 ++++++++++++++++++ ...rateFiles_ForClassWithIgnores.received.txt | 117 ++++++++++++++++++ .../ProxyInterfaceSourceGeneratorTest.cs | 6 +- 4 files changed, 240 insertions(+), 2 deletions(-) create mode 100644 tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.received.txt create mode 100644 tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.received.txt diff --git a/src-examples/ProxyInterfaceConsumer/IAddress.cs b/src-examples/ProxyInterfaceConsumer/IAddress.cs index 2343753..baa0980 100644 --- a/src-examples/ProxyInterfaceConsumer/IAddress.cs +++ b/src-examples/ProxyInterfaceConsumer/IAddress.cs @@ -2,7 +2,7 @@ using ProxyInterfaceGenerator; namespace ProxyInterfaceConsumer { - [ProxyInterfaceGenerator.Proxy(typeof(Address), false, ProxyClassAccessibility.Public, new []{"Weird"})] + [Proxy(typeof(Address), false, ProxyClassAccessibility.Public, new []{"Weird"})] public partial interface IAddress { } diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.received.txt b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.received.txt new file mode 100644 index 0000000..3cd00f2 --- /dev/null +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.received.txt @@ -0,0 +1,117 @@ +[ + { + HintName: ProxyInterfaceGenerator.Extra.g.cs, + Source: +//---------------------------------------------------------------------------------------- +// +// 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. +// +//---------------------------------------------------------------------------------------- + +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, bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(type, proxyBaseClasses, accessibility, Array.Empty()) + { + } + + public ProxyAttribute(Type type, bool proxyBaseClasses, ProxyClassAccessibility accessibility, string[] membersToIgnore) + { + Type = type; + ProxyBaseClasses = proxyBaseClasses; + Accessibility = accessibility; + MembersToIgnore = membersToIgnore; + } + } + + [Flags] + internal enum ProxyClassAccessibility + { + Public = 0, + + Internal = 1 + } +} + }, + { + HintName: ProxyInterfaceSourceGeneratorTests.Source.IFoo.g.cs, + Source: +//---------------------------------------------------------------------------------------- +// +// 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 ProxyInterfaceSourceGeneratorTests.Source +{ + public partial interface IFoo + { + global::ProxyInterfaceSourceGeneratorTests.Source.Foo _Instance { get; } + + global::ProxyInterfaceSourceGeneratorTests.Source.IFoo[] Foos { get; set; } + + global::ProxyInterfaceSourceGeneratorTests.Source.IFoo[] DoSomethingAndGetAnArrayOfFoos(); + } +} +#nullable restore + }, + { + HintName: Error.g.cs, + Source: +/* +ProxyInterfaceCodeGenerator + +[Exception] +System.InvalidOperationException: Sequence contains no elements + at System.Linq.ThrowHelper.ThrowNoElementsException() + at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) + at System.Linq.ImmutableArrayExtensions.First[T](ImmutableArray`1 immutableArray) + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateOperators(ClassSymbol targetClassSymbol, ProxyData proxyData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 350 + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.CreateProxyClassCode(ProxyData pd, ClassSymbol targetClassSymbol, IReadOnlyList`1 extendsProxyClasses, String interfaceName, String className, String constructorName) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 82 + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.TryGenerateFile(ProxyData pd, FileData& fileData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 46 + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateFiles()+MoveNext() in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 23 + at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.GenerateProxyClasses(GeneratorExecutionContext ctx, ProxySyntaxReceiver receiver, Boolean supportsNullable) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 101 + at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.Execute(GeneratorExecutionContext context) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 51 + +[StackTrace] + at System.Linq.ThrowHelper.ThrowNoElementsException() + at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) + at System.Linq.ImmutableArrayExtensions.First[T](ImmutableArray`1 immutableArray) + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateOperators(ClassSymbol targetClassSymbol, ProxyData proxyData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 350 + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.CreateProxyClassCode(ProxyData pd, ClassSymbol targetClassSymbol, IReadOnlyList`1 extendsProxyClasses, String interfaceName, String className, String constructorName) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 82 + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.TryGenerateFile(ProxyData pd, FileData& fileData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 46 + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateFiles()+MoveNext() in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 23 + at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.GenerateProxyClasses(GeneratorExecutionContext ctx, ProxySyntaxReceiver receiver, Boolean supportsNullable) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 101 + at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.Execute(GeneratorExecutionContext context) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 51*/ + } +] \ No newline at end of file diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.received.txt b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.received.txt new file mode 100644 index 0000000..1e9a316 --- /dev/null +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.received.txt @@ -0,0 +1,117 @@ +[ + { + HintName: ProxyInterfaceGenerator.Extra.g.cs, + Source: +//---------------------------------------------------------------------------------------- +// +// 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. +// +//---------------------------------------------------------------------------------------- + +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, bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(type, proxyBaseClasses, accessibility, Array.Empty()) + { + } + + public ProxyAttribute(Type type, bool proxyBaseClasses, ProxyClassAccessibility accessibility, string[] membersToIgnore) + { + Type = type; + ProxyBaseClasses = proxyBaseClasses; + Accessibility = accessibility; + MembersToIgnore = membersToIgnore; + } + } + + [Flags] + internal enum ProxyClassAccessibility + { + Public = 0, + + Internal = 1 + } +} + }, + { + HintName: ProxyInterfaceSourceGeneratorTests.Source.IFoo2.g.cs, + Source: +//---------------------------------------------------------------------------------------- +// +// 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 ProxyInterfaceSourceGeneratorTests.Source +{ + public partial interface IFoo2 + { + global::ProxyInterfaceSourceGeneratorTests.Source.Foo2 _Instance { get; } + + global::ProxyInterfaceSourceGeneratorTests.Source.IFoo2[] Foos { get; set; } + + global::ProxyInterfaceSourceGeneratorTests.Source.IFoo2[] DoSomethingAndGetAnArrayOfFoos(); + } +} +#nullable restore + }, + { + HintName: Error.g.cs, + Source: +/* +ProxyInterfaceCodeGenerator + +[Exception] +System.InvalidOperationException: Sequence contains no elements + at System.Linq.ThrowHelper.ThrowNoElementsException() + at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) + at System.Linq.ImmutableArrayExtensions.First[T](ImmutableArray`1 immutableArray) + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateOperators(ClassSymbol targetClassSymbol, ProxyData proxyData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 350 + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.CreateProxyClassCode(ProxyData pd, ClassSymbol targetClassSymbol, IReadOnlyList`1 extendsProxyClasses, String interfaceName, String className, String constructorName) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 82 + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.TryGenerateFile(ProxyData pd, FileData& fileData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 46 + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateFiles()+MoveNext() in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 23 + at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.GenerateProxyClasses(GeneratorExecutionContext ctx, ProxySyntaxReceiver receiver, Boolean supportsNullable) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 101 + at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.Execute(GeneratorExecutionContext context) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 51 + +[StackTrace] + at System.Linq.ThrowHelper.ThrowNoElementsException() + at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) + at System.Linq.ImmutableArrayExtensions.First[T](ImmutableArray`1 immutableArray) + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateOperators(ClassSymbol targetClassSymbol, ProxyData proxyData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 350 + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.CreateProxyClassCode(ProxyData pd, ClassSymbol targetClassSymbol, IReadOnlyList`1 extendsProxyClasses, String interfaceName, String className, String constructorName) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 82 + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.TryGenerateFile(ProxyData pd, FileData& fileData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 46 + at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateFiles()+MoveNext() in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 23 + at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.GenerateProxyClasses(GeneratorExecutionContext ctx, ProxySyntaxReceiver receiver, Boolean supportsNullable) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 101 + at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.Execute(GeneratorExecutionContext context) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 51*/ + } +] \ No newline at end of file diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs index 758cfe9..bb9f9b1 100644 --- a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs @@ -105,7 +105,11 @@ public class ProxyInterfaceSourceGeneratorTest AttributeToAddToInterface = new ExtraAttribute { Name = "ProxyInterfaceGenerator.Proxy", - ArgumentList = "typeof(ProxyInterfaceSourceGeneratorTests.Source.Foo2)" + ArgumentList = new [] + { + "typeof(ProxyInterfaceSourceGeneratorTests.Source.Foo2)", "false", "ProxyClassAccessibility.Public", + "new []{\"Weird\"}" + } } }; From 2baba84655c9647f98805f6761c65fa2371ca5e4 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 21 May 2024 13:56:58 +0100 Subject: [PATCH 3/6] Add members-to-ignore to proxy data --- .../PartialInterfacesGenerator.cs | 18 +-- .../FileGenerators/ProxyClassesGenerator.cs | 29 +++-- .../Models/ProxyData.cs | 20 +-- .../AttributeArgumentListParser.cs | 24 ++++ .../SyntaxReceiver/ProxySyntaxReceiver.cs | 3 +- .../Utils/MemberHelper.cs | 20 +-- ...y_Should_GenerateCorrectFiles.received.txt | 117 ------------------ ...rateFiles_ForClassWithIgnores.received.txt | 117 ------------------ 8 files changed, 73 insertions(+), 275 deletions(-) delete mode 100644 tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.received.txt delete mode 100644 tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.received.txt diff --git a/src/ProxyInterfaceSourceGenerator/FileGenerators/PartialInterfacesGenerator.cs b/src/ProxyInterfaceSourceGenerator/FileGenerators/PartialInterfacesGenerator.cs index 27f7c65..c4c7448 100644 --- a/src/ProxyInterfaceSourceGenerator/FileGenerators/PartialInterfacesGenerator.cs +++ b/src/ProxyInterfaceSourceGenerator/FileGenerators/PartialInterfacesGenerator.cs @@ -64,9 +64,9 @@ internal class PartialInterfacesGenerator : BaseGenerator, IFilesGenerator var implements = implementedInterfacesNames.Any() ? $" : {string.Join(", ", implementedInterfacesNames)}" : string.Empty; var @new = extendsProxyClasses.Any() ? "new " : string.Empty; var (namespaceStart, namespaceEnd) = NamespaceBuilder.Build(ns); - var events = GenerateEvents(classSymbol, proxyData.ProxyBaseClasses); - var properties = GenerateProperties(classSymbol, proxyData.ProxyBaseClasses); - var methods = GenerateMethods(classSymbol, proxyData.ProxyBaseClasses).TrimEnd(); + var events = GenerateEvents(classSymbol, proxyData); + var properties = GenerateProperties(classSymbol, proxyData); + var methods = GenerateMethods(classSymbol, proxyData).TrimEnd(); return $@"//---------------------------------------------------------------------------------------- // @@ -109,11 +109,11 @@ methods} return t => !hashSet.Contains(t.Name); } - private string GenerateProperties(ClassSymbol targetClassSymbol, bool proxyBaseClasses) + private string GenerateProperties(ClassSymbol targetClassSymbol, ProxyData proxyData) { var str = new StringBuilder(); - foreach (var property in MemberHelper.GetPublicProperties(targetClassSymbol, proxyBaseClasses, InterfaceFilter())) + foreach (var property in MemberHelper.GetPublicProperties(targetClassSymbol, proxyData, InterfaceFilter())) { var type = GetPropertyType(property, out var isReplaced); @@ -142,10 +142,10 @@ methods} return str.ToString(); } - private string GenerateMethods(ClassSymbol targetClassSymbol, bool proxyBaseClasses) + private string GenerateMethods(ClassSymbol targetClassSymbol, ProxyData proxyData) { var str = new StringBuilder(); - foreach (var method in MemberHelper.GetPublicMethods(targetClassSymbol, proxyBaseClasses, InterfaceFilter())) + foreach (var method in MemberHelper.GetPublicMethods(targetClassSymbol, proxyData, InterfaceFilter())) { var methodParameters = GetMethodParameters(method.Parameters, true); var whereStatement = GetWhereStatementFromMethod(method); @@ -162,10 +162,10 @@ methods} return str.ToString(); } - private string GenerateEvents(ClassSymbol targetClassSymbol, bool proxyBaseClasses) + private string GenerateEvents(ClassSymbol targetClassSymbol, ProxyData proxyData) { var str = new StringBuilder(); - foreach (var @event in MemberHelper.GetPublicEvents(targetClassSymbol, proxyBaseClasses, InterfaceFilter())) + foreach (var @event in MemberHelper.GetPublicEvents(targetClassSymbol, proxyData, InterfaceFilter())) { var ps = @event.First().Parameters.First(); var type = ps.GetTypeEnum() == TypeEnum.Complex ? GetParameterType(ps, out _) : ps.Type.ToString(); diff --git a/src/ProxyInterfaceSourceGenerator/FileGenerators/ProxyClassesGenerator.cs b/src/ProxyInterfaceSourceGenerator/FileGenerators/ProxyClassesGenerator.cs index cf8dbf9..58b0cc9 100644 --- a/src/ProxyInterfaceSourceGenerator/FileGenerators/ProxyClassesGenerator.cs +++ b/src/ProxyInterfaceSourceGenerator/FileGenerators/ProxyClassesGenerator.cs @@ -76,10 +76,10 @@ internal partial class ProxyClassesGenerator : BaseGenerator, IFilesGenerator } var @abstract = string.Empty; // targetClassSymbol.Symbol.IsAbstract ? "abstract " : string.Empty; - var properties = GeneratePublicProperties(targetClassSymbol, pd.ProxyBaseClasses); - var methods = GeneratePublicMethods(targetClassSymbol, pd.ProxyBaseClasses); - var events = GenerateEvents(targetClassSymbol, pd.ProxyBaseClasses); - var operators = GenerateOperators(targetClassSymbol, pd.ProxyBaseClasses); + var properties = GeneratePublicProperties(targetClassSymbol, pd); + var methods = GeneratePublicMethods(targetClassSymbol, pd); + var events = GenerateEvents(targetClassSymbol, pd); + var operators = GenerateOperators(targetClassSymbol, pd); var configurationForMapster = string.Empty; if (Context.ReplacedTypes.Count > 0) @@ -124,11 +124,11 @@ operators} {SupportsNullable.IIf("#nullable restore")}"; } - private string GeneratePublicProperties(ClassSymbol targetClassSymbol, bool proxyBaseClasses) + private string GeneratePublicProperties(ClassSymbol targetClassSymbol, ProxyData proxyData) { var str = new StringBuilder(); - foreach (var property in MemberHelper.GetPublicProperties(targetClassSymbol, proxyBaseClasses)) + foreach (var property in MemberHelper.GetPublicProperties(targetClassSymbol, proxyData)) { var type = GetPropertyType(property, out var isReplaced); @@ -190,11 +190,11 @@ operators} return str.ToString(); } - private string GeneratePublicMethods(ClassSymbol targetClassSymbol, bool proxyBaseClasses) + private string GeneratePublicMethods(ClassSymbol targetClassSymbol, ProxyData proxyData) { var str = new StringBuilder(); - var methods = MemberHelper.GetPublicMethods(targetClassSymbol, proxyBaseClasses); + var methods = MemberHelper.GetPublicMethods(targetClassSymbol, proxyData); foreach (var method in methods) { @@ -305,10 +305,10 @@ operators} return str.ToString(); } - private string GenerateEvents(ClassSymbol targetClassSymbol, bool proxyBaseClasses) + private string GenerateEvents(ClassSymbol targetClassSymbol, ProxyData proxyData) { var str = new StringBuilder(); - foreach (var @event in MemberHelper.GetPublicEvents(targetClassSymbol, proxyBaseClasses)) + foreach (var @event in MemberHelper.GetPublicEvents(targetClassSymbol, proxyData)) { var name = @event.Key.GetSanitizedName(); var ps = @event.First().Parameters.First(); @@ -337,16 +337,21 @@ operators} return str.ToString(); } - private string GenerateOperators(ClassSymbol targetClassSymbol, bool proxyBaseClasses) + private string GenerateOperators(ClassSymbol targetClassSymbol, ProxyData proxyData) { var str = new StringBuilder(); - foreach (var @operator in MemberHelper.GetPublicStaticOperators(targetClassSymbol, proxyBaseClasses)) + foreach (var @operator in MemberHelper.GetPublicStaticOperators(targetClassSymbol, proxyData)) { foreach (var attribute in @operator.GetAttributesAsList()) { str.AppendLine($" {attribute}"); } + if (!@operator.Parameters.Any()) + { + continue; + } + var parameter = @operator.Parameters.First(); var proxyClassName = targetClassSymbol.Symbol.ResolveProxyClassName(); diff --git a/src/ProxyInterfaceSourceGenerator/Models/ProxyData.cs b/src/ProxyInterfaceSourceGenerator/Models/ProxyData.cs index 3a4a407..5110cbe 100644 --- a/src/ProxyInterfaceSourceGenerator/Models/ProxyData.cs +++ b/src/ProxyInterfaceSourceGenerator/Models/ProxyData.cs @@ -23,17 +23,18 @@ internal class ProxyData public bool ProxyBaseClasses { get; } public ProxyClassAccessibility Accessibility { get; } + public string[] MembersToIgnore { get; } public ProxyData(string @namespace, - string namespaceDot, - string shortInterfaceName, - string fullInterfaceName, - string fullQualifiedTypeName, - string shortMetadataTypeName, - string fullMetadataTypeName, - List usings, - bool proxyBaseClasses, - ProxyClassAccessibility accessibility) + string namespaceDot, + string shortInterfaceName, + string fullInterfaceName, + string fullQualifiedTypeName, + string shortMetadataTypeName, + string fullMetadataTypeName, + List usings, + bool proxyBaseClasses, + ProxyClassAccessibility accessibility, string[] membersToIgnore) { Namespace = @namespace ?? throw new ArgumentNullException(nameof(@namespace)); NamespaceDot = namespaceDot ?? throw new ArgumentNullException(nameof(namespaceDot)); @@ -45,5 +46,6 @@ internal class ProxyData Usings = usings ?? throw new ArgumentNullException(nameof(usings)); ProxyBaseClasses = proxyBaseClasses; Accessibility = accessibility; + MembersToIgnore = membersToIgnore; } } \ No newline at end of file diff --git a/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/AttributeArgumentListParser.cs b/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/AttributeArgumentListParser.cs index 91a8e66..7b7f028 100644 --- a/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/AttributeArgumentListParser.cs +++ b/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/AttributeArgumentListParser.cs @@ -29,6 +29,11 @@ internal static class AttributeArgumentListParser foreach (var argument in argumentList.Arguments.Skip(1)) { + if (TryParseAsStringArray(argument.Expression, out var membersToIgnore)) + { + result = result with { MembersToIgnore = membersToIgnore }; + continue; + } if (TryParseAsBoolean(argument.Expression, out var proxyBaseClasses)) { result = result with { ProxyBaseClasses = proxyBaseClasses }; @@ -87,4 +92,23 @@ internal static class AttributeArgumentListParser value = default; return false; } + + private static bool TryParseAsStringArray(ExpressionSyntax expressionSyntax, out string[] value) + { + if (expressionSyntax is ImplicitArrayCreationExpressionSyntax lmplicitArrayCreationExpressionSyntax) + { + var strings = new List(); + foreach (var expression in lmplicitArrayCreationExpressionSyntax.Initializer.Expressions) + { + if (expression.GetFirstToken().Value is string s) + { + strings.Add(s); + } + } + value = strings.ToArray(); + return true; + } + value = Array.Empty(); + return false; + } } \ No newline at end of file diff --git a/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/ProxySyntaxReceiver.cs b/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/ProxySyntaxReceiver.cs index facc5ed..121b340 100644 --- a/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/ProxySyntaxReceiver.cs +++ b/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/ProxySyntaxReceiver.cs @@ -77,7 +77,8 @@ internal class ProxySyntaxReceiver : ISyntaxContextReceiver shortMetadataTypeName: metadataName.Split('.').Last(), usings: usings, proxyBaseClasses: fluentBuilderAttributeArguments.ProxyBaseClasses, - accessibility: fluentBuilderAttributeArguments.Accessibility + accessibility: fluentBuilderAttributeArguments.Accessibility, + membersToIgnore: fluentBuilderAttributeArguments.MembersToIgnore ); return true; diff --git a/src/ProxyInterfaceSourceGenerator/Utils/MemberHelper.cs b/src/ProxyInterfaceSourceGenerator/Utils/MemberHelper.cs index 39236b9..7498d39 100644 --- a/src/ProxyInterfaceSourceGenerator/Utils/MemberHelper.cs +++ b/src/ProxyInterfaceSourceGenerator/Utils/MemberHelper.cs @@ -9,7 +9,7 @@ internal static class MemberHelper public static IReadOnlyList GetPublicProperties( ClassSymbol classSymbol, - bool proxyBaseClasses, + ProxyData proxyData, params Func[] filters) { var allFilters = new List>(filters) @@ -17,12 +17,12 @@ internal static class MemberHelper p => p.Kind == SymbolKind.Property }; - return GetPublicMembers(classSymbol, proxyBaseClasses, allFilters.ToArray()).ToArray(); + return GetPublicMembers(classSymbol, proxyData, allFilters.ToArray()).ToArray(); } public static IReadOnlyList GetPublicMethods( ClassSymbol classSymbol, - bool proxyBaseClasses, + ProxyData proxyData, Func? filter = null) { filter ??= _ => true; @@ -30,7 +30,7 @@ internal static class MemberHelper return GetPublicMembers( classSymbol, - proxyBaseClasses, + proxyData, m => m.Kind == SymbolKind.Method, m => m.MethodKind == MethodKind.Ordinary, m => !ExcludedMethods.Contains(m.Name), @@ -40,7 +40,7 @@ internal static class MemberHelper public static IReadOnlyList GetPublicStaticOperators( ClassSymbol classSymbol, - bool proxyBaseClasses, + ProxyData proxyData, Func? filter = null) { filter ??= _ => true; @@ -48,7 +48,7 @@ internal static class MemberHelper return GetPublicMembers( classSymbol, - proxyBaseClasses, + proxyData, m => m.Kind == SymbolKind.Method, m => m.MethodKind == MethodKind.Conversion, m => !ExcludedMethods.Contains(m.Name), @@ -58,7 +58,7 @@ internal static class MemberHelper public static IReadOnlyList> GetPublicEvents( ClassSymbol classSymbol, - bool proxyBaseClasses, + ProxyData proxyData, Func? filter = null) { filter ??= _ => true; @@ -67,7 +67,7 @@ internal static class MemberHelper #pragma warning disable RS1024 // Compare symbols correctly return GetPublicMembers( classSymbol, - proxyBaseClasses, + proxyData, m => m.MethodKind is MethodKind.EventAdd or MethodKind.EventRemove/* || m.MethodKind == MethodKind.EventRaise*/, filter) .GroupBy(e => e.AssociatedSymbol) @@ -79,7 +79,7 @@ internal static class MemberHelper // TODO : do we need also to check for "SanitizedName()" here? private static IReadOnlyList GetPublicMembers( ClassSymbol classSymbol, - bool proxyBaseClasses, + ProxyData proxyData, params Func[] filters ) where T : ISymbol { @@ -94,7 +94,7 @@ internal static class MemberHelper var ownMembers = membersQuery.ToList(); var ownMemberNames = ownMembers.Select(x => x.Name); - if (!proxyBaseClasses) + if (!proxyData.ProxyBaseClasses) { return ownMembers; } diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.received.txt b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.received.txt deleted file mode 100644 index 3cd00f2..0000000 --- a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithArray_Should_GenerateCorrectFiles.received.txt +++ /dev/null @@ -1,117 +0,0 @@ -[ - { - HintName: ProxyInterfaceGenerator.Extra.g.cs, - Source: -//---------------------------------------------------------------------------------------- -// -// 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. -// -//---------------------------------------------------------------------------------------- - -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, bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(type, proxyBaseClasses, accessibility, Array.Empty()) - { - } - - public ProxyAttribute(Type type, bool proxyBaseClasses, ProxyClassAccessibility accessibility, string[] membersToIgnore) - { - Type = type; - ProxyBaseClasses = proxyBaseClasses; - Accessibility = accessibility; - MembersToIgnore = membersToIgnore; - } - } - - [Flags] - internal enum ProxyClassAccessibility - { - Public = 0, - - Internal = 1 - } -} - }, - { - HintName: ProxyInterfaceSourceGeneratorTests.Source.IFoo.g.cs, - Source: -//---------------------------------------------------------------------------------------- -// -// 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 ProxyInterfaceSourceGeneratorTests.Source -{ - public partial interface IFoo - { - global::ProxyInterfaceSourceGeneratorTests.Source.Foo _Instance { get; } - - global::ProxyInterfaceSourceGeneratorTests.Source.IFoo[] Foos { get; set; } - - global::ProxyInterfaceSourceGeneratorTests.Source.IFoo[] DoSomethingAndGetAnArrayOfFoos(); - } -} -#nullable restore - }, - { - HintName: Error.g.cs, - Source: -/* -ProxyInterfaceCodeGenerator - -[Exception] -System.InvalidOperationException: Sequence contains no elements - at System.Linq.ThrowHelper.ThrowNoElementsException() - at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) - at System.Linq.ImmutableArrayExtensions.First[T](ImmutableArray`1 immutableArray) - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateOperators(ClassSymbol targetClassSymbol, ProxyData proxyData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 350 - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.CreateProxyClassCode(ProxyData pd, ClassSymbol targetClassSymbol, IReadOnlyList`1 extendsProxyClasses, String interfaceName, String className, String constructorName) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 82 - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.TryGenerateFile(ProxyData pd, FileData& fileData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 46 - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateFiles()+MoveNext() in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 23 - at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.GenerateProxyClasses(GeneratorExecutionContext ctx, ProxySyntaxReceiver receiver, Boolean supportsNullable) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 101 - at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.Execute(GeneratorExecutionContext context) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 51 - -[StackTrace] - at System.Linq.ThrowHelper.ThrowNoElementsException() - at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) - at System.Linq.ImmutableArrayExtensions.First[T](ImmutableArray`1 immutableArray) - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateOperators(ClassSymbol targetClassSymbol, ProxyData proxyData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 350 - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.CreateProxyClassCode(ProxyData pd, ClassSymbol targetClassSymbol, IReadOnlyList`1 extendsProxyClasses, String interfaceName, String className, String constructorName) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 82 - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.TryGenerateFile(ProxyData pd, FileData& fileData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 46 - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateFiles()+MoveNext() in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 23 - at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.GenerateProxyClasses(GeneratorExecutionContext ctx, ProxySyntaxReceiver receiver, Boolean supportsNullable) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 101 - at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.Execute(GeneratorExecutionContext context) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 51*/ - } -] \ No newline at end of file diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.received.txt b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.received.txt deleted file mode 100644 index 1e9a316..0000000 --- a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.received.txt +++ /dev/null @@ -1,117 +0,0 @@ -[ - { - HintName: ProxyInterfaceGenerator.Extra.g.cs, - Source: -//---------------------------------------------------------------------------------------- -// -// 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. -// -//---------------------------------------------------------------------------------------- - -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, bool proxyBaseClasses, ProxyClassAccessibility accessibility) : this(type, proxyBaseClasses, accessibility, Array.Empty()) - { - } - - public ProxyAttribute(Type type, bool proxyBaseClasses, ProxyClassAccessibility accessibility, string[] membersToIgnore) - { - Type = type; - ProxyBaseClasses = proxyBaseClasses; - Accessibility = accessibility; - MembersToIgnore = membersToIgnore; - } - } - - [Flags] - internal enum ProxyClassAccessibility - { - Public = 0, - - Internal = 1 - } -} - }, - { - HintName: ProxyInterfaceSourceGeneratorTests.Source.IFoo2.g.cs, - Source: -//---------------------------------------------------------------------------------------- -// -// 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 ProxyInterfaceSourceGeneratorTests.Source -{ - public partial interface IFoo2 - { - global::ProxyInterfaceSourceGeneratorTests.Source.Foo2 _Instance { get; } - - global::ProxyInterfaceSourceGeneratorTests.Source.IFoo2[] Foos { get; set; } - - global::ProxyInterfaceSourceGeneratorTests.Source.IFoo2[] DoSomethingAndGetAnArrayOfFoos(); - } -} -#nullable restore - }, - { - HintName: Error.g.cs, - Source: -/* -ProxyInterfaceCodeGenerator - -[Exception] -System.InvalidOperationException: Sequence contains no elements - at System.Linq.ThrowHelper.ThrowNoElementsException() - at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) - at System.Linq.ImmutableArrayExtensions.First[T](ImmutableArray`1 immutableArray) - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateOperators(ClassSymbol targetClassSymbol, ProxyData proxyData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 350 - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.CreateProxyClassCode(ProxyData pd, ClassSymbol targetClassSymbol, IReadOnlyList`1 extendsProxyClasses, String interfaceName, String className, String constructorName) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 82 - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.TryGenerateFile(ProxyData pd, FileData& fileData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 46 - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateFiles()+MoveNext() in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 23 - at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.GenerateProxyClasses(GeneratorExecutionContext ctx, ProxySyntaxReceiver receiver, Boolean supportsNullable) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 101 - at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.Execute(GeneratorExecutionContext context) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 51 - -[StackTrace] - at System.Linq.ThrowHelper.ThrowNoElementsException() - at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) - at System.Linq.ImmutableArrayExtensions.First[T](ImmutableArray`1 immutableArray) - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateOperators(ClassSymbol targetClassSymbol, ProxyData proxyData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 350 - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.CreateProxyClassCode(ProxyData pd, ClassSymbol targetClassSymbol, IReadOnlyList`1 extendsProxyClasses, String interfaceName, String className, String constructorName) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 82 - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.TryGenerateFile(ProxyData pd, FileData& fileData) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 46 - at ProxyInterfaceSourceGenerator.FileGenerators.ProxyClassesGenerator.GenerateFiles()+MoveNext() in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\FileGenerators\ProxyClassesGenerator.cs:line 23 - at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.GenerateProxyClasses(GeneratorExecutionContext ctx, ProxySyntaxReceiver receiver, Boolean supportsNullable) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 101 - at ProxyInterfaceSourceGenerator.ProxyInterfaceCodeGenerator.Execute(GeneratorExecutionContext context) in {SolutionDirectory}src\ProxyInterfaceSourceGenerator\ProxyInterfaceCodeGenerator.cs:line 51*/ - } -] \ No newline at end of file From e61651ba131ab5714165c19c9e89f07669c23d19 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 21 May 2024 14:14:54 +0100 Subject: [PATCH 4/6] add to ignore test --- src-examples/ProxyInterfaceConsumer/Address.cs | 4 ++++ src/ProxyInterfaceSourceGenerator/Utils/MemberHelper.cs | 4 +++- ...torTest.GenerateFiles_ForClassWithIgnores.verified.txt | 8 ++++++++ .../ProxyInterfaceSourceGeneratorTest.cs | 2 +- tests/ProxyInterfaceSourceGeneratorTests/Source/Foo2.cs | 5 +++++ 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src-examples/ProxyInterfaceConsumer/Address.cs b/src-examples/ProxyInterfaceConsumer/Address.cs index 71395f3..f440fc2 100644 --- a/src-examples/ProxyInterfaceConsumer/Address.cs +++ b/src-examples/ProxyInterfaceConsumer/Address.cs @@ -8,5 +8,9 @@ namespace ProxyInterfaceConsumer public event EventHandler MyEvent; public int Weird { get; set; } + public int Weird2() + { + return 0; + } } } \ No newline at end of file diff --git a/src/ProxyInterfaceSourceGenerator/Utils/MemberHelper.cs b/src/ProxyInterfaceSourceGenerator/Utils/MemberHelper.cs index 7498d39..00cce5c 100644 --- a/src/ProxyInterfaceSourceGenerator/Utils/MemberHelper.cs +++ b/src/ProxyInterfaceSourceGenerator/Utils/MemberHelper.cs @@ -86,7 +86,9 @@ internal static class MemberHelper var membersQuery = classSymbol.Symbol.GetMembers().OfType() .Where(m => m.DeclaredAccessibility == Accessibility.Public); - foreach (var filter in filters) + var f = filters.ToList(); + f.Add(x => !proxyData.MembersToIgnore.Contains(x.Name)); + foreach (var filter in f) { membersQuery = membersQuery.Where(filter); } diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.verified.txt b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.verified.txt index a78d037..c2b7afe 100644 --- a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.verified.txt +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.GenerateFiles_ForClassWithIgnores.verified.txt @@ -81,6 +81,8 @@ namespace ProxyInterfaceSourceGeneratorTests.Source global::ProxyInterfaceSourceGeneratorTests.Source.IFoo2[] Foos { get; set; } global::ProxyInterfaceSourceGeneratorTests.Source.IFoo2[] DoSomethingAndGetAnArrayOfFoos(); + + int Weird2(); } } #nullable restore @@ -114,6 +116,12 @@ namespace ProxyInterfaceSourceGeneratorTests.Source return Mapster.TypeAdapter.Adapt(result_1603865878); } + public int Weird2() + { + var result__1602200929 = _Instance.Weird2(); + return result__1602200929; + } + public Foo2Proxy(global::ProxyInterfaceSourceGeneratorTests.Source.Foo2 instance) { diff --git a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs index bb9f9b1..79d4467 100644 --- a/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs +++ b/tests/ProxyInterfaceSourceGeneratorTests/ProxyInterfaceSourceGeneratorTest.cs @@ -108,7 +108,7 @@ public class ProxyInterfaceSourceGeneratorTest ArgumentList = new [] { "typeof(ProxyInterfaceSourceGeneratorTests.Source.Foo2)", "false", "ProxyClassAccessibility.Public", - "new []{\"Weird\"}" + "new []{\"Weird\",\"NotHere\"}" } } }; diff --git a/tests/ProxyInterfaceSourceGeneratorTests/Source/Foo2.cs b/tests/ProxyInterfaceSourceGeneratorTests/Source/Foo2.cs index 6d316de..01dfeb8 100644 --- a/tests/ProxyInterfaceSourceGeneratorTests/Source/Foo2.cs +++ b/tests/ProxyInterfaceSourceGeneratorTests/Source/Foo2.cs @@ -23,6 +23,11 @@ public class Foo2 { return new[] { new Foo2() }; } + public int Weird { get; set; } + public int Weird2() + { + return 0; + } //public List DoSomethingAndGetAListOfFoos() //{ From 7f31f43f9705079309d4c1c64957d1ee1d9fcdf9 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 21 May 2024 14:18:29 +0100 Subject: [PATCH 5/6] add _Instance to interface to test --- src-examples/ProxyInterfaceConsumer/IAddress.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src-examples/ProxyInterfaceConsumer/IAddress.cs b/src-examples/ProxyInterfaceConsumer/IAddress.cs index baa0980..ba32668 100644 --- a/src-examples/ProxyInterfaceConsumer/IAddress.cs +++ b/src-examples/ProxyInterfaceConsumer/IAddress.cs @@ -5,5 +5,9 @@ namespace ProxyInterfaceConsumer [Proxy(typeof(Address), false, ProxyClassAccessibility.Public, new []{"Weird"})] public partial interface IAddress { + public void Weird() + { + _Instance.Weird2(); + } } } \ No newline at end of file From 95b5b15cb5cc3fece0b3c6674158f09ce14b0e1c Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 21 May 2024 14:21:24 +0100 Subject: [PATCH 6/6] Fix comment --- .../SyntaxReceiver/AttributeArgumentListParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/AttributeArgumentListParser.cs b/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/AttributeArgumentListParser.cs index 7b7f028..52b5eae 100644 --- a/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/AttributeArgumentListParser.cs +++ b/src/ProxyInterfaceSourceGenerator/SyntaxReceiver/AttributeArgumentListParser.cs @@ -14,7 +14,7 @@ internal static class AttributeArgumentListParser { if (argumentList is null || argumentList.Arguments.Count is < 1 or > 4) { - throw new ArgumentException("The ProxyAttribute requires 1, 2 or 3 arguments."); + throw new ArgumentException("The ProxyAttribute requires 1, 2, 3 or 4 arguments."); } ProxyInterfaceGeneratorAttributeArguments result;