Как найти путь к файлу объявления класса в генераторе исходного кода
Название в значительной степени объясняет это. Я пишу генератор исходного кода и хотел бы знать, как найти путь к файлу заданного
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