提交 82c051a9 编写于 作者: D David Barbet

Add command handler and tests for toggle line comment.

上级 9d88fee4
......@@ -1907,7 +1907,29 @@ internal class EditorFeaturesResources {
return ResourceManager.GetString("Toggling_block_comment", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Toggle Line Comment.
/// </summary>
internal static string Toggle_Line_Comment
{
get
{
return ResourceManager.GetString("Toggle_Line_Comment", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Toggling line comment....
/// </summary>
internal static string Toggling_line_comment
{
get
{
return ResourceManager.GetString("Toggling_line_comment", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Type Parts.
/// </summary>
......
......@@ -895,4 +895,10 @@ Do you want to proceed?</value>
<data name="Toggling_block_comment" xml:space="preserve">
<value>Toggling block comment...</value>
</data>
<data name="Toggle_Line_Comment" xml:space="preserve">
<value>Toggle Line Comment</value>
</data>
<data name="Toggling_line_comment" xml:space="preserve">
<value>Toggling line comment...</value>
</data>
</root>
\ No newline at end of file
......@@ -147,6 +147,12 @@ internal static class PredefinedCommandHandlerNames
/// <remarks></remarks>
public const string ToggleBlockComment = "Toggle Block Comment Command Handler";
/// <summary>
/// Command handler name for Toggle Line Comments.
/// </summary>
/// <remarks></remarks>
public const string ToggleLineComment = "Toggle Line Comment Command Handler";
/// <summary>
/// Command handler name for Paste Content in Interactive Format.
/// </summary>
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
......@@ -11,6 +12,7 @@
using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
using Microsoft.CodeAnalysis.Text.Shared.Extensions;
using Microsoft.VisualStudio.Commanding;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
......@@ -200,5 +202,26 @@ private static Document Format(ICommentSelectionService service, ITextSnapshot s
var textSpans = changes.SelectAsArray(change => change.Span.ToTextSpan());
return service.FormatAsync(document, textSpans, cancellationToken).WaitAndGetResult(cancellationToken);
}
/// <summary>
/// Given a set of lines, find the minimum indent of all of the non-blank, non-whitespace lines.
/// </summary>
protected static int DetermineSmallestIndent(
SnapshotSpan span, ITextSnapshotLine firstLine, ITextSnapshotLine lastLine)
{
// TODO: This breaks if you have mixed tabs/spaces, and/or tabsize != indentsize.
var indentToCommentAt = int.MaxValue;
for (var lineNumber = firstLine.LineNumber; lineNumber <= lastLine.LineNumber; ++lineNumber)
{
var line = span.Snapshot.GetLineFromLineNumber(lineNumber);
var firstNonWhitespacePosition = line.GetFirstNonWhitespacePosition();
var firstNonWhitespaceOnLine = firstNonWhitespacePosition.HasValue
? firstNonWhitespacePosition.Value - line.Start
: int.MaxValue;
indentToCommentAt = Math.Min(indentToCommentAt, firstNonWhitespaceOnLine);
}
return indentToCommentAt;
}
}
}
......@@ -321,25 +321,6 @@ private void AddBlockComment(SnapshotSpan span, ArrayBuilder<TextChange> textCha
}
}
/// <summary> Given a set of lines, find the minimum indent of all of the non-blank, non-whitespace lines.</summary>
private static int DetermineSmallestIndent(
SnapshotSpan span, ITextSnapshotLine firstLine, ITextSnapshotLine lastLine)
{
// TODO: This breaks if you have mixed tabs/spaces, and/or tabsize != indentsize.
var indentToCommentAt = int.MaxValue;
for (var lineNumber = firstLine.LineNumber; lineNumber <= lastLine.LineNumber; ++lineNumber)
{
var line = span.Snapshot.GetLineFromLineNumber(lineNumber);
var firstNonWhitespacePosition = line.GetFirstNonWhitespacePosition();
var firstNonWhitespaceOnLine = firstNonWhitespacePosition.HasValue
? firstNonWhitespacePosition.Value - line.Start
: int.MaxValue;
indentToCommentAt = Math.Min(indentToCommentAt, firstNonWhitespaceOnLine);
}
return indentToCommentAt;
}
/// <summary>
/// Given a span, find the first and last line that are part of the span. NOTE: If the
/// span ends in column zero, we back up to the previous line, to handle the case where
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.ComponentModel.Composition;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CommentSelection;
using Microsoft.CodeAnalysis.Editor.Shared.Extensions;
using Microsoft.CodeAnalysis.Experiments;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
using Microsoft.CodeAnalysis.Text.Shared.Extensions;
using Microsoft.VisualStudio.Commanding;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor.Commanding.Commands;
using Microsoft.VisualStudio.Text.Operations;
using Microsoft.VisualStudio.Utilities;
using Roslyn.Utilities;
using VSCommanding = Microsoft.VisualStudio.Commanding;
namespace Microsoft.CodeAnalysis.Editor.Implementation.CommentSelection
{
[Export(typeof(VSCommanding.ICommandHandler))]
[ContentType(ContentTypeNames.RoslynContentType)]
[Name(PredefinedCommandHandlerNames.ToggleLineComment)]
internal class ToggleLineCommentCommandHandler :
// Value tuple to represent that there is no distinct command to be passed in.
AbstractCommentSelectionBase<ValueTuple>,
VSCommanding.ICommandHandler<ToggleLineCommentCommandArgs>
{
private static readonly CommentSelectionResult s_emptyCommentSelectionResult =
new CommentSelectionResult(new List<TextChange>(), new List<CommentTrackingSpan>(), Operation.Uncomment);
[ImportingConstructor]
[Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal ToggleLineCommentCommandHandler(
ITextUndoHistoryRegistry undoHistoryRegistry,
IEditorOperationsFactoryService editorOperationsFactoryService)
: base(undoHistoryRegistry, editorOperationsFactoryService)
{
}
public VSCommanding.CommandState GetCommandState(ToggleLineCommentCommandArgs args)
{
if (Workspace.TryGetWorkspace(args.SubjectBuffer.AsTextContainer(), out var workspace))
{
var experimentationService = workspace.Services.GetRequiredService<IExperimentationService>();
if (!experimentationService.IsExperimentEnabled(WellKnownExperimentNames.RoslynToggleLineComment))
{
return VSCommanding.CommandState.Unspecified;
}
}
return GetCommandState(args.SubjectBuffer);
}
public bool ExecuteCommand(ToggleLineCommentCommandArgs args, CommandExecutionContext context)
=> ExecuteCommand(args.TextView, args.SubjectBuffer, ValueTuple.Create(), context);
public override string DisplayName => EditorFeaturesResources.Toggle_Line_Comment;
protected override string GetTitle(ValueTuple command) => EditorFeaturesResources.Toggle_Line_Comment;
protected override string GetMessage(ValueTuple command) => EditorFeaturesResources.Toggling_line_comment;
internal async override Task<CommentSelectionResult> CollectEditsAsync(Document document, ICommentSelectionService service,
ITextBuffer subjectBuffer, NormalizedSnapshotSpanCollection selectedSpans, ValueTuple command, CancellationToken cancellationToken)
{
var experimentationService = document.Project.Solution.Workspace.Services.GetRequiredService<IExperimentationService>();
if (!experimentationService.IsExperimentEnabled(WellKnownExperimentNames.RoslynToggleLineComment))
{
return s_emptyCommentSelectionResult;
}
var commentInfo = await service.GetInfoAsync(document, selectedSpans.First().Span.ToTextSpan(), cancellationToken).ConfigureAwait(false);
if (commentInfo.SupportsSingleLineComment)
{
return ToggleLineComment(commentInfo, selectedSpans);
}
return s_emptyCommentSelectionResult;
}
private CommentSelectionResult ToggleLineComment(CommentSelectionInfo commentInfo,
NormalizedSnapshotSpanCollection selectedSpans)
{
var textChanges = ArrayBuilder<TextChange>.GetInstance();
var trackingSpans = ArrayBuilder<CommentTrackingSpan>.GetInstance();
var linesInSelections = selectedSpans.ToDictionary(
span => span,
span => GetLinesFromSelectedSpan(span).ToImmutableArray());
Operation operation;
// If all the selections are fully commented, uncomment.
if (!linesInSelections.Values.Where(lines => SelectionHasUncommentedLines(lines, commentInfo)).Any())
{
foreach (var selection in linesInSelections)
{
UncommentLines(selection.Value, textChanges, trackingSpans, commentInfo);
}
operation = Operation.Uncomment;
}
else
{
foreach (var selection in linesInSelections)
{
CommentLines(selection.Key, selection.Value, textChanges, trackingSpans, commentInfo);
}
operation = Operation.Comment;
}
return new CommentSelectionResult(textChanges, trackingSpans, operation);
}
private static void UncommentLines(ImmutableArray<ITextSnapshotLine> commentedLines, ArrayBuilder<TextChange> textChanges,
ArrayBuilder<CommentTrackingSpan> trackingSpans, CommentSelectionInfo commentInfo)
{
foreach (var line in commentedLines)
{
if (!line.IsEmptyOrWhitespace())
{
var text = line.GetText();
var commentIndex = text.IndexOf(commentInfo.SingleLineCommentString) + line.Start;
var spanToRemove = TextSpan.FromBounds(commentIndex, commentIndex + commentInfo.SingleLineCommentString.Length);
DeleteText(textChanges, spanToRemove);
}
}
trackingSpans.Add(new CommentTrackingSpan(TextSpan.FromBounds(commentedLines.First().Start, commentedLines.Last().End)));
}
private static void CommentLines(SnapshotSpan selectedSpan, ImmutableArray<ITextSnapshotLine> linesInSelection,
ArrayBuilder<TextChange> textChanges, ArrayBuilder<CommentTrackingSpan> trackingSpans, CommentSelectionInfo commentInfo)
{
var indentation = DetermineSmallestIndent(selectedSpan, linesInSelection.First(), linesInSelection.Last());
foreach (var line in linesInSelection)
{
if (!line.IsEmptyOrWhitespace())
{
InsertText(textChanges, line.Start + indentation, commentInfo.SingleLineCommentString);
}
}
trackingSpans.Add(new CommentTrackingSpan(
TextSpan.FromBounds(linesInSelection.First().Start, linesInSelection.Last().End)));
}
private List<ITextSnapshotLine> GetLinesFromSelectedSpan(SnapshotSpan span)
{
var lines = new List<ITextSnapshotLine>();
var startLine = span.Snapshot.GetLineFromPosition(span.Start);
var endLine = span.Snapshot.GetLineFromPosition(span.End);
// Don't include the last line if the span is just the start of the line.
if (endLine.Start == span.End.Position && !span.IsEmpty)
{
endLine = endLine.GetPreviousMatchingLine(_ => true);
}
if (startLine.LineNumber <= endLine.LineNumber)
{
for (var i = startLine.LineNumber; i <= endLine.LineNumber; i++)
{
lines.Add(span.Snapshot.GetLineFromLineNumber(i));
}
}
return lines;
}
private bool SelectionHasUncommentedLines(ImmutableArray<ITextSnapshotLine> linesInSelection, CommentSelectionInfo commentInfo)
=> linesInSelection.Where(l => !IsLineCommented(l, commentInfo)).Any();
private static bool IsLineCommented(ITextSnapshotLine line, CommentSelectionInfo info)
{
var lineText = line.GetText();
if (lineText.Trim().StartsWith(info.SingleLineCommentString, StringComparison.Ordinal) || line.IsEmptyOrWhitespace())
{
return true;
}
return false;
}
}
}
......@@ -1294,6 +1294,16 @@ Chcete pokračovat?</target>
<target state="new">Toggle Block Comment</target>
<note />
</trans-unit>
<trans-unit id="Toggling_line_comment">
<source>Toggling line comment...</source>
<target state="new">Toggling line comment...</target>
<note />
</trans-unit>
<trans-unit id="Toggle_Line_Comment">
<source>Toggle Line Comment</source>
<target state="new">Toggle Line Comment</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -1294,6 +1294,16 @@ Möchten Sie fortfahren?</target>
<target state="new">Toggle Block Comment</target>
<note />
</trans-unit>
<trans-unit id="Toggling_line_comment">
<source>Toggling line comment...</source>
<target state="new">Toggling line comment...</target>
<note />
</trans-unit>
<trans-unit id="Toggle_Line_Comment">
<source>Toggle Line Comment</source>
<target state="new">Toggle Line Comment</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -1294,6 +1294,16 @@ Do you want to proceed?</source>
<target state="new">Toggle Block Comment</target>
<note />
</trans-unit>
<trans-unit id="Toggling_line_comment">
<source>Toggling line comment...</source>
<target state="new">Toggling line comment...</target>
<note />
</trans-unit>
<trans-unit id="Toggle_Line_Comment">
<source>Toggle Line Comment</source>
<target state="new">Toggle Line Comment</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -1294,6 +1294,16 @@ Voulez-vous continuer ?</target>
<target state="new">Toggle Block Comment</target>
<note />
</trans-unit>
<trans-unit id="Toggling_line_comment">
<source>Toggling line comment...</source>
<target state="new">Toggling line comment...</target>
<note />
</trans-unit>
<trans-unit id="Toggle_Line_Comment">
<source>Toggle Line Comment</source>
<target state="new">Toggle Line Comment</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -1294,6 +1294,16 @@ Continuare?</target>
<target state="new">Toggle Block Comment</target>
<note />
</trans-unit>
<trans-unit id="Toggling_line_comment">
<source>Toggling line comment...</source>
<target state="new">Toggling line comment...</target>
<note />
</trans-unit>
<trans-unit id="Toggle_Line_Comment">
<source>Toggle Line Comment</source>
<target state="new">Toggle Line Comment</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -1294,6 +1294,16 @@ Do you want to proceed?</source>
<target state="new">Toggle Block Comment</target>
<note />
</trans-unit>
<trans-unit id="Toggling_line_comment">
<source>Toggling line comment...</source>
<target state="new">Toggling line comment...</target>
<note />
</trans-unit>
<trans-unit id="Toggle_Line_Comment">
<source>Toggle Line Comment</source>
<target state="new">Toggle Line Comment</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -97,6 +97,16 @@
<target state="translated">기호 - 정적</target>
<note />
</trans-unit>
<trans-unit id="Toggle_Line_Comment">
<source>Toggle Line Comment</source>
<target state="new">Toggle Line Comment</target>
<note />
</trans-unit>
<trans-unit id="Toggling_line_comment">
<source>Toggling line comment...</source>
<target state="new">Toggling line comment...</target>
<note />
</trans-unit>
<trans-unit id="User_Members_Constants">
<source>User Members - Constants</source>
<target state="translated">사용자 멤버 - 상수</target>
......
......@@ -97,6 +97,16 @@
<target state="translated">Symbol — statyczny</target>
<note />
</trans-unit>
<trans-unit id="Toggle_Line_Comment">
<source>Toggle Line Comment</source>
<target state="new">Toggle Line Comment</target>
<note />
</trans-unit>
<trans-unit id="Toggling_line_comment">
<source>Toggling line comment...</source>
<target state="new">Toggling line comment...</target>
<note />
</trans-unit>
<trans-unit id="User_Members_Constants">
<source>User Members - Constants</source>
<target state="translated">Składowe użytkowników — stałe</target>
......
......@@ -97,6 +97,16 @@
<target state="translated">Símbolo – Estático</target>
<note />
</trans-unit>
<trans-unit id="Toggle_Line_Comment">
<source>Toggle Line Comment</source>
<target state="new">Toggle Line Comment</target>
<note />
</trans-unit>
<trans-unit id="Toggling_line_comment">
<source>Toggling line comment...</source>
<target state="new">Toggling line comment...</target>
<note />
</trans-unit>
<trans-unit id="User_Members_Constants">
<source>User Members - Constants</source>
<target state="translated">Membros de Usuário – Constantes</target>
......
......@@ -97,6 +97,16 @@
<target state="translated">Символ — статический</target>
<note />
</trans-unit>
<trans-unit id="Toggle_Line_Comment">
<source>Toggle Line Comment</source>
<target state="new">Toggle Line Comment</target>
<note />
</trans-unit>
<trans-unit id="Toggling_line_comment">
<source>Toggling line comment...</source>
<target state="new">Toggling line comment...</target>
<note />
</trans-unit>
<trans-unit id="User_Members_Constants">
<source>User Members - Constants</source>
<target state="translated">Участники-пользователи — константы</target>
......
......@@ -97,6 +97,16 @@
<target state="translated">Sembol - statik</target>
<note />
</trans-unit>
<trans-unit id="Toggle_Line_Comment">
<source>Toggle Line Comment</source>
<target state="new">Toggle Line Comment</target>
<note />
</trans-unit>
<trans-unit id="Toggling_line_comment">
<source>Toggling line comment...</source>
<target state="new">Toggling line comment...</target>
<note />
</trans-unit>
<trans-unit id="User_Members_Constants">
<source>User Members - Constants</source>
<target state="translated">Kullanıcı Üyeler - Sabitler</target>
......
......@@ -97,6 +97,16 @@
<target state="translated">符号-静态</target>
<note />
</trans-unit>
<trans-unit id="Toggle_Line_Comment">
<source>Toggle Line Comment</source>
<target state="new">Toggle Line Comment</target>
<note />
</trans-unit>
<trans-unit id="Toggling_line_comment">
<source>Toggling line comment...</source>
<target state="new">Toggling line comment...</target>
<note />
</trans-unit>
<trans-unit id="User_Members_Constants">
<source>User Members - Constants</source>
<target state="translated">用户成员-常量</target>
......
......@@ -97,6 +97,16 @@
<target state="translated">符號 - 靜態</target>
<note />
</trans-unit>
<trans-unit id="Toggle_Line_Comment">
<source>Toggle Line Comment</source>
<target state="new">Toggle Line Comment</target>
<note />
</trans-unit>
<trans-unit id="Toggling_line_comment">
<source>Toggling line comment...</source>
<target state="new">Toggling line comment...</target>
<note />
</trans-unit>
<trans-unit id="User_Members_Constants">
<source>User Members - Constants</source>
<target state="translated">使用者成員 - 常數</target>
......
......@@ -21,28 +21,30 @@
namespace Microsoft.CodeAnalysis.Editor.UnitTests.CommentSelection
{
public abstract class AbstractToggleBlockCommentTestBase
public abstract class AbstractToggleCommentTestBase
{
abstract internal ToggleBlockCommentCommandHandler GetToggleBlockCommentCommandHandler(TestWorkspace workspace);
abstract internal AbstractCommentSelectionBase<ValueTuple> GetToggleCommentCommandHandler(TestWorkspace workspace);
protected void ToggleBlockComment(string markup, string expected)
protected void ToggleComment(string markup, string expected, bool vbWorkspace = false)
{
ToggleBlockCommentMultiple(markup, new string[] { expected });
ToggleCommentMultiple(markup, new string[] { expected }, vbWorkspace);
}
protected void ToggleBlockCommentMultiple(string markup, string[] expectedText)
protected void ToggleCommentMultiple(string markup, string[] expectedText, bool vbWorkspace = false)
{
var exportProvider = ExportProviderCache
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithPart(typeof(MockToggleBlockCommentExperimentationService)))
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithPart(typeof(MockToggleCommentExperimentationService)))
.CreateExportProvider();
using (var workspace = TestWorkspace.CreateCSharp(markup, exportProvider: exportProvider))
using (var workspace = vbWorkspace
? TestWorkspace.CreateVisualBasic(markup, exportProvider: exportProvider)
: TestWorkspace.CreateCSharp(markup, exportProvider: exportProvider))
{
var doc = workspace.Documents.First();
SetupSelection(doc.GetTextView(), doc.SelectedSpans.Select(s => Span.FromBounds(s.Start, s.End)));
var commandHandler = GetToggleBlockCommentCommandHandler(workspace);
var commandHandler = GetToggleCommentCommandHandler(workspace);
var textView = doc.GetTextView();
var textBuffer = doc.GetTextBuffer();
......@@ -84,11 +86,12 @@ private static void SetupSelection(IWpfTextView textView, IEnumerable<Span> span
}
[ExportWorkspaceService(typeof(IExperimentationService), WorkspaceKind.Test), Shared]
private class MockToggleBlockCommentExperimentationService : IExperimentationService
private class MockToggleCommentExperimentationService : IExperimentationService
{
public bool IsExperimentEnabled(string experimentName)
{
return WellKnownExperimentNames.RoslynToggleBlockComment.Equals(experimentName);
return WellKnownExperimentNames.RoslynToggleBlockComment.Equals(experimentName)
|| WellKnownExperimentNames.RoslynToggleLineComment.Equals(experimentName);
}
}
}
......
......@@ -8,11 +8,12 @@
using VSCommanding = Microsoft.VisualStudio.Commanding;
using Xunit;
using System.Linq;
using System;
namespace Microsoft.CodeAnalysis.Editor.UnitTests.CommentSelection
{
[UseExportProvider]
public class CSharpToggleBlockCommentCommandHandlerTests : AbstractToggleBlockCommentTestBase
public class CSharpToggleBlockCommentCommandHandlerTests : AbstractToggleCommentTestBase
{
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
public void AddComment_CommentMarkerStringBeforeSelection()
......@@ -40,7 +41,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -73,7 +74,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -102,7 +103,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -131,7 +132,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -160,7 +161,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -191,7 +192,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -216,12 +217,12 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
internal override ToggleBlockCommentCommandHandler GetToggleBlockCommentCommandHandler(TestWorkspace workspace)
internal override AbstractCommentSelectionBase<ValueTuple> GetToggleCommentCommandHandler(TestWorkspace workspace)
{
return (ToggleBlockCommentCommandHandler)workspace.ExportProvider.GetExportedValues<VSCommanding.ICommandHandler>()
return (AbstractCommentSelectionBase<ValueTuple>)workspace.ExportProvider.GetExportedValues<VSCommanding.ICommandHandler>()
.First(export => typeof(CSharpToggleBlockCommentCommandHandler).Equals(export.GetType()));
}
}
......
......@@ -7,11 +7,12 @@
using Roslyn.Test.Utilities;
using VSCommanding = Microsoft.VisualStudio.Commanding;
using Xunit;
using System;
namespace Microsoft.CodeAnalysis.Editor.UnitTests.CommentSelection
{
[UseExportProvider]
public class ToggleBlockCommentCommandHandlerTests : AbstractToggleBlockCommentTestBase
public class ToggleBlockCommentCommandHandlerTests : AbstractToggleCommentTestBase
{
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
public void AddComment_EmptyCaret()
......@@ -19,7 +20,7 @@ public void AddComment_EmptyCaret()
var markup = @"$$";
var expected = @"[|/**/|]";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -28,7 +29,7 @@ public void AddComment_EmptySelection()
var markup = @"[| |]";
var expected = @"[|/* */|]";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -53,7 +54,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -78,7 +79,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -103,7 +104,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -128,7 +129,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -153,7 +154,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -177,7 +178,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -202,7 +203,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -231,7 +232,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -264,7 +265,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -291,7 +292,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -322,7 +323,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -355,7 +356,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -392,7 +393,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -425,7 +426,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -454,7 +455,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -485,7 +486,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -514,7 +515,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -543,7 +544,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -572,7 +573,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -603,7 +604,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -632,7 +633,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -661,7 +662,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -690,7 +691,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -715,7 +716,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -740,7 +741,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -767,7 +768,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -792,7 +793,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -821,7 +822,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -850,7 +851,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -883,7 +884,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -892,7 +893,7 @@ public void RemoveComment_AtBeginningOfFile()
var markup = @"[|/**/|]";
var expected = @"";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -921,7 +922,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -950,7 +951,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -979,7 +980,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1008,7 +1009,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1035,7 +1036,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1062,7 +1063,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1091,7 +1092,7 @@ void M()
}
}|]";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1120,7 +1121,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1151,7 +1152,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1180,7 +1181,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1209,7 +1210,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1242,7 +1243,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1271,7 +1272,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1300,7 +1301,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1329,7 +1330,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1358,7 +1359,7 @@ void M()
}
}";
ToggleBlockComment(markup, expected);
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1399,7 +1400,7 @@ void M()
}"
};
ToggleBlockCommentMultiple(markup, expectedText);
ToggleCommentMultiple(markup, expectedText);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleBlockComment)]
......@@ -1441,12 +1442,12 @@ void M()
}"
};
ToggleBlockCommentMultiple(markup, expectedText);
ToggleCommentMultiple(markup, expectedText);
}
internal override ToggleBlockCommentCommandHandler GetToggleBlockCommentCommandHandler(TestWorkspace workspace)
internal override AbstractCommentSelectionBase<ValueTuple> GetToggleCommentCommandHandler(TestWorkspace workspace)
{
return (ToggleBlockCommentCommandHandler)workspace.ExportProvider.GetExportedValues<VSCommanding.ICommandHandler>()
return (AbstractCommentSelectionBase<ValueTuple>)workspace.ExportProvider.GetExportedValues<VSCommanding.ICommandHandler>()
.First(export => typeof(ToggleBlockCommentCommandHandler).Equals(export.GetType()));
}
}
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Linq;
using Microsoft.CodeAnalysis.Editor.Implementation.CommentSelection;
using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Test.Utilities;
using VSCommanding = Microsoft.VisualStudio.Commanding;
using Xunit;
using System;
namespace Microsoft.CodeAnalysis.Editor.UnitTests.CommentSelection
{
[UseExportProvider]
public class ToggleLineCommentCommandHandlerTests : AbstractToggleCommentTestBase
{
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_EmptyCaret()
{
var markup = @"$$";
var expected = @"[||]";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_EmptySelection()
{
var markup = @"[| |]";
var expected = @"[||]";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_CaretInUncommentedLine()
{
var markup =
@"
class C
{
void M()
{
var$$ i = 1;
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_CaretBeforeUncommentedLine()
{
var markup =
@"
class C
{
void M()
{
$$ var i = 1;
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_SingleLineSelected()
{
var markup =
@"
class C
{
void M()
{
[|var i = 1;|]
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_PartialSingleLineSelected()
{
var markup =
@"
class C
{
void M()
{
var [|i = 1;|]
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_SingleLineWithWhitespaceSelected()
{
var markup =
@"
class C
{
void M()
{
[|
var i = 1;
|]
}
}";
var expected =
@"
class C
{
void M()
{
[|
//var i = 1;
|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_SelectionInsideCommentAtEndOfLine()
{
var markup =
@"
class C
{
void M()
{
var i = 1; // A [|comment|].
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1; // A comment.|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_SelectionAroundCommentAtEndOfLine()
{
var markup =
@"
class C
{
void M()
{
var i = 1; [|// A comment.|]
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1; // A comment.|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_SelectionOutsideCommentAtEndOfLine()
{
var markup =
@"
class C
{
void M()
{
[|var i = 1; // A comment.|]
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1; // A comment.|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_CaretOutsideCommentAtEndOfLine()
{
var markup =
@"
class C
{
void M()
{
var $$i = 1; // A comment.
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1; // A comment.|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_CaretInsideCommentAtEndOfLine()
{
var markup =
@"
class C
{
void M()
{
var i = 1; // A $$comment.
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1; // A comment.|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_CommentMarkerInString()
{
var markup =
@"
class C
{
void M()
{
[|string s = '\\';|]
}
}";
var expected =
@"
class C
{
void M()
{
[| //string s = '\\';|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_MultipleLinesSelected()
{
var markup =
@"
class C
{
void M()
{
[|var i = 1;
var j = 2;|]
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1;
//var j = 2;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_MultipleLinesWithWhitespaceSelected()
{
var markup =
@"
class C
{
void M()
{
[|
var i = 1;
var j = 2;
|]
}
}";
var expected =
@"
class C
{
void M()
{
[|
//var i = 1;
//var j = 2;
|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_MultipleLinesPartiallyCommentedSelected()
{
var markup =
@"
class C
{
void M()
{
[|//var i = 1;
var j = 2;|]
}
}";
var expected =
@"
class C
{
void M()
{
[| ////var i = 1;
//var j = 2;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_MultipleLinesWithCommentsInLineSelected()
{
var markup =
@"
class C
{
void M()
{
[|var i = 1; // A comment.
var j = 2;|]
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1; // A comment.
//var j = 2;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_MultipleLinesWithDifferentIndentationsSelected()
{
var markup =
@"
class C
{
[| void M()
{
var i = 1;
var j = 2;
}|]
}";
var expected =
@"
class C
{
[| //void M()
//{
// var i = 1;
// var j = 2;
//}|]
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_MultiCaret()
{
var markup =
@"
class C
{
void M()
{
var [||]i = 1;
var [||]j = 2;
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1;|]
[| //var j = 2;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_MultiSeletion()
{
var markup =
@"
class C
{
void M()
{
[|var i = 1;|]
[|var j = 2;|]
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1;|]
[| //var j = 2;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_MultiSeletionPartiallyCommented()
{
var markup =
@"
class C
{
void M()
{
[|//var i = 1;|]
[|var j = 2;|]
}
}";
var expected =
@"
class C
{
void M()
{
[| ////var i = 1;|]
[| //var j = 2;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void AddComment_VisualBasicStyleComment()
{
var markup =
@"
Class A
[|Function M()
Dim a = 1
End Function|]
End Class";
var expected =
@"
Class A
[| 'Function M()
' Dim a = 1
'End Function|]
End Class";
ToggleComment(markup, expected, true);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_CaretInCommentedLine()
{
var markup =
@"
class C
{
void M()
{
//var$$ i = 1;
}
}";
var expected =
@"
class C
{
void M()
{
[| var i = 1;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_CaretBeforeCommentedLine()
{
var markup =
@"
class C
{
void M()
{
$$ //var i = 1;
}
}";
var expected =
@"
class C
{
void M()
{
[| var i = 1;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_CaretInCommentedLineWithEndComment()
{
var markup =
@"
class C
{
void M()
{
//var i = 1; // A $$comment.
}
}";
var expected =
@"
class C
{
void M()
{
[| var i = 1; // A comment.|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_CaretInDoubleCommentedLine()
{
var markup =
@"
class C
{
void M()
{
////var$$ i = 1;
}
}";
var expected =
@"
class C
{
void M()
{
[| //var i = 1;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_CommentedLineSelected()
{
var markup =
@"
class C
{
void M()
{
[|//var i = 1;|]
}
}";
var expected =
@"
class C
{
void M()
{
[| var i = 1;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_InsideCommentSelected()
{
var markup =
@"
class C
{
void M()
{
//var [|i = 1;|]
}
}";
var expected =
@"
class C
{
void M()
{
[| var i = 1;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_CommentedLineWithWhitespaceSelected()
{
var markup =
@"
class C
{
void M()
{
[|
//var i = 1;
|]
}
}";
var expected =
@"
class C
{
void M()
{
[|
var i = 1;
|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_CommentMarkerInString()
{
var markup =
@"
class C
{
void M()
{
[|//string s = '\\';|]
}
}";
var expected =
@"
class C
{
void M()
{
[| string s = '\\';|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_MultipleCommentedLinesSelected()
{
var markup =
@"
class C
{
void M()
{
[|//var i = 1;
//var j = 2;|]
}
}";
var expected =
@"
class C
{
void M()
{
[| var i = 1;
var j = 2;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_MultipleCommentedLinesAndWhitespaceSelected()
{
var markup =
@"
class C
{
void M()
{
[|
//var i = 1;
//var j = 2;
|]
}
}";
var expected =
@"
class C
{
void M()
{
[|
var i = 1;
var j = 2;
|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_MultipleCommentedLinesWithEndCommentSelected()
{
var markup =
@"
class C
{
void M()
{
[|//var i = 1; // A comment.
//var j = 2;|]
}
}";
var expected =
@"
class C
{
void M()
{
[| var i = 1; // A comment.
var j = 2;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_MultipleLinesWithDifferentIndentationsSelected()
{
var markup =
@"
class C
{
[| //void M()
//{
// var i = 1;
// var j = 2;
//}|]
}";
var expected =
@"
class C
{
[| void M()
{
var i = 1;
var j = 2;
}|]
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_MultiCaret()
{
var markup =
@"
class C
{
void M()
{
//var [||]i = 1;
[||]
//var [||]j = 2;
}
}";
var expected =
@"
class C
{
void M()
{
[| var i = 1;|]
[||]
[| var j = 2;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_MultiSeletion()
{
var markup =
@"
class C
{
void M()
{
[|//var i = 1;|]
[| |]
[|//var j = 2;|]
}
}";
var expected =
@"
class C
{
void M()
{
[| var i = 1;|]
[||]
[| var j = 2;|]
}
}";
ToggleComment(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void RemoveComment_VisualBasicStyleComment()
{
var markup =
@"
Class A
[|'Function M()
' Dim a = 1
'End Function|]
End Class";
var expected =
@"
Class A
[| Function M()
Dim a = 1
End Function|]
End Class";
ToggleComment(markup, expected, true);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void ToggleComment_MultipleLinesSelected()
{
var markup =
@"
class C
{
void M()
{
[|//var i = 1;
var j = 2;|]
}
}";
var expected = new string[]
{
@"
class C
{
void M()
{
[| ////var i = 1;
//var j = 2;|]
}
}",
@"
class C
{
void M()
{
[| //var i = 1;
var j = 2;|]
}
}"
};
ToggleCommentMultiple(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void ToggleComment_MultipleSelection()
{
var markup =
@"
class C
{
void M()
{
[|//var i = 1;|]
[||]
[|var j = 2;|]
}
}";
var expected = new string[]
{
@"
class C
{
void M()
{
[| ////var i = 1;|]
[||]
[| //var j = 2;|]
}
}",
@"
class C
{
void M()
{
[| //var i = 1;|]
[||]
[| var j = 2;|]
}
}"
};
ToggleCommentMultiple(markup, expected);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public void ToggleComment_VisualBasicStyleComment()
{
var markup =
@"
Class A
[|Function M()
Dim a = 1
End Function|]
End Class";
var expected = new string[]
{
@"
Class A
[| 'Function M()
' Dim a = 1
'End Function|]
End Class",
@"
Class A
[| Function M()
Dim a = 1
End Function|]
End Class"
};
ToggleCommentMultiple(markup, expected, true);
}
internal override AbstractCommentSelectionBase<ValueTuple> GetToggleCommentCommandHandler(TestWorkspace workspace)
{
return (AbstractCommentSelectionBase<ValueTuple>)workspace.ExportProvider.GetExportedValues<VSCommanding.ICommandHandler>()
.First(export => typeof(ToggleLineCommentCommandHandler).Equals(export.GetType()));
}
}
}
......@@ -250,6 +250,7 @@ public static class Features
public const string TextStructureNavigator = nameof(TextStructureNavigator);
public const string TodoComments = nameof(TodoComments);
public const string ToggleBlockComment = nameof(ToggleBlockComment);
public const string ToggleLineComment = nameof(ToggleLineComment);
public const string TypeInferenceService = nameof(TypeInferenceService);
public const string Venus = nameof(Venus);
public const string ValidateFormatString = nameof(ValidateFormatString);
......
......@@ -23,5 +23,6 @@ internal static class WellKnownExperimentNames
public const string CompletionAPI = nameof(CompletionAPI);
public const string PartialLoadMode = "Roslyn.PartialLoadMode";
public const string RoslynToggleBlockComment = "Roslyn.ToggleBlockComment";
public const string RoslynToggleLineComment = "Roslyn.ToggleLineComment";
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册