From e353b08e8fdbe6ef3af24917f0c556413a1e6c26 Mon Sep 17 00:00:00 2001 From: Tanay Parikh Date: Wed, 19 Aug 2020 14:52:03 -0700 Subject: [PATCH] Fix Add Using Added to Wrong Line (#2414) * Fix Add Using Added to Wrong Line Fixes: https://github.com/dotnet/aspnetcore/issues/25019 * PR Feedback --- .../AddUsingsCodeActionResolver.cs | 3 +- .../RazorLanguageServer.cs | 2 +- .../AddUsingsCodeActionResolverTest.cs | 36 ++++++++++++++++++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/AddUsingsCodeActionResolver.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/AddUsingsCodeActionResolver.cs index 53bbb6e86c3..eb420367736 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/AddUsingsCodeActionResolver.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/AddUsingsCodeActionResolver.cs @@ -157,8 +157,9 @@ private static WorkspaceEditDocumentChange GenerateSingleUsingEditsAtTop( VersionedTextDocumentIdentifier codeDocumentIdentifier, string newUsingNamespace) { + var head = new Position(0, 0); + // If we don't have usings, insert after the last namespace or page directive, which ever comes later - var head = new Position(1, 0); var syntaxTreeRoot = codeDocument.GetSyntaxTree().Root; var lastNamespaceOrPageDirective = syntaxTreeRoot .DescendantNodes() diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/RazorLanguageServer.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/RazorLanguageServer.cs index 3c7f2d39de2..5e532977bc3 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/RazorLanguageServer.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/RazorLanguageServer.cs @@ -63,7 +63,7 @@ public static Task CreateAsync(Stream input, Stream output, Serializer.Instance.JsonSerializer.Converters.RegisterRazorConverters(); // Custom ClientCapabilities deserializer to extract experimental capabilities - Serializer.Instance.JsonSerializer.Converters.Add(ExtendableClientCapabilitiesJsonConverter.Instance); + // Serializer.Instance.JsonSerializer.Converters.Add(ExtendableClientCapabilitiesJsonConverter.Instance); ILanguageServer server = null; server = OmniSharp.Extensions.LanguageServer.Server.LanguageServer.PreInit(options => diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/AddUsingsCodeActionResolverTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/AddUsingsCodeActionResolverTest.cs index 88bdd8fccf1..56afa9329b7 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/AddUsingsCodeActionResolverTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/AddUsingsCodeActionResolverTest.cs @@ -116,7 +116,7 @@ public async Task Handle_AddOneUsingToEmpty() Assert.True(addUsingsChange.IsTextDocumentEdit); Assert.Single(addUsingsChange.TextDocumentEdit.Edits); var firstEdit = addUsingsChange.TextDocumentEdit.Edits.First(); - Assert.Equal(1, firstEdit.Range.Start.Line); + Assert.Equal(0, firstEdit.Range.Start.Line); Assert.Equal($"@using System{Environment.NewLine}", firstEdit.NewText); } @@ -154,6 +154,40 @@ public async Task Handle_AddOneUsingToPage() Assert.Equal($"@using System{Environment.NewLine}", firstEdit.NewText); } + [Fact] + public async Task Handle_AddOneUsingToHTML() + { + // Arrange + var documentPath = "c:/Test.razor"; + var documentUri = new Uri(documentPath); + var contents = $"{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}
"; + var codeDocument = CreateCodeDocument(contents); + + var resolver = new AddUsingsCodeActionResolver(new DefaultForegroundDispatcher(), CreateDocumentResolver(documentPath, codeDocument)); + var actionParams = new AddUsingsCodeActionParams + { + Uri = documentUri, + Namespace = "System" + }; + var data = JObject.FromObject(actionParams); + + // Act + var workspaceEdit = await resolver.ResolveAsync(data, default); + + // Assert + Assert.NotNull(workspaceEdit); + Assert.NotNull(workspaceEdit.DocumentChanges); + Assert.Single(workspaceEdit.DocumentChanges); + + var documentChanges = workspaceEdit.DocumentChanges.ToArray(); + var addUsingsChange = documentChanges[0]; + Assert.True(addUsingsChange.IsTextDocumentEdit); + Assert.Single(addUsingsChange.TextDocumentEdit.Edits); + var firstEdit = addUsingsChange.TextDocumentEdit.Edits.First(); + Assert.Equal(0, firstEdit.Range.Start.Line); + Assert.Equal($"@using System{Environment.NewLine}", firstEdit.NewText); + } + [Fact] public async Task Handle_AddOneUsingToNamespace() {