Как найти путь к файлу объявления класса в генераторе исходного кода

Название в значительной степени объясняет это. Я пишу генератор исходного кода и хотел бы знать, как найти путь к файлу заданного ClassDeclarationSyntaxузел. Вот пример того, как я хотел бы его использовать.

      IEnumerable<SyntaxNode> allNodes = compilation.SyntaxTrees.SelectMany(s => s.GetRoot().DescendantNodes());
IEnumerable<ClassDeclarationSyntax> allClasses = allNodes.Where(d => d.IsKind(SyntaxKind.ClassDeclaration))
                                                         .OfType<ClassDeclarationSyntax>();
IEnumerable<string> filePaths = allClasses.Select(x=> x.GetFilePath());

2 ответа

Решение

Вы можете использовать следующий код, чтобы получить путь к содержащему его файлу:

      SyntaxNode node = ...;
_ = node.SyntaxTree.FilePath;
_ = node.GetLocation().SourceTree?.FilePath // SourceTree can be null

Для тех, кто хочет заставить это работать в модульных тестах. При создании SyntaxTree вручную необходимо также заполнить параметр пути.

      [Fact]
public Task ExecGenerator()
{
    var generator = new MyGenerator();
    // Create the driver that will control the generation, passing in our generator
    GeneratorDriver driver = CSharpGeneratorDriver.Create(generator);

    // Run the generation pass
    // (Note: the generator driver itself is immutable, and all calls return an updated version of the driver that you should use for subsequent calls)
    var compilation = CreateCompilation("MyFile.cs");
    return driver.RunGenerators(compilation);
}

private static Compilation CreateCompilation(string filePath)
{
    var source = File.ReadAllText(filePath);

    return CSharpCompilation.Create(
        assemblyName: "tests",
        syntaxTrees: new[] { CSharpSyntaxTree.ParseText(source, path: filePath) },
        references: new[]
        {
            MetadataReference.CreateFromFile(typeof(object).Assembly.Location)
        });
}

Затем в вашем генераторе вы можете использовать:

      syntaxNode.SyntaxTree.FilePath
Другие вопросы по тегам