Создавайте хорошо отформатированный синтаксис обнуляемого типа с Roslyn при генерации кода, независимого от языка

Я использую Roslyn для создания того, что должно быть генератором кода, не зависящего от языка, для некоторого уровня доступа к данным. Он будет использовать метаданные для вывода нужного кода. Ожидается, что он вернет версии кода на C# и VB.NET.

Текущая реализация генерирует желаемый вывод, однако обнуляемые типы не отформатированы должным образом, вывод содержит дополнительные пробелы.

Есть ли опция, чтобы гарантировать, что обнуляемый тип генерируется SyntaxGenerator.NullableTypeExpression вернуть хорошо отформатированное - без пробелов - объявление?

Фрагменты кода

Это где SyntaxGenerator.NullableTypeExpression используется для возврата SyntaxNode, соответствующего типу свойства.

    private SyntaxNode ToTypeExpression(Type type, bool nullable, SyntaxGenerator generator)
    {

        SyntaxNode baseType;
        SyntaxNode propType;

        SpecialType specialType = ToSpecialType(type);

        if(specialType == SpecialType.None)
        {
            baseType = generator.IdentifierName(type.Name);                
        }
        else
        {
            baseType = generator.TypeExpression(specialType);
        }

        if (nullable && type.IsValueType)
        {
            propType = generator.NullableTypeExpression(baseType);
        }
        else
        {
            propType = baseType;
        }

        return propType;

    }

Это сгенерированный код VB.NET:

    Public Property Salary As Integer?
        Get
            Return GetAttributeValue(Of Integer?)("salary").Value
        End Get

        Set(value As Integer?)
            SetPropertyValue("Salary", "salary", value)
        End Set
    End Property

Это код C#, обратите внимание на пробелы:

    public int ? Salary
    {
        get
        {
            return GetAttributeValue<int ? >("salary").Value;
        }

        set
        {
            SetPropertyValue("Salary", "salary", value);
        }
    }

1 ответ

С помощью Formatter.Format как здесь предлагается: генерация хорошо отформатированного синтаксиса с Roslyn, удалила нежелательные пробелы.

        string textOutput;
        var sb = new StringBuilder();

        var result = generator.CompilationUnit(declarations);

        var formattedResult = Formatter.Format(result, workspace);

        using (StringWriter writer = new StringWriter(sb))
        {
            formattedResult.WriteTo(writer);
            textOutput = writer.ToString();
        }
Другие вопросы по тегам