Open amura11 opened 4 years ago
Yes, it's possible. We have a simple codegen endpoint which is apparently what you tried, which puts you in the same (partial) class. But we have a more "I own everything" endpoint that lets you generate the entire CompilationUnit (source file). The API has changed a lot though, so @amis92 is probably the best one to point you to the right API. I don't see it mentioned in the README.
Hi, what you want to do is indeed doable as @AArnott guessed.
But first, let me suggest to you the new C# Source Generators feature shipping with .NET 5/C#9: https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/
The development experience currently is actually a bit worse compared to CG.R, but the future is there (we won't be pursuing CodeGeneration.Roslyn development any further).
Indeed there's no mention in README of the required feature - it's only described a little bit in https://github.com/AArnott/CodeGeneration.Roslyn/wiki/Features#irichcodegenerator
IRichCodeGenerator
interface.ICodeGenerator.GenerateAsync
can throw, it won't be invoked if IRichCodeGenerator
is implemented.IRichCodeGenerator.GenerateRichAsync
implementation must return the RichGenerationResult which will be merged with other generator's output (if any).RichGenerationResult.Members
) will no longer be "wrapped" into triggering attribute's parent type+namespace, you will need to do that yourself.
For simplicity assume my goal is to have an attribute on a method that generates a new class whose name is the methods names followed by "Wrapper".
For example if I have an attribute:
And a class:
I would want to generate the following class:
Of course I tried this with my crude understanding of code generation using this code in my generator:
Which generates:
This is close to what I want but being nested under
TestClass
causes a build error because I now have 2 definitions ofTestClass
. I feel like there must be a way to accomplish my goal of creating a completely new (ie. not a class nested in another class).Is this possible? If so, how?
I really appreciate any help on this 😄