private static async Task <Document> ApplyAddUsingFixAsync(CodeFixContext context, LocalDeclarationStatementSyntax statement, ITypeSymbol type, CancellationToken cancellationToken) { var editor = await DocumentEditor.CreateAsync(context.Document, cancellationToken).ConfigureAwait(false); var containingType = statement.FirstAncestor <TypeDeclarationSyntax>(); var usesUnderscoreNames = containingType.UsesUnderscoreNames(editor.SemanticModel, cancellationToken); var variableDeclarator = statement.Declaration.Variables[0]; var identifier = variableDeclarator.Identifier; var field = editor.AddField( containingType, usesUnderscoreNames ? "_" + identifier.ValueText : identifier.ValueText, Accessibility.Private, DeclarationModifiers.ReadOnly, type, CancellationToken.None); var fieldAccess = usesUnderscoreNames ? SyntaxFactory.IdentifierName(field.Name()) : SyntaxFactory.ParseExpression($"this.{field.Name()}"); editor.ReplaceNode( statement, SyntaxFactory.ExpressionStatement( (ExpressionSyntax)editor.Generator.AssignmentStatement( fieldAccess, variableDeclarator.Initializer.Value)) .WithLeadingTrivia(statement.GetLeadingTrivia()) .WithTrailingTrivia(statement.GetTrailingTrivia())); return(editor.GetChangedDocument()); }
private static async Task <Document> ApplyAddUsingFixAsync(CodeFixContext context, LocalDeclarationStatementSyntax statement, ITypeSymbol type) { var editor = await DocumentEditor.CreateAsync(context.Document).ConfigureAwait(false); var usesUnderscoreNames = editor.SemanticModel.SyntaxTree.GetRoot().UsesUnderscoreNames(editor.SemanticModel, CancellationToken.None); var identifier = statement.Declaration.Variables[0].Identifier; var name = usesUnderscoreNames ? "_" + identifier.ValueText : identifier.ValueText; var containingType = statement.FirstAncestor <TypeDeclarationSyntax>(); var declaredSymbol = editor.SemanticModel.GetDeclaredSymbol(containingType); while (declaredSymbol.MemberNames.Contains(name)) { name += "_"; } var newField = (FieldDeclarationSyntax)editor.Generator.FieldDeclaration( name, accessibility: Accessibility.Private, modifiers: DeclarationModifiers.ReadOnly, type: SyntaxFactory.ParseTypeName(type.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat))); var members = containingType.Members; if (members.TryGetFirst(x => x is FieldDeclarationSyntax, out MemberDeclarationSyntax field)) { editor.InsertBefore(field, new[] { newField }); } else if (members.TryGetFirst(out field)) { editor.InsertBefore(field, new[] { newField }); } else { editor.AddMember(containingType, newField); } var fieldAccess = usesUnderscoreNames ? SyntaxFactory.IdentifierName(name) : SyntaxFactory.ParseExpression($"this.{name}"); editor.ReplaceNode( statement, SyntaxFactory.ExpressionStatement( (ExpressionSyntax)editor.Generator.AssignmentStatement( fieldAccess, statement.Declaration.Variables[0].Initializer.Value)) .WithLeadingTrivia(statement.GetLeadingTrivia()) .WithTrailingTrivia(statement.GetTrailingTrivia())); return(editor.GetChangedDocument()); }
private static async Task <Document> ApplyAddUsingFixAsync(CodeFixContext context, LocalDeclarationStatementSyntax statement) { var editor = await DocumentEditor.CreateAsync(context.Document).ConfigureAwait(false); var statements = statement.FirstAncestor <BlockSyntax>().Statements.Where(s => s.SpanStart > statement.SpanStart); foreach (var statementSyntax in statements) { editor.RemoveNode(statementSyntax); } editor.ReplaceNode( statement, SyntaxFactory.UsingStatement( declaration: statement.Declaration, expression: null, statement: SyntaxFactory.Block(SyntaxFactory.List(statements)))); return(editor.GetChangedDocument()); }