Как с помощью генератора исходного кода создать источник, используя совокупность всех преобразованных узлов?C#

Место общения программистов C#
Anonymous
Как с помощью генератора исходного кода создать источник, используя совокупность всех преобразованных узлов?

Сообщение Anonymous »

Используя генератор исходного кода, я хочу сгенерировать один файл, построенный на основе совокупного списка всех преобразованных узлов (а не по одному).
Я это сделаю используйте пример на основе Enum, поскольку они распространены. Дано (упрощено для ясности):

Код: Выделить всё

        public void Initialize(IncrementalGeneratorInitializationContext context)
{
IncrementalValuesProvider sources = context.SyntaxProvider
.ForAttributeWithMetadataName(
MyEnumAttributeFullName,
predicate: (node, _) => node is EnumDeclarationSyntax,
transform: MyTransform)
.WithTrackingName("Gathering")
.Where(static node => node is not null)
.WithTrackingName("RemovingNulls");

context.RegisterSourceOutput(sources, static (context, sources) => Execute(context, in sources));
}
В этом примере Execute используется для создания исходного файла на основе преобразованного MyEnumData для каждого перечисления, помеченного MyEnumAttributeFullName.
Мой вопрос: как Могу ли я создать/зарегистрировать исходный файл на основе ВСЕХ сгенерированных MyEnumData (а не по одному)? Я ищу эффективное решение во время компиляции, которое не требует отражения во время выполнения.
По сути, я ищу эквивалент:

Код: Выделить всё

public void RegisterSourceOutput(IncrementalValuesProvider source, Action action)
Используется для создания одного файла, который создается с использованием агрегированного списка всех преобразованных узлов.
Это можно использовать для компиляции компиляции. реестры времени, которые позволяют избежать отражения во время выполнения. В этом примере перечислений это можно использовать для создания реестра всех перечислений, помеченных MyEnumAttributeFullName.
Моей первой мыслью было как-то вручную создать/заполнить это:

Код: Выделить всё

    IncrementalValuesProvider = ???
...и зарегистрируйте обработчик для обработки этого единственного узла. Но я не мог понять, как выполнить шаг населения. Кажется, это обычный шаблон использования, но я ничего не нашел.
РЕДАКТИРОВАТЬ: Хотя на этот вопрос был дан ответ, мне пришло в голову, что если вы создаете источники для нескольких проекты и хотите создать реестр, сгенерированный исходным кодом, в основном приложении, это, вероятно, должны быть два отдельных генератора, которые (по определению) не могут зависеть от результатов друг друга.

Подробнее здесь: https://stackoverflow.com/questions/784 ... all-transf

Вернуться в «C#»