Skip to content
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
@amura11

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 😄

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions