private static TextSpan GetSpanWithoutAttributes(SyntaxNode node, SyntaxNode root, ISyntaxFactsService syntaxFacts) { // Span without AttributeLists // - No AttributeLists -> original .Span // - Some AttributeLists -> (first non-trivia/comment Token.Span.Begin, original.Span.End) // - We need to be mindful about comments due to: // // [Test1] // //Comment1 // [||]object Property1 { get; set; } // the comment node being part of the next token's (`object`) leading trivia and not the AttributeList's node. var attributeList = syntaxFacts.GetAttributeLists(node); if (attributeList.Any()) { var endOfAttributeLists = attributeList.Last().Span.End; var afterAttributesToken = root.FindTokenOnRightOfPosition(endOfAttributeLists); return(TextSpan.FromBounds(afterAttributesToken.Span.Start, node.Span.End)); } return(node.Span); }