未验证 提交 0fea73a7 编写于 作者: S Sam Harwell 提交者: GitHub

Merge pull request #30074 from Neme12/fixInterpolatedVerbatimString

Command handler to replace `@$"` with `$@"` when typing interpolated verbatim string
......@@ -60,6 +60,15 @@ internal class CSharpEditorResources {
}
}
/// <summary>
/// Looks up a localized string similar to Fix interpolated verbatim string.
/// </summary>
internal static string Fix_interpolated_verbatim_string {
get {
return ResourceManager.GetString("Fix_interpolated_verbatim_string", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to (Press TAB to insert).
/// </summary>
......
......@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Fix_interpolated_verbatim_string" xml:space="preserve">
<value>Fix interpolated verbatim string</value>
</data>
<data name="Press_TAB_to_insert" xml:space="preserve">
<value> (Press TAB to insert)</value>
</data>
......
// 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.ComponentModel.Composition;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Editor.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
using Microsoft.VisualStudio.Commanding;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor.Commanding.Commands;
using Microsoft.VisualStudio.Utilities;
using VSCommanding = Microsoft.VisualStudio.Commanding;
namespace Microsoft.CodeAnalysis.Editor.CSharp.FixInterpolatedVerbatimString
{
/// <summary>
/// Replaces <c>@$"</c> with <c>$@"</c>, which is the preferred and until C# 8.0 the only supported form
/// of an interpolated verbatim string start token. In C# 8.0 we still auto-correct to this form for consistency.
/// </summary>
[Export(typeof(VSCommanding.ICommandHandler))]
[ContentType(ContentTypeNames.CSharpContentType)]
[Name(nameof(FixInterpolatedVerbatimStringCommandHandler))]
internal sealed class FixInterpolatedVerbatimStringCommandHandler : IChainedCommandHandler<TypeCharCommandArgs>
{
public string DisplayName => CSharpEditorResources.Fix_interpolated_verbatim_string;
public void ExecuteCommand(TypeCharCommandArgs args, Action nextCommandHandler, CommandExecutionContext executionContext)
{
// We need to check for the token *after* the opening quote is typed, so defer to the editor first
nextCommandHandler();
if (args.TypedChar == '"')
{
var caret = args.TextView.GetCaretPoint(args.SubjectBuffer);
if (caret != null)
{
var position = caret.Value.Position;
var snapshot = caret.Value.Snapshot;
if (position >= 3 &&
snapshot[position - 1] == '"' &&
snapshot[position - 2] == '$' &&
snapshot[position - 3] == '@')
{
var document = snapshot.GetOpenDocumentInCurrentContextWithChanges();
if (document != null)
{
var root = document.GetSyntaxRootSynchronously(executionContext.OperationContext.UserCancellationToken);
var token = root.FindToken(position - 3);
if (token.IsKind(SyntaxKind.InterpolatedVerbatimStringStartToken))
{
args.SubjectBuffer.Replace(new Span(position - 3, 2), "$@");
}
}
}
}
}
}
public VSCommanding.CommandState GetCommandState(TypeCharCommandArgs args, Func<VSCommanding.CommandState> nextCommandHandler)
=> nextCommandHandler();
}
}
using System.ComponentModel.Composition;
// 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.ComponentModel.Composition;
using System.Threading;
using Microsoft.CodeAnalysis.Editor.Shared.Extensions;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="cs" original="../CSharpEditorResources.resx">
<body>
<trans-unit id="Fix_interpolated_verbatim_string">
<source>Fix interpolated verbatim string</source>
<target state="new">Fix interpolated verbatim string</target>
<note />
</trans-unit>
<trans-unit id="Press_TAB_to_insert">
<source> (Press TAB to insert)</source>
<target state="translated"> (Pro vložení stiskněte TAB.)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="de" original="../CSharpEditorResources.resx">
<body>
<trans-unit id="Fix_interpolated_verbatim_string">
<source>Fix interpolated verbatim string</source>
<target state="new">Fix interpolated verbatim string</target>
<note />
</trans-unit>
<trans-unit id="Press_TAB_to_insert">
<source> (Press TAB to insert)</source>
<target state="translated"> (Zum Einfügen TAB-TASTE drücken)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="es" original="../CSharpEditorResources.resx">
<body>
<trans-unit id="Fix_interpolated_verbatim_string">
<source>Fix interpolated verbatim string</source>
<target state="new">Fix interpolated verbatim string</target>
<note />
</trans-unit>
<trans-unit id="Press_TAB_to_insert">
<source> (Press TAB to insert)</source>
<target state="translated"> (Presione TAB para insertar)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="fr" original="../CSharpEditorResources.resx">
<body>
<trans-unit id="Fix_interpolated_verbatim_string">
<source>Fix interpolated verbatim string</source>
<target state="new">Fix interpolated verbatim string</target>
<note />
</trans-unit>
<trans-unit id="Press_TAB_to_insert">
<source> (Press TAB to insert)</source>
<target state="translated"> (Appuyez sur TAB pour insérer)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="it" original="../CSharpEditorResources.resx">
<body>
<trans-unit id="Fix_interpolated_verbatim_string">
<source>Fix interpolated verbatim string</source>
<target state="new">Fix interpolated verbatim string</target>
<note />
</trans-unit>
<trans-unit id="Press_TAB_to_insert">
<source> (Press TAB to insert)</source>
<target state="translated"> (Premere TAB per inserire)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="ja" original="../CSharpEditorResources.resx">
<body>
<trans-unit id="Fix_interpolated_verbatim_string">
<source>Fix interpolated verbatim string</source>
<target state="new">Fix interpolated verbatim string</target>
<note />
</trans-unit>
<trans-unit id="Press_TAB_to_insert">
<source> (Press TAB to insert)</source>
<target state="translated">(Tab キーを押して挿入)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="ko" original="../CSharpEditorResources.resx">
<body>
<trans-unit id="Fix_interpolated_verbatim_string">
<source>Fix interpolated verbatim string</source>
<target state="new">Fix interpolated verbatim string</target>
<note />
</trans-unit>
<trans-unit id="Press_TAB_to_insert">
<source> (Press TAB to insert)</source>
<target state="translated"> (삽입하려면 &lt;Tab&gt; 키 누름)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="pl" original="../CSharpEditorResources.resx">
<body>
<trans-unit id="Fix_interpolated_verbatim_string">
<source>Fix interpolated verbatim string</source>
<target state="new">Fix interpolated verbatim string</target>
<note />
</trans-unit>
<trans-unit id="Press_TAB_to_insert">
<source> (Press TAB to insert)</source>
<target state="translated"> (Naciśnij klawisz TAB, aby wstawić)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="pt-BR" original="../CSharpEditorResources.resx">
<body>
<trans-unit id="Fix_interpolated_verbatim_string">
<source>Fix interpolated verbatim string</source>
<target state="new">Fix interpolated verbatim string</target>
<note />
</trans-unit>
<trans-unit id="Press_TAB_to_insert">
<source> (Press TAB to insert)</source>
<target state="translated"> (Pressione TAB para inserir)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="ru" original="../CSharpEditorResources.resx">
<body>
<trans-unit id="Fix_interpolated_verbatim_string">
<source>Fix interpolated verbatim string</source>
<target state="new">Fix interpolated verbatim string</target>
<note />
</trans-unit>
<trans-unit id="Press_TAB_to_insert">
<source> (Press TAB to insert)</source>
<target state="translated"> (Нажмите клавишу TAB для вставки)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="tr" original="../CSharpEditorResources.resx">
<body>
<trans-unit id="Fix_interpolated_verbatim_string">
<source>Fix interpolated verbatim string</source>
<target state="new">Fix interpolated verbatim string</target>
<note />
</trans-unit>
<trans-unit id="Press_TAB_to_insert">
<source> (Press TAB to insert)</source>
<target state="translated"> (Eklemek için TAB tuşuna basın)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="zh-Hans" original="../CSharpEditorResources.resx">
<body>
<trans-unit id="Fix_interpolated_verbatim_string">
<source>Fix interpolated verbatim string</source>
<target state="new">Fix interpolated verbatim string</target>
<note />
</trans-unit>
<trans-unit id="Press_TAB_to_insert">
<source> (Press TAB to insert)</source>
<target state="translated">(按 Tab 插入)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="zh-Hant" original="../CSharpEditorResources.resx">
<body>
<trans-unit id="Fix_interpolated_verbatim_string">
<source>Fix interpolated verbatim string</source>
<target state="new">Fix interpolated verbatim string</target>
<note />
</trans-unit>
<trans-unit id="Press_TAB_to_insert">
<source> (Press TAB to insert)</source>
<target state="translated"> (按 TAB 鍵插入)</target>
......
// 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.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis.Editor.CSharp.FixInterpolatedVerbatimString;
using Microsoft.CodeAnalysis.Editor.Shared.Extensions;
using Microsoft.CodeAnalysis.Editor.UnitTests.Utilities;
using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.CodeAnalysis.Text;
using Microsoft.CodeAnalysis.Text.Shared.Extensions;
using Microsoft.VisualStudio.Text.Editor.Commanding.Commands;
using Microsoft.VisualStudio.Text.Operations;
using Roslyn.Test.Utilities;
using Xunit;
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.FixInterpolatedVerbatimString
{
[UseExportProvider]
public class FixInterpolatedVerbatimStringCommandHandlerTests
{
private static TestWorkspace CreateTestWorkspace(string inputMarkup)
{
var workspace = TestWorkspace.CreateCSharp(inputMarkup);
var document = workspace.Documents.Single();
var view = document.GetTextView();
view.SetSelection(document.SelectedSpans.Single().ToSnapshotSpan(view.TextBuffer.CurrentSnapshot));
return workspace;
}
private static (string quoteCharSnapshotText, int quoteCharCaretPosition) TypeQuoteChar(TestWorkspace workspace)
{
var view = workspace.Documents.Single().GetTextView();
var commandHandler = new FixInterpolatedVerbatimStringCommandHandler();
string quoteCharSnapshotText = default;
int quoteCharCaretPosition = default;
commandHandler.ExecuteCommand(new TypeCharCommandArgs(view, view.TextBuffer, '"'),
() =>
{
var editorOperations = workspace.GetService<IEditorOperationsFactoryService>().GetEditorOperations(view);
editorOperations.InsertText("\"");
quoteCharSnapshotText = view.TextBuffer.CurrentSnapshot.GetText();
quoteCharCaretPosition = view.Caret.Position.BufferPosition.Position;
}, TestCommandExecutionContext.Create());
return (quoteCharSnapshotText, quoteCharCaretPosition);
}
private static void TestHandled(string inputMarkup, string expectedOutputMarkup)
{
using (var workspace = CreateTestWorkspace(inputMarkup))
{
var (quoteCharSnapshotText, quoteCharCaretPosition) = TypeQuoteChar(workspace);
var view = workspace.Documents.Single().GetTextView();
MarkupTestFile.GetSpans(expectedOutputMarkup,
out var expectedOutput, out ImmutableArray<TextSpan> expectedSpans);
Assert.Equal(expectedOutput, view.TextBuffer.CurrentSnapshot.GetText());
Assert.Equal(expectedSpans.Single().Start, view.Caret.Position.BufferPosition.Position);
var history = workspace.GetService<ITextUndoHistoryRegistry>().GetHistory(view.TextBuffer);
history.Undo(count: 1);
// Ensure that after undo, the ordering fix is undone but the quote remains inserted
Assert.Equal(quoteCharSnapshotText, view.TextBuffer.CurrentSnapshot.GetText());
Assert.Equal(quoteCharCaretPosition, view.Caret.Position.BufferPosition.Position);
}
}
private static void TestNotHandled(string inputMarkup)
{
using (var workspace = CreateTestWorkspace(inputMarkup))
{
var originalView = workspace.Documents.Single().GetTextView();
var originalSnapshotText = originalView.TextBuffer.CurrentSnapshot.GetText();
var originalCaretPosition = originalView.Caret.Position.BufferPosition.Position;
var (quoteCharSnapshotText, quoteCharCaretPosition) = TypeQuoteChar(workspace);
var view = workspace.Documents.Single().GetTextView();
Assert.Equal(quoteCharSnapshotText, view.TextBuffer.CurrentSnapshot.GetText());
Assert.Equal(quoteCharCaretPosition, view.Caret.Position.BufferPosition.Position);
var history = workspace.GetService<ITextUndoHistoryRegistry>().GetHistory(view.TextBuffer);
history.Undo(count: 1);
// Ensure that after undo, the quote is removed because the command made no changes
Assert.Equal(originalSnapshotText, view.TextBuffer.CurrentSnapshot.GetText());
Assert.Equal(originalCaretPosition, view.Caret.Position.BufferPosition.Position);
}
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestAfterAtSignDollarSign()
{
TestHandled(
@"class C
{
void M()
{
var v = @$[||]
}
}",
@"class C
{
void M()
{
var v = $@""[||]
}
}");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingAfterDollarSignAtSign()
{
TestNotHandled(
@"class C
{
void M()
{
var v = $@[||]
}
}");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingAfterAtSign()
{
TestNotHandled(
@"class C
{
void M()
{
var v = @[||]
}
}");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingAfterDollarSign()
{
TestNotHandled(
@"class C
{
void M()
{
var v = $[||]
}
}");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingInEmptyFileAfterAtSignDollarSign()
{
TestNotHandled(@"@$[||]");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingInEmptyFileAfterDollarSign()
{
TestNotHandled(@"$[||]");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingInEmptyFile()
{
TestNotHandled(@"[||]");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestAfterAtSignDollarSignEndOfFile()
{
TestHandled(
@"class C
{
void M()
{
var v = @$[||]",
@"class C
{
void M()
{
var v = $@""[||]");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingInClassDeclaration()
{
TestNotHandled(
@"class C
{
@$[||]
}");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingInComment1()
{
TestNotHandled(
@"class C
{
void M()
{
var v = // @$[||]
}
}");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingInComment2()
{
TestNotHandled(
@"class C
{
void M()
{
var v = /* @$[||]
}
}");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingInString()
{
TestNotHandled(
@"class C
{
void M()
{
var v = ""@$[||]
}
}");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingInVerbatimString()
{
TestNotHandled(
@"class C
{
void M()
{
var v = @""@$[||]
}
}");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingInInterpolatedString()
{
TestNotHandled(
@"class C
{
void M()
{
var v = $""@$[||]
}
}");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingInInterpolatedVerbatimString1()
{
TestNotHandled(
@"class C
{
void M()
{
var v = $@""@$[||]
}
}");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestMissingInInterpolatedVerbatimString2()
{
TestNotHandled(
@"class C
{
void M()
{
var v = @$""@$[||]
}
}");
}
[WpfFact, Trait(Traits.Feature, Traits.Features.FixInterpolatedVerbatimString)]
public void TestTrivia()
{
TestHandled(
@"class C
{
void M()
{
var v = // a
/* b */ @$[||] // c
}
}",
@"class C
{
void M()
{
var v = // a
/* b */ $@""[||] // c
}
}");
}
}
}
using System;
// 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.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis.Editor.CSharp.SplitStringLiteral;
......
......@@ -179,6 +179,7 @@ public static class Features
public const string F1Help = nameof(F1Help);
public const string FindReferences = nameof(FindReferences);
public const string FixIncorrectTokens = nameof(FixIncorrectTokens);
public const string FixInterpolatedVerbatimString = nameof(FixInterpolatedVerbatimString);
public const string Formatting = nameof(Formatting);
public const string GoToDefinition = nameof(GoToDefinition);
public const string GoToImplementation = nameof(GoToImplementation);
......
......@@ -200,6 +200,38 @@ class C {
VisualStudio.Editor.Verify.CurrentLineText("string str = \"Hi Roslyn!\"$$", assertCaretPosition: true);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)]
public void DoubleQuote_FixedInterpolatedVerbatimString()
{
SetUpEditor(@"
class C
{
void M()
{
$$
}
}");
VisualStudio.Editor.SendKeys("var v = @$\"");
VisualStudio.Editor.Verify.CurrentLineText("var v = $@\"$$\"", assertCaretPosition: true);
// Backspace removes quotes
VisualStudio.Editor.SendKeys(VirtualKey.Backspace);
VisualStudio.Editor.Verify.CurrentLineText("var v = $@$$", assertCaretPosition: true);
// Undo puts them back
VisualStudio.Editor.Undo();
VisualStudio.Editor.Verify.CurrentLineText("var v = $@\"$$\"", assertCaretPosition: true);
// First, the FixInterpolatedVerbatimString action is undone (@$ reordering)
VisualStudio.Editor.Undo();
VisualStudio.Editor.Verify.CurrentLineText("var v = @$\"$$\"", assertCaretPosition: true);
// Then the automatic quote completion is undone
VisualStudio.Editor.Undo();
VisualStudio.Editor.Verify.CurrentLineText("var v = @$\"$$", assertCaretPosition: true);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)]
public void AngleBracket_PossibleGenerics_InsertionAndCompletion()
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册