This repository has been archived by the owner on Dec 12, 2020. It is now read-only.
This repository has been archived by the owner on Dec 12, 2020. It is now read-only.
Question: Is it possible to create a new class from an attribute that targets methods? #236
Open
Description
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:
[AttributeUsage(AttributeTargets.Method)]
[CodeGenerationAttribute("FunctionGenerator.TestGenerator, FunctionGenerator")]
[Conditional("CodeGeneration")]
public class TestGeneratorAttribute : Attribute { }
And a class:
public class TestClass
{
[TestGenerator()]
public void FooBar() { }
}
I would want to generate the following class:
public class FooBarWrapper
{
/*Eventually useful code would go here*/
}
Of course I tried this with my crude understanding of code generation using this code in my generator:
public Task<SyntaxList<MemberDeclarationSyntax>> GenerateAsync(TransformationContext context, IProgress<Diagnostic> progress, CancellationToken cancellationToken)
{
MethodDeclarationSyntax method = context.ProcessingNode as MethodDeclarationSyntax;
var wrapper = SyntaxFactory.ClassDeclaration($"{method.Identifier}Wrapper");
var results = SyntaxFactory.SingletonList<MemberDeclarationSyntax>(wrapper);
return Task.FromResult(results);
}
Which generates:
/*Using statements and namespace removed for brevity*/
public class TestClass
{
class FooBarWrapper
{
}
}
This is close to what I want but being nested under TestClass
causes a build error because I now have 2 definitions of TestClass
. 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 😄