我创建了一个 C# Roslyn 源生成器和一个测试,生成器可以工作,但测试找不到相同的源

问题描述 投票:0回答:1

我创建了一个简单的源生成器,运行良好

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
using System.Text;

namespace TestGenerator;

[Generator]
public class TestGenerator : IIncrementalGenerator
{

    public void Initialize(IncrementalGeneratorInitializationContext context)
    {
        // Register a syntax receiver to collect information during the initial parsing phase
        var classDeclarations = context.SyntaxProvider.ForAttributeWithMetadataName(
                "TestGenerator.TestSourceGeneratorAttribute",

                predicate: static (s, _) => (s is ClassDeclarationSyntax || s is StructDeclarationSyntax) && s is TypeDeclarationSyntax type && type.Modifiers.Any(SyntaxKind.PartialKeyword),
                transform: static (ctx, _) =>
                {
                    if (ctx.TargetNode is TypeDeclarationSyntax typeDeclarationSyntax)
                    {
                        return typeDeclarationSyntax.Identifier.ToString();
                    }
                    return null;
                })
            .Where(static m => m is not null);
        var compilationAndClasses = classDeclarations.Collect();

        // Set up the generation phase
        context.RegisterSourceOutput(compilationAndClasses, static (spc, classes) =>
        {
            foreach (var typeDefinition in classes)
            {
                // Add the generated source to the output
                spc.AddSource($"{typeDefinition}.g.cs",
                    SourceText.From(GetSource(typeDefinition), Encoding.UTF8));
            }
        });
    }

    private static string GetSource(string source)
    {
        return $"""
            //<auto-generated/>
            #nullable enable
            using System;
            
            /// {source}
            """;
    }
}

向测试项目添加了一个类

namespace TestGenerator.Test
{
    [TestSourceGenerator]
    public partial class TestClassGenerated
    {

    }
}

源生成得很好

//<auto-generated/>
#nullable enable
using System;

/// TestClassGenerated

然后我创建了一个单元测试

using Microsoft.CodeAnalysis.CSharp.Testing;
using Microsoft.CodeAnalysis.Testing;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Threading.Tasks;

namespace TestGenerator.Test;

[TestClass]
public class TestGeneratorUnitTest
{
    [TestMethod]
    public async Task Test123()
    {
        // Arrange
        var source = """
            using System;

            namespace TestGenerator.Test
            {
                [TestSourceGenerator]
                public partial class MyClass
                {

                }
            }
            """;

        var expectedGeneratedCode = @"
                //<auto-generated/>
                #nullable enable
                using System;

                /// MyClass
                ";

        var test = new CSharpSourceGeneratorTest<TestGenerator, DefaultVerifier>
        {
            TestState =
            {
                Sources = { source },
                GeneratedSources =
                {
                    (typeof(TestGenerator), "MyClass.g.cs", expectedGeneratedCode)
                }
            }
        };

        // Act & Assert
        await test.RunAsync();
    }
}

对于测试,它不会过滤类,谓词为真,但不会进入转换

我创建了一个复制品添加到这里

https://github.com/luizfbicalho/TestSourceGenerator

我希望测试生成 MyClass 文件

c# .net roslyn roslyn-code-analysis sourcegenerators
1个回答
0
投票

我得到了帮助,这就是解决方案

我错过了参考资料

      var references = AppDomain.CurrentDomain.GetAssemblies()
    .Where(a => !a.IsDynamic && !string.IsNullOrWhiteSpace(a.Location))
    .Select(a => MetadataReference.CreateFromFile(a.Location))

      CSharpCompilation compilation = CSharpCompilation.Create(
          assemblyName: "Tests",
          syntaxTrees: new[] { syntaxTree },
          references: references,
          options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, nullableContextOptions: NullableContextOptions.Enable));
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.