private async Task <Document> CreateFieldAsync(CodeRefactoringContext context, SyntaxNode root, string interfaceName, string paramName, string fieldName, CancellationToken cancellationToken) { var @namespace = (NamespaceDeclarationSyntax) root.ChildNodes().First(n => n.Kind() == SyntaxKind.NamespaceDeclaration); var @class = (ClassDeclarationSyntax) @namespace.ChildNodes().First(n => n.Kind() == SyntaxKind.ClassDeclaration); var constructor = (ConstructorDeclarationSyntax) @class.ChildNodes().First(n => n.Kind() == SyntaxKind.ConstructorDeclaration); var existingDependencies = RoslynHelpers.InjectedInterfacesForConstuctor(constructor); var oldConstructor = constructor; var newConstructor = oldConstructor.WithBody(oldConstructor.Body.AddStatements( SyntaxFactory.ExpressionStatement( SyntaxFactory.AssignmentExpression( SyntaxKind.SimpleAssignmentExpression, SyntaxFactory.IdentifierName(fieldName), SyntaxFactory.IdentifierName(paramName))))); newConstructor = newConstructor.WithParameterList(newConstructor.ParameterList.AddParameters( SyntaxFactory.Parameter( SyntaxFactory.Identifier(paramName)) .WithType(SyntaxFactory.ParseTypeName(interfaceName)) )); var oldClass = @class; var oldClassWithNewCtor = oldClass.ReplaceNode(oldConstructor, newConstructor); var fieldDeclaration = RoslynHelpers.CreateFieldDeclaration(interfaceName, fieldName); var newClass = oldClassWithNewCtor .WithMembers(oldClassWithNewCtor.Members.Insert(RoslynHelpers.CorrectIndexToAddNewField(oldClassWithNewCtor), fieldDeclaration)) .WithAdditionalAnnotations(Formatter.Annotation); var oldRoot = await context.Document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); var newRoot = oldRoot.ReplaceNode(oldClass, newClass); return(context.Document.WithSyntaxRoot(newRoot)); }
private async Task <Document> CreateFieldAsync(CodeRefactoringContext context, ParameterSyntax parameter, string paramName, string fieldName, CancellationToken cancellationToken) { var oldConstructor = parameter.Ancestors().OfType <ConstructorDeclarationSyntax>().First(); var newConstructor = oldConstructor.WithBody(oldConstructor.Body.AddStatements( SyntaxFactory.ExpressionStatement( SyntaxFactory.AssignmentExpression( SyntaxKind.SimpleAssignmentExpression, SyntaxFactory.IdentifierName(fieldName), SyntaxFactory.IdentifierName(paramName))))); var oldClass = parameter.FirstAncestorOrSelf <ClassDeclarationSyntax>(); var oldClassWithNewCtor = oldClass.ReplaceNode(oldConstructor, newConstructor); var fieldDeclaration = RoslynHelpers.CreateFieldDeclaration(RoslynHelpers.GetParameterType(parameter), fieldName); var newClass = oldClassWithNewCtor .WithMembers(oldClassWithNewCtor.Members.Insert(0, fieldDeclaration)) .WithAdditionalAnnotations(Formatter.Annotation); var oldRoot = await context.Document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); var newRoot = oldRoot.ReplaceNode(oldClass, newClass); return(context.Document.WithSyntaxRoot(newRoot)); }