Генерация синтаксиса для сигнатуры метода из символа метода в Roslyn

1

Я пытаюсь сгенерировать код с помощью Roslyn (первый пользователь). Я нахожу это настолько подробным, что могу только предположить, что я делаю что-то неправильно. На данный момент я генерирую реализацию метода для данного IMethodSymbol (который пришел из интерфейса):

private static MethodDeclarationSyntax GetMethodDeclarationSyntax(IMethodSymbol methodSymbol)
{
    if (methodSymbol.MethodKind != MethodKind.Ordinary)
    {
        return null;
    }

    var parameters = methodSymbol
        .Parameters
        .Select(x => SF
            .Parameter(SF.Identifier(x.Name))
            .WithType(SF.IdentifierName(x.Type.ToDisplayString(symbolDisplayFormat))));

    return SF
        .MethodDeclaration(
            SF.IdentifierName(methodSymbol.ReturnType.ToDisplayString(symbolDisplayFormat)),
            SF.Identifier(methodSymbol.Name))
        .WithModifiers(
            SF.TokenList(
                SF.Token(SyntaxKind.PublicKeyword)))
        .WithParameterList(
            SF.ParameterList(
                SF.SeparatedList<ParameterSyntax>(parameters)));
}

Он уже довольно здоров, и я не учитывал фактическую реализацию, общие параметры, параметры ref/out и т.д.

Есть ли более простой способ достичь этого?

Теги:
roslyn

2 ответа

1
Лучший ответ

Начиная с VS 2015 CTP 6 и пакетов Roslyn 1.0-rc1 NuGet, взгляните на класс SyntaxGenerator.

  • 0
    Спасибо, Кевин. Я посмотрю на SyntaxGenerator . Не могли бы вы взглянуть и на этот вопрос? codereview.stackexchange.com/questions/84932/...
  • 0
    Хм, я действительно не понимаю, как я могу использовать SyntaxGenerator с моим текущим дизайном, потому что я отделил создание рабочей области от генерации кода. У части генерации кода больше нет Document или Workspace с которой можно создать SyntaxGenerator . Вероятно, я делаю это неправильно ™
Показать ещё 2 комментария
0

Учитывая ответ Кевина, это то, к чему я пришел:

var methodDeclaration = syntaxGenerator.MethodDeclaration(methodSymbol);
methodDeclaration = syntaxGenerator
    .WithModifiers(
        methodDeclaration,
        syntaxGenerator
            .GetModifiers(methodDeclaration)
            .WithIsAbstract(false));
methodDeclaration = syntaxGenerator
    .WithStatements(
        methodDeclaration,
        GetMethodStatementsSyntax(syntaxGenerator, semanticModel, methodSymbol));

Обратите внимание, что мы должны вручную удалить abstract модификатор из символа метода (поскольку он возник из интерфейса, он является abstract сути). Я также добавляю инструкции после удаления abstract модификатора, потому что в противном случае они игнорируются.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню