private Positions StmtReplacementPositions(int tokPos, int tokLen, bool hasReplace) { var lineAtEndOfTag = Snapshot.GetLineFromPosition(tokPos + tokLen); var lineAtEndOfTagLen = lineAtEndOfTag.End.Position - lineAtEndOfTag.Start.Position; var lineAtEndOfTagText = lineAtEndOfTag.GetText(); var currentPos = tokPos + tokLen - lineAtEndOfTag.Start.Position; var trailingSemiBrace = false; for (; currentPos < lineAtEndOfTagLen; currentPos++) { var trailingSymbol = lineAtEndOfTagText[currentPos]; if (" \t".Contains(trailingSymbol)) { continue; } trailingSemiBrace = trailingSymbol == ';' || trailingSymbol == '}'; break; } var actualLength = trailingSemiBrace ? tokLen + 1 : tokLen; if (hasReplace) { return(new Positions(tokPos, actualLength)); } var line = Snapshot.GetLineFromPosition(tokPos); var lineText = line.Extent.GetText(); var trimmedLineLength = lineText.Trim().Length; var replacementSpan = new SnapshotSpan(Snapshot, tokPos, actualLength).GetText(); var linebreak = line.GetLineBreakText()[line.LineBreakLength - 1]; var taggedLines = replacementSpan.Split(linebreak); if (taggedLines.Length > 1 || trimmedLineLength > taggedLines[0].Length + 1) { return(new Positions(tokPos, actualLength)); } var startOfLine = line.Start.Position; var offsetToStartOfTextInLine = lineText.Length - lineText.TrimStart().Length; var wholeLength = actualLength + offsetToStartOfTextInLine + line.LineBreakLength; return(new Positions(startOfLine, wholeLength)); }