Исправление кода Roslyn: создание метода с однострочным комментарием.C#

Место общения программистов C#
Ответить
Anonymous
 Исправление кода Roslyn: создание метода с однострочным комментарием.

Сообщение Anonymous »

Я новичок в исправлениях кода Roslyn и пытаюсь создать правильно отформатированный (отступы, разрывы строк) пустой метод с помощью однострочного комментария:
BEFORE< /strong>:

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

public class Bla
{
public void Blub()
{
Console.WriteLine("");
}
}
ПОСЛЕ[/b]:

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

public class Bla
{
public void Blub()
{
// I told you so
}
}
Я почти у цели, но мне всегда не хватает небольшого кусочка. Вот мои попытки:
v1 — Добавить комментарий через WithStatements
Код:

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

private static async Task RemoveContainOfDownMethod(Document document, BaseMethodDeclarationSyntax downMethodDeclaration, CancellationToken cancellationToken)
{
SyntaxTree? documentSyntaxTree = await document.GetSyntaxTreeAsync(cancellationToken);
if (documentSyntaxTree == null || downMethodDeclaration.Body == null)
{
return document;
}

var commentTrivia = SyntaxFactory.Comment("// I told you so.");
var emptyBlock = SyntaxFactory.Block()
.WithOpenBraceToken(downMethodDeclaration.Body.OpenBraceToken)
.WithCloseBraceToken(downMethodDeclaration.Body.CloseBraceToken)
.WithStatements(SyntaxFactory.SingletonList(
SyntaxFactory.EmptyStatement().WithLeadingTrivia(commentTrivia)));

CompilationUnitSyntax newDocument = documentSyntaxTree.GetCompilationUnitRoot(cancellationToken)
.ReplaceNode(
downMethodDeclaration.Body,
emptyBlock
.WithLeadingTrivia(downMethodDeclaration.Body.GetLeadingTrivia())
.WithTrailingTrivia(downMethodDeclaration.Body.GetTrailingTrivia()));

return document.WithSyntaxRoot(newDocument);
}
Даёт:

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

public class Bla
{
public void Blub()
{
// I told you so                                        ;
}
}
Недостаток:
  • Точка с запятой в конце
< h2>v2 — Добавление комментария через WithCloseBraceToken
Код:

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

private static async Task RemoveContainOfDownMethod(Document document, BaseMethodDeclarationSyntax downMethodDeclaration, CancellationToken cancellationToken)
{
SyntaxTree? documentSyntaxTree = await document.GetSyntaxTreeAsync(cancellationToken);
if (documentSyntaxTree == null || downMethodDeclaration.Body == null)
{
return document;
}

SyntaxTrivia commentTrivia = SyntaxFactory.Comment("// I told you so");
BlockSyntax emptyBlock = SyntaxFactory.Block()
.WithOpenBraceToken(SyntaxFactory.Token(SyntaxKind.OpenBraceToken))
.WithCloseBraceToken(SyntaxFactory.Token(SyntaxKind.CloseBraceToken).WithLeadingTrivia(commentTrivia));

CompilationUnitSyntax newDocument = documentSyntaxTree.GetCompilationUnitRoot(cancellationToken)
.ReplaceNode(
downMethodDeclaration.Body,
emptyBlock
.WithLeadingTrivia(downMethodDeclaration.Body.GetLeadingTrivia())
.WithTrailingTrivia(downMethodDeclaration.Body.GetTrailingTrivia()));

return document.WithSyntaxRoot(newDocument);
}
Даёт:

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

public class Bla
{
public void Blub()
{
// I told you so        }
}
Недостаток:
  • Отсутствует разрыв строки перед закрытием фигурной скобки Blub
v3 Добавление комментария через WithCloseBraceToken с помощью NormalizeWhitespace
Код:

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

private static async Task  RemoveContainOfDownMethod(Document document, BaseMethodDeclarationSyntax downMethodDeclaration, CancellationToken cancellationToken)
{
SyntaxTree? documentSyntaxTree = await document.GetSyntaxTreeAsync(cancellationToken);
if (documentSyntaxTree == null || downMethodDeclaration.Body == null)
{
return document;
}

SyntaxTrivia commentTrivia = SyntaxFactory.Comment("// I told you so");
BlockSyntax emptyBlock = SyntaxFactory.Block()
.WithOpenBraceToken(SyntaxFactory.Token(SyntaxKind.OpenBraceToken))
.WithCloseBraceToken(SyntaxFactory.Token(SyntaxKind.CloseBraceToken).WithLeadingTrivia(commentTrivia));

CompilationUnitSyntax newDocument = documentSyntaxTree.GetCompilationUnitRoot(cancellationToken)
.ReplaceNode(
downMethodDeclaration.Body,
emptyBlock
.WithLeadingTrivia(downMethodDeclaration.Body.GetLeadingTrivia())
.WithTrailingTrivia(downMethodDeclaration.Body.GetTrailingTrivia()))
.NormalizeWhitespace();

return document.WithSyntaxRoot(newDocument);
}
Даёт:

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

public class Bla
{
public void Blub()
{
// I told you so
}
}
Недостаток:
  • Неправильный отступ комментария


Подробнее здесь: https://stackoverflow.com/questions/790 ... ne-comment
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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