diff --git a/BTDB.SourceGenerator.Test/GeneratorTestsBase.cs b/BTDB.SourceGenerator.Test/GeneratorTestsBase.cs index 6907f375..1d02a4f2 100644 --- a/BTDB.SourceGenerator.Test/GeneratorTestsBase.cs +++ b/BTDB.SourceGenerator.Test/GeneratorTestsBase.cs @@ -31,8 +31,11 @@ protected static Task VerifySourceGenerator(string sourceCode) // Assert the driver doesn't recompute the output var result = runResult2.GetRunResult().Results.Single(); var allOutputs = result.TrackedOutputSteps.SelectMany(outputStep => outputStep.Value) - .SelectMany(output => output.Outputs); - Assert.Collection(allOutputs, output => Assert.Equal(IncrementalStepRunReason.Cached, output.Reason)); + .SelectMany(output => output.Outputs).ToList(); + if (allOutputs.Count != 0) + { + Assert.Collection(allOutputs, output => Assert.Equal(IncrementalStepRunReason.Cached, output.Reason)); + } return Verifier.Verify(runResult); } diff --git a/BTDB.SourceGenerator.Test/IOCTests.VerifyGenerateForCouldBeUsedForGenericClasses#TestNamespace.Logger.g.verified.cs b/BTDB.SourceGenerator.Test/IOCTests.VerifyGenerateForCouldBeUsedForGenericClasses#TestNamespace.Logger[int].g.verified.cs similarity index 94% rename from BTDB.SourceGenerator.Test/IOCTests.VerifyGenerateForCouldBeUsedForGenericClasses#TestNamespace.Logger.g.verified.cs rename to BTDB.SourceGenerator.Test/IOCTests.VerifyGenerateForCouldBeUsedForGenericClasses#TestNamespace.Logger[int].g.verified.cs index 73721b96..41bfdd4e 100644 --- a/BTDB.SourceGenerator.Test/IOCTests.VerifyGenerateForCouldBeUsedForGenericClasses#TestNamespace.Logger.g.verified.cs +++ b/BTDB.SourceGenerator.Test/IOCTests.VerifyGenerateForCouldBeUsedForGenericClasses#TestNamespace.Logger[int].g.verified.cs @@ -1,4 +1,4 @@ -//HintName: TestNamespace.Logger.g.cs +//HintName: TestNamespace.Logger[int].g.cs // #pragma warning disable 612,618 using System; diff --git a/BTDB.SourceGenerator.Test/IOCTests.VerifyGenerateForCouldBeUsedForGenericClassesWithMultipleVariants#TestNamespace.Logger[int].g.verified.cs b/BTDB.SourceGenerator.Test/IOCTests.VerifyGenerateForCouldBeUsedForGenericClassesWithMultipleVariants#TestNamespace.Logger[int].g.verified.cs new file mode 100644 index 00000000..41bfdd4e --- /dev/null +++ b/BTDB.SourceGenerator.Test/IOCTests.VerifyGenerateForCouldBeUsedForGenericClassesWithMultipleVariants#TestNamespace.Logger[int].g.verified.cs @@ -0,0 +1,25 @@ +//HintName: TestNamespace.Logger[int].g.cs +// +#pragma warning disable 612,618 +using System; +using System.Runtime.CompilerServices; + +namespace TestNamespace; + +static file class LoggerRegistration +{ + [ModuleInitializer] + internal static unsafe void Register4BTDB() + { + global::BTDB.IOC.IContainer.RegisterFactory(typeof(global::TestNamespace.Logger), (container, ctx) => + { + var f0 = container.CreateFactory(ctx, typeof(int), "a"); + if (f0 == null) throw new global::System.ArgumentException("Cannot resolve int a parameter of TestNamespace.Logger"); + return (container2, ctx2) => + { + var res = new global::TestNamespace.Logger((int)(f0(container2, ctx2))); + return res; + }; + }); + } +} diff --git a/BTDB.SourceGenerator.Test/IOCTests.VerifyGenerateForCouldBeUsedForGenericClassesWithMultipleVariants#TestNamespace.Logger[string].g.verified.cs b/BTDB.SourceGenerator.Test/IOCTests.VerifyGenerateForCouldBeUsedForGenericClassesWithMultipleVariants#TestNamespace.Logger[string].g.verified.cs new file mode 100644 index 00000000..4b2b4bd8 --- /dev/null +++ b/BTDB.SourceGenerator.Test/IOCTests.VerifyGenerateForCouldBeUsedForGenericClassesWithMultipleVariants#TestNamespace.Logger[string].g.verified.cs @@ -0,0 +1,25 @@ +//HintName: TestNamespace.Logger[string].g.cs +// +#pragma warning disable 612,618 +using System; +using System.Runtime.CompilerServices; + +namespace TestNamespace; + +static file class LoggerRegistration +{ + [ModuleInitializer] + internal static unsafe void Register4BTDB() + { + global::BTDB.IOC.IContainer.RegisterFactory(typeof(global::TestNamespace.Logger), (container, ctx) => + { + var f0 = container.CreateFactory(ctx, typeof(string), "a"); + if (f0 == null) throw new global::System.ArgumentException("Cannot resolve string a parameter of TestNamespace.Logger"); + return (container2, ctx2) => + { + var res = new global::TestNamespace.Logger(Unsafe.As(f0(container2, ctx2))); + return res; + }; + }); + } +} diff --git a/BTDB.SourceGenerator.Test/IOCTests.cs b/BTDB.SourceGenerator.Test/IOCTests.cs index 361957b7..c6d01c88 100644 --- a/BTDB.SourceGenerator.Test/IOCTests.cs +++ b/BTDB.SourceGenerator.Test/IOCTests.cs @@ -461,6 +461,28 @@ public Logger(T a) "); } + [Fact] + public Task VerifyGenerateForCouldBeUsedForGenericClassesWithMultipleVariants() + { + // language=cs + return VerifySourceGenerator(@" + namespace TestNamespace; + + public interface ILogger + { + } + + [BTDB.GenerateFor(typeof(Logger))] + [BTDB.GenerateFor(typeof(Logger))] + public class Logger: ILogger + { + public Logger(T a) + { + } + } + "); + } + [Fact] public Task VerifyGenerateForCouldBeUsedForChoosingDifferentConstructor() { diff --git a/BTDB.SourceGenerator/Main.cs b/BTDB.SourceGenerator/Main.cs index a6f44368..6e7cfb9c 100644 --- a/BTDB.SourceGenerator/Main.cs +++ b/BTDB.SourceGenerator/Main.cs @@ -968,7 +968,7 @@ internal static unsafe void Register4BTDB() """; context.AddSource( - $"{(generationInfo.Namespace == null ? "" : generationInfo.Namespace + ".") + generationInfo.Name}.g.cs", + $"{generationInfo.FullName.Replace("global::","").Replace("<","[").Replace(">","]")}.g.cs", SourceText.From(code, Encoding.UTF8)); } }