Создавайте хорошо отформатированный синтаксис обнуляемого типа с 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();
}