2014-11-17 1 views
2

.NET 컴파일러 플랫폼 (roslyn)을 사용하여 코드 리팩터링을 구현하려고합니다. 그러나 어떤 이유로 ArgumentList와 함께 ObjectCreationExpression을 사용할 수 없습니다. 여기 내 방법 (전체 코드는 here를 찾을 수 있습니다)입니다 :CodeRefactoringProvider 안에 ArgumentList가있는 ObjectCreationExpression

private aync Task<Document> AddGuardAsync(Document document, ParameterSyntax parameter, BaseMethodDeclarationSyntax methodDeclaration, CancellationToken cancellationToken) 
{ 
    BinaryExpressionSyntax binaryExpression = SyntaxFactory.BinaryExpression(SyntaxKind.EqualsExpression, 
     SyntaxFactory.IdentifierName(parameter.Identifier), 
     SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)); 

    NameOfExpressionSyntax nameOfExp = SyntaxFactory.NameOfExpression(
     "nameof", 
     SyntaxFactory.ParseTypeName(parameter.Identifier.Text)); 

    SeparatedSyntaxList<ArgumentSyntax> argsList = new SeparatedSyntaxList<ArgumentSyntax>(); 
    argsList.Add(SyntaxFactory.Argument(nameOfExp)); 

    ObjectCreationExpressionSyntax objectCreationEx = SyntaxFactory.ObjectCreationExpression(
     SyntaxFactory.ParseTypeName(nameof(ArgumentNullException)), 
     SyntaxFactory.ArgumentList(argsList), 
     null); 

    ThrowStatementSyntax throwStatement = SyntaxFactory.ThrowStatement(objectCreationEx); 
    IfStatementSyntax ifStatement = SyntaxFactory 
     .IfStatement(SyntaxFactory.Token(SyntaxKind.IfKeyword), SyntaxFactory.Token(SyntaxKind.OpenParenToken), binaryExpression, SyntaxFactory.Token(SyntaxKind.CloseParenToken), throwStatement, null) 
     .WithAdditionalAnnotations(Formatter.Annotation); 

    SyntaxNode root = await document.GetSyntaxRootAsync(cancellationToken); 
    SyntaxNode newRoot = root.InsertNodesBefore(methodDeclaration.Body.ChildNodes().First(), new[] { ifStatement }); 

    return document.WithSyntaxRoot(newRoot); 
} 

이 이상하게 nameof 인수없이 다음 코드의 수정 제안을 생산하는 (심지어 중괄호없이)

enter image description here

무엇 내가 여기에없는거야?

답변

8

SeparatedSyntaxList<T>은 변경할 수 없습니다.
.Add()을 호출하면 토큰이 추가 된 새 목록이 반환됩니다.

새 목록을 무시하면 토큰이 나타나지 않습니다.

당신은

argsList = argsList.Add(SyntaxFactory.Argument(nameOfExp)); 
+0

아를 원하는, 감사합니다! 내가 왜 if 문에 중괄호를주지 않는지도 알고 있습니까? – tugberk

+0

중괄호가 필요한 경우 구문을 SyntaxFactory.BlockStatement로 묶습니다. –