private static void UncommentSpan( ICommentSelectionService service, SnapshotSpan span, ArrayBuilder <TextChange> textChanges, ArrayBuilder <CommentTrackingSpan> spansToSelect) { var info = service.GetInfo(); // If the selection is exactly a block comment, use it as priority over single line comments. if (info.SupportsBlockComment && TryUncommentExactlyBlockComment(info, span, textChanges, spansToSelect)) { return; } if (info.SupportsSingleLineComment && TryUncommentSingleLineComments(info, span, textChanges, spansToSelect)) { return; } // We didn't make any single line changes. If the language supports block comments, see // if we're inside a containing block comment and uncomment that. if (info.SupportsBlockComment) { UncommentContainingBlockComment(info, span, textChanges, spansToSelect); } }
private static void CommentSpan( ICommentSelectionService service, SnapshotSpan span, ArrayBuilder <TextChange> textChanges, ArrayBuilder <CommentTrackingSpan> trackingSpans) { var(firstLine, lastLine) = DetermineFirstAndLastLine(span); if (span.IsEmpty && firstLine.IsEmptyOrWhitespace()) { // No selection, and on an empty line, don't do anything. return; } if (!span.IsEmpty && string.IsNullOrWhiteSpace(span.GetText())) { // Just whitespace selected, don't do anything. return; } // Get the information from the language as to how they'd like to comment this region. var commentInfo = service.GetInfo(); if (!commentInfo.SupportsBlockComment && !commentInfo.SupportsSingleLineComment) { // Neither type of comment supported. return; } if (commentInfo.SupportsBlockComment && !commentInfo.SupportsSingleLineComment) { // Only block comments supported here. If there is a span, just surround that // span with a block comment. If tehre is no span then surround the entire line // with a block comment. if (span.IsEmpty) { var firstNonWhitespaceOnLine = firstLine.GetFirstNonWhitespacePosition(); var insertPosition = firstNonWhitespaceOnLine ?? firstLine.Start; span = new SnapshotSpan(span.Snapshot, Span.FromBounds(insertPosition, firstLine.End)); } AddBlockComment(span, textChanges, trackingSpans, commentInfo); } else if (!commentInfo.SupportsBlockComment && commentInfo.SupportsSingleLineComment) { // Only single line comments supported here. AddSingleLineComments(span, textChanges, trackingSpans, firstLine, lastLine, commentInfo); } else { // both comment forms supported. Do a block comment only if a portion of code is // selected on a single line, otherwise comment out all the lines using single-line // comments. if (!span.IsEmpty && !SpanIncludesAllTextOnIncludedLines(span) && firstLine.LineNumber == lastLine.LineNumber) { AddBlockComment(span, textChanges, trackingSpans, commentInfo); } else { AddSingleLineComments(span, textChanges, trackingSpans, firstLine, lastLine, commentInfo); } } }