public static async Task <Document> RefactorAsync( Document document, LockStatementSyntax lockStatement, CancellationToken cancellationToken = default(CancellationToken)) { if (document == null) { throw new ArgumentNullException(nameof(document)); } if (lockStatement == null) { throw new ArgumentNullException(nameof(lockStatement)); } MemberDeclarationSyntax containingMember = lockStatement.FirstAncestorOrSelf <MemberDeclarationSyntax>(); if (containingMember != null) { var containingDeclaration = (MemberDeclarationSyntax)containingMember .Ancestors() .FirstOrDefault(f => f.IsKind( SyntaxKind.ClassDeclaration, SyntaxKind.InterfaceDeclaration, SyntaxKind.StructDeclaration)); if (containingDeclaration != null) { SyntaxList <MemberDeclarationSyntax> members = containingDeclaration.GetMembers(); int index = members.IndexOf(containingMember); SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); string name = Identifier.EnsureUniqueMemberName(LockObjectName, lockStatement.Expression.SpanStart, semanticModel, cancellationToken); LockStatementSyntax newLockStatement = lockStatement .WithExpression(IdentifierName(Identifier(name).WithRenameAnnotation())); MemberDeclarationSyntax newContainingMember = containingMember .ReplaceNode(lockStatement, newLockStatement); bool isStatic = containingMember.GetModifiers().Contains(SyntaxKind.StaticKeyword); FieldDeclarationSyntax field = CreateFieldDeclaration(name, isStatic).WithFormatterAnnotation(); SyntaxList <MemberDeclarationSyntax> newMembers = members.ReplaceAt(index, newContainingMember); newMembers = Inserter.InsertMember(newMembers, field); MemberDeclarationSyntax newNode = containingDeclaration.SetMembers(newMembers); return(await document.ReplaceNodeAsync(containingDeclaration, newNode, cancellationToken).ConfigureAwait(false)); } } return(document); }
private static async Task <Document> IntroduceFieldToLockOnAsync( Document document, LockStatementSyntax lockStatement, CancellationToken cancellationToken = default(CancellationToken)) { SyntaxNode root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); MemberDeclarationSyntax containingMember = lockStatement.FirstAncestorOrSelf <MemberDeclarationSyntax>(); if (containingMember != null) { var containingDeclaration = (MemberDeclarationSyntax)containingMember .Ancestors() .FirstOrDefault(f => f.IsKind( SyntaxKind.ClassDeclaration, SyntaxKind.InterfaceDeclaration, SyntaxKind.StructDeclaration)); if (containingDeclaration != null) { SyntaxList <MemberDeclarationSyntax> members = containingDeclaration.GetMembers(); int index = members.IndexOf(containingMember); string name = LockObjectName; if (document.SupportsSemanticModel) { SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); name = SyntaxUtility.GetUniqueName(name, semanticModel, lockStatement.Expression.Span.Start); } LockStatementSyntax newLockStatement = lockStatement .WithExpression(IdentifierName(name)); MemberDeclarationSyntax newContainingMember = containingMember .ReplaceNode(lockStatement, newLockStatement); bool isStatic = containingMember.GetModifiers().Contains(SyntaxKind.StaticKeyword); FieldDeclarationSyntax field = CreateField(name, isStatic).WithFormatterAnnotation(); SyntaxList <MemberDeclarationSyntax> newMembers = members .Replace(members[index], newContainingMember) .Insert(FindField(members, index) + 1, field); MemberDeclarationSyntax newNode = containingDeclaration.SetMembers(newMembers); SyntaxNode newRoot = root.ReplaceNode(containingDeclaration, newNode); return(document.WithSyntaxRoot(newRoot)); } } return(document); }
public override SyntaxNode VisitLockStatement(LockStatementSyntax node) { if (node != this.ContainerOfStatementsOrFieldToReplace) { return(base.VisitLockStatement(node)); } return(node.WithExpression(VisitNode(node.Expression)) .WithStatement(ReplaceStatementIfNeeded(node.Statement))); }
public static async Task <Document> RefactorAsync( Document document, LockStatementSyntax lockStatement, CancellationToken cancellationToken = default) { MemberDeclarationSyntax containingMember = lockStatement.FirstAncestor <MemberDeclarationSyntax>(); Debug.Assert(containingMember != null); if (containingMember == null) { return(document); } TypeDeclarationSyntax containingType = containingMember.FirstAncestor <TypeDeclarationSyntax>(); Debug.Assert(containingType != null); if (containingType == null) { return(document); } SyntaxList <MemberDeclarationSyntax> members = containingType.Members; int index = members.IndexOf(containingMember); SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); string name = NameGenerator.Default.EnsureUniqueLocalName( LockObjectName, semanticModel, lockStatement.Expression.SpanStart, cancellationToken: cancellationToken); LockStatementSyntax newLockStatement = lockStatement .WithExpression(IdentifierName(Identifier(name).WithRenameAnnotation())); MemberDeclarationSyntax newContainingMember = containingMember .ReplaceNode(lockStatement, newLockStatement); bool isStatic = SyntaxInfo.ModifierListInfo(containingMember).IsStatic; FieldDeclarationSyntax field = CreateFieldDeclaration(name, isStatic).WithFormatterAnnotation(); SyntaxList <MemberDeclarationSyntax> newMembers = members.ReplaceAt(index, newContainingMember); newMembers = MemberDeclarationInserter.Default.Insert(newMembers, field); MemberDeclarationSyntax newNode = containingType.WithMembers(newMembers); return(await document.ReplaceNodeAsync(containingType, newNode, cancellationToken).ConfigureAwait(false)); }
private static async Task <Document> IntroduceFieldToLockOnAsync( Document document, LockStatementSyntax lockStatement, CancellationToken cancellationToken) { SyntaxNode oldRoot = await document.GetSyntaxRootAsync(cancellationToken); MemberDeclarationSyntax containingMember = lockStatement.FirstAncestorOrSelf <MemberDeclarationSyntax>(); if (containingMember != null) { var containingDeclaration = (MemberDeclarationSyntax)containingMember .Ancestors() .FirstOrDefault(f => f.IsAnyKind( SyntaxKind.ClassDeclaration, SyntaxKind.InterfaceDeclaration, SyntaxKind.StructDeclaration)); if (containingDeclaration != null) { SyntaxList <MemberDeclarationSyntax> members = containingDeclaration.GetMembers(); int index = members.IndexOf(containingMember); LockStatementSyntax newLockStatement = lockStatement .WithExpression(IdentifierName(LockObjectName)); MemberDeclarationSyntax newContainingMember = containingMember .ReplaceNode(lockStatement, newLockStatement); FieldDeclarationSyntax field = CreateField() .WithAdditionalAnnotations(Formatter.Annotation); SyntaxList <MemberDeclarationSyntax> newMembers = members .Replace(members[index], newContainingMember) .Insert(FindField(members, index) + 1, field); MemberDeclarationSyntax newNode = containingDeclaration.SetMembers(newMembers); SyntaxNode newRoot = oldRoot.ReplaceNode(containingDeclaration, newNode); return(document.WithSyntaxRoot(newRoot)); } } return(document); }