Unity 6.3
0 онлайн 78 гостей 3 в системе
Вход
Программирование в Unity Шаг 208 из 210

Дополнительные файлы для анализаторов Roslyn и генераторов источников

Вы можете добавить дополнительные файлы в ваш проект для анализатора Roslyn или генератора источников для потребления. Unity Editor распознает файлы как дополнительные файлы для анализаторов Roslyn, если они имеют расширение .additionalfile и находятся где-то в папке Assets или одной из ее подпапок.

Название дополнительных файлов

Для передачи в конвейер компиляции файлы должны иметь название в соответствии с форматом Filename.[Analyzer Name].additionalfile. Файлы, в которых отсутствует компонент [Analyzer Name], импортируются, но не передаются в конвейер компиляции. Компонент [Analyzer Name] учитывает регистр и должен соответствовать имени анализатора дополнительных файлов. Компонент Filename не должен содержать символ точки (.).

Дополнительная фильтрация файлов

Каждая скомпилированная сборка получает список дополнительных файлов на основе анализаторов, запущенных для этой сборки. определение сборки, отфильтрованные по [Analyzer Name]. Например, рассмотрим проект со следующими сборками и анализаторами:

  • Assembly1 использует анализатор под названием Analyzer1
  • Assembly2 использует анализатор под названием Analyzer2
  • Assembly3 использует и Analyzer1 и Analyzer2

Если проект содержит четыре дополнительных файла с именами FileA.Analyzer1.additionalfile, FileB.Analyzer2.additionalfile, FileC.additionalfileи FileD.Analyzer3.additionalfile, то Unity передает следующий список дополнительных файлов с соответствующими сборками:

  • Assembly1: FileA.Analyzer1.additionalfile
  • Assembly2: FileB.Analyzer2.additionalfile
  • Assembly3: FileA.Analyzer1.additionalfile, FileB.Analyzer2.additionalfile

Поскольку FileC не имеет компонента [Analyzer Name], а FileD ссылается на анализатор, который не присутствует в проекте, Unity не передает ни один из них в конвейер компиляции.

Получение доступных дополнительных файлов из кода

Анализаторы могут извлечь полный список дополнительных файлов, включенных в компилированную сборку, из контекста анализатора. Этот список содержит все дополнительные файлы, включенные в сборку, а не только те, которые соответствуют имени текущего анализатора. Следующий пример демонстрирует это:

using System.IO;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace SourceGeneratorTest1;


[Generator]
public class SG2 : ISourceGenerator
{
    public void Execute(GeneratorExecutionContext context)
    {
        var pathOfFileWithTypeName = context.AdditionalFiles.FirstOrDefault(file => file.Path.Contains("GenerateType.SourceGenerator.Test.2.additionalfile"));
        if (pathOfFileWithTypeName == null)
        {
            // no additional file found, do not generate a type.
            return;
        }

        var @namespace = context.Compilation.SyntaxTrees.First().GetRoot().DescendantNodes().OfType<NamespaceDeclarationSyntax>().FirstOrDefault()?.Name?.ToString() ?? "NoNamespace";

        // an additional file has been passed; read the type name from the file.
        string generatedTypeName = File.ReadAllText(pathOfFileWithTypeName.Path);

        context.AddSource(
            "SG2.generated.cs", 
            $$"""
            namespace {{@namespace}}
            {
                public partial class {{generatedTypeName}}
                {
                }
            }
            """);
    }

    public void Initialize(GeneratorInitializationContext context)
    {
    }
}

Примечание: Этот пример предназначен только для демонстрации использования контекста анализатора для проверки наличия дополнительных файлов. Генератор исходного кода, готовый к производству, требует более полного кода для обработки ошибок и обеспечения правильной функции и производительности.

В предыдущем пример фильтрации, Analyzer1 и Analyzer2 могут получить дополнительные файлы для Assembly3 Каждый анализатор отвечает за проверку того, есть ли в дополнительных файлах какие-либо данные, которые он может использовать.

Вы также можете получить список дополнительных файлов, включенных для данной сборки, используя свойства ScriptCompilerOptions.RoslynAdditionalFilePaths в редакторе кода.

Дополнительные ресурсы