/// <summary> /// Add the necessary edits to uncomment out a single span. /// </summary> private void UncommentSpan( Document document, ICommentSelectionService service, SnapshotSpan span, ArrayBuilder <TextChange> textChanges, ArrayBuilder <CommentTrackingSpan> spansToSelect, CancellationToken cancellationToken) { var info = service.GetInfoAsync(document, span.Span.ToTextSpan(), cancellationToken).WaitAndGetResult(cancellationToken); // 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); } }
/// <summary> /// Add the necessary edits to uncomment out a single span. /// </summary> private void UncommentSpan( Document document, ICommentSelectionService service, SnapshotSpan span, List <TextChange> textChanges, List <ITrackingSpan> spansToSelect, CancellationToken cancellationToken) { var info = service.GetInfoAsync(document, span.Span.ToTextSpan(), cancellationToken).WaitAndGetResult(cancellationToken); if (info.SupportsSingleLineComment && TryUncommentSingleLineComments(info, span, textChanges, spansToSelect)) { return; } if (info.SupportsBlockComment) { UncommentContainingBlockComment(info, span, textChanges, spansToSelect); } }
internal async override Task<CommentSelectionResult> CollectEditsAsync(Document document, ICommentSelectionService service, ITextBuffer subjectBuffer, NormalizedSnapshotSpanCollection selectedSpans, ValueTuple command, CancellationToken cancellationToken) { using (Logger.LogBlock(FunctionId.CommandHandler_ToggleLineComment, KeyValueLogMessage.Create(LogType.UserAction, m => { m[LanguageNameString] = document.Project.Language; m[LengthString] = subjectBuffer.CurrentSnapshot.Length; }), cancellationToken)) { var commentInfo = await service.GetInfoAsync(document, selectedSpans.First().Span.ToTextSpan(), cancellationToken).ConfigureAwait(false); if (commentInfo.SupportsSingleLineComment) { return ToggleLineComment(commentInfo, selectedSpans); } return s_emptyCommentSelectionResult; } }
/// <summary> /// Add the necessary edits to comment out a single span. /// </summary> private void CommentSpan( Document document, ICommentSelectionService service, SnapshotSpan span, ArrayBuilder <TextChange> textChanges, ArrayBuilder <CommentTrackingSpan> trackingSpans, CancellationToken cancellationToken) { 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.GetInfoAsync(document, span.Span.ToTextSpan(), cancellationToken).WaitAndGetResult(cancellationToken); 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); } } }