Я пытаюсь сгенерировать код с помощью 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
и т.д.
Есть ли более простой способ достичь этого?
Начиная с VS 2015 CTP 6 и пакетов Roslyn 1.0-rc1 NuGet, взгляните на класс SyntaxGenerator
.
Учитывая ответ Кевина, это то, к чему я пришел:
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
модификатора, потому что в противном случае они игнорируются.
SyntaxGenerator
. Не могли бы вы взглянуть и на этот вопрос? codereview.stackexchange.com/questions/84932/...SyntaxGenerator
с моим текущим дизайном, потому что я отделил создание рабочей области от генерации кода. У части генерации кода больше нетDocument
илиWorkspace
с которой можно создатьSyntaxGenerator
. Вероятно, я делаю это неправильно ™