public async Task Handle_AddOneUsingToEmpty() { // Arrange var documentPath = "c:/Test.razor"; var documentUri = new Uri(documentPath); var contents = string.Empty; var codeDocument = CreateCodeDocument(contents); var resolver = new AddUsingsCodeActionResolver(LegacyDispatcher, 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); }
public async Task Handle_AddOneNonSystemUsingToSystemUsings() { // Arrange var documentPath = "c:/Test.razor"; var documentUri = new Uri(documentPath); var contents = $"@using System{Environment.NewLine}@using System.Linq{Environment.NewLine}"; var codeDocument = CreateCodeDocument(contents); var resolver = new AddUsingsCodeActionResolver(new DefaultForegroundDispatcher(), CreateDocumentResolver(documentPath, codeDocument)); var actionParams = new AddUsingsCodeActionParams { Uri = documentUri, Namespace = "Microsoft.AspNetCore.Razor.Language" }; 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); var firstEdit = Assert.Single(addUsingsChange.TextDocumentEdit.Edits); Assert.Equal(2, firstEdit.Range.Start.Line); Assert.Equal($"@using Microsoft.AspNetCore.Razor.Language{Environment.NewLine}", firstEdit.NewText); }
public async Task Handle_MissingFile() { // Arrange var resolver = new AddUsingsCodeActionResolver(LegacyDispatcher, _emptyDocumentResolver); var data = JObject.FromObject(new AddUsingsCodeActionParams() { Uri = new Uri("c:/Test.razor"), Namespace = "System" }); // Act var workspaceEdit = await resolver.ResolveAsync(data, default); // Assert Assert.Null(workspaceEdit); }
public async Task Handle_MissingFile() { // Arrange var resolver = new AddUsingsCodeActionResolver(new DefaultForegroundDispatcher(), EmptyDocumentResolver); var data = JObject.FromObject(new CreateComponentCodeActionParams() { Uri = new Uri("c:/Test.razor"), Path = "c:/Another.razor", }); // Act var workspaceEdit = await resolver.ResolveAsync(data, default); // Assert Assert.Null(workspaceEdit); }
public async Task Handle_AddOneUsingToPageDirective() { // Arrange var documentPath = "c:/Test.cshtml"; var documentUri = new Uri(documentPath); var contents = $"@page{Environment.NewLine}@model IndexModel"; var projectItem = new TestRazorProjectItem("c:/Test.cshtml", "c:/Test.cshtml", "Test.cshtml") { Content = contents }; var projectEngine = RazorProjectEngine.Create(RazorConfiguration.Default, TestRazorProjectFileSystem.Empty, (builder) => { PageDirective.Register(builder); ModelDirective.Register(builder); }); var codeDocument = projectEngine.Process(projectItem); codeDocument.SetFileKind(FileKinds.Legacy); var resolver = new AddUsingsCodeActionResolver(LegacyDispatcher, 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); var firstEdit = Assert.Single(addUsingsChange.TextDocumentEdit.Edits); Assert.Equal(1, firstEdit.Range.Start.Line); Assert.Equal($"@using System{Environment.NewLine}", firstEdit.NewText); }
public async Task Handle_Unsupported() { // Arrange var documentPath = "c:/Test.razor"; var contents = "@page \"/test\""; var codeDocument = CreateCodeDocument(contents); codeDocument.SetUnsupported(); var resolver = new AddUsingsCodeActionResolver(LegacyDispatcher, CreateDocumentResolver(documentPath, codeDocument)); var data = JObject.FromObject(new AddUsingsCodeActionParams() { Uri = new Uri(documentPath), Namespace = "System" }); // Act var workspaceEdit = await resolver.ResolveAsync(data, default); // Assert Assert.Null(workspaceEdit); }
public async Task Handle_InvalidFileKind() { // Arrange var documentPath = "c:/Test.razor"; var contents = "@page \"/test\""; var codeDocument = CreateCodeDocument(contents); codeDocument.SetFileKind(FileKinds.Legacy); var resolver = new AddUsingsCodeActionResolver(new DefaultForegroundDispatcher(), CreateDocumentResolver(documentPath, codeDocument)); var data = JObject.FromObject(new CreateComponentCodeActionParams() { Uri = new Uri(documentPath), Path = "c:/Another.razor", }); // Act var workspaceEdit = await resolver.ResolveAsync(data, default); // Assert Assert.Null(workspaceEdit); }
public async override Task <CodeAction?> ResolveAsync( CSharpCodeActionParams csharpParams, CodeAction codeAction, CancellationToken cancellationToken) { if (csharpParams is null) { throw new ArgumentNullException(nameof(csharpParams)); } if (codeAction is null) { throw new ArgumentNullException(nameof(codeAction)); } cancellationToken.ThrowIfCancellationRequested(); var resolvedCodeAction = await ResolveCodeActionWithServerAsync(csharpParams.RazorFileUri, codeAction, cancellationToken).ConfigureAwait(false); if (resolvedCodeAction?.Edit?.DocumentChanges is null) { // Unable to resolve code action with server, return original code action return(codeAction); } if (resolvedCodeAction.Edit.DocumentChanges.Count() != 1) { // We don't yet support multi-document code actions, return original code action return(codeAction); } var documentChanged = resolvedCodeAction.Edit.DocumentChanges.First(); if (!documentChanged.IsTextDocumentEdit) { // Only Text Document Edit changes are supported currently, return original code action return(codeAction); } var addUsingTextEdit = documentChanged.TextDocumentEdit?.Edits.FirstOrDefault(); if (addUsingTextEdit is null) { // No text edit available return(codeAction); } if (!AddUsingsCodeActionProviderFactory.TryExtractNamespace(addUsingTextEdit.NewText, out var @namespace)) { // Invalid text edit, missing namespace return(codeAction); } var documentSnapshot = await _projectSnapshotManagerDispatcher.RunOnDispatcherThreadAsync(() => { _documentResolver.TryResolveDocument(csharpParams.RazorFileUri.GetAbsoluteOrUNCPath(), out var documentSnapshot); return(documentSnapshot); }, cancellationToken).ConfigureAwait(false); if (documentSnapshot is null) { return(codeAction); } var text = await documentSnapshot.GetTextAsync().ConfigureAwait(false); if (text is null) { return(null); } var codeDocument = await documentSnapshot.GetGeneratedOutputAsync().ConfigureAwait(false); if (codeDocument.IsUnsupported()) { return(null); } var documentVersion = await _projectSnapshotManagerDispatcher.RunOnDispatcherThreadAsync(() => { _documentVersionCache.TryGetDocumentVersion(documentSnapshot, out var version); return(version); }, cancellationToken).ConfigureAwait(false); var codeDocumentIdentifier = new OptionalVersionedTextDocumentIdentifier() { Uri = csharpParams.RazorFileUri, Version = documentVersion.Value }; var edit = AddUsingsCodeActionResolver.CreateAddUsingWorkspaceEdit(@namespace, codeDocument, codeDocumentIdentifier); resolvedCodeAction = resolvedCodeAction with { Edit = edit }; return(resolvedCodeAction); } }
public async override Task <CodeAction?> ResolveAsync( CSharpCodeActionParams csharpParams, CodeAction codeAction, CancellationToken cancellationToken) { if (csharpParams is null) { throw new ArgumentNullException(nameof(csharpParams)); } if (codeAction is null) { throw new ArgumentNullException(nameof(codeAction)); } cancellationToken.ThrowIfCancellationRequested(); if (!AddUsingsCodeActionProviderHelper.TryExtractNamespace(codeAction.Title, out var @namespace)) { // Invalid text edit, missing namespace return(codeAction); } var documentSnapshot = await _projectSnapshotManagerDispatcher.RunOnDispatcherThreadAsync(() => { _documentResolver.TryResolveDocument(csharpParams.RazorFileUri.GetAbsoluteOrUNCPath(), out var documentSnapshot); return(documentSnapshot); }, cancellationToken).ConfigureAwait(false); if (documentSnapshot is null) { return(codeAction); } var text = await documentSnapshot.GetTextAsync().ConfigureAwait(false); if (text is null) { return(null); } var codeDocument = await documentSnapshot.GetGeneratedOutputAsync().ConfigureAwait(false); if (codeDocument.IsUnsupported()) { return(null); } var documentVersion = await _projectSnapshotManagerDispatcher.RunOnDispatcherThreadAsync(() => { _documentVersionCache.TryGetDocumentVersion(documentSnapshot, out var version); return(version); }, cancellationToken).ConfigureAwait(false); var codeDocumentIdentifier = new OptionalVersionedTextDocumentIdentifier() { Uri = csharpParams.RazorFileUri, Version = documentVersion.Value }; var edit = AddUsingsCodeActionResolver.CreateAddUsingWorkspaceEdit(@namespace, codeDocument, codeDocumentIdentifier); codeAction = codeAction with { Edit = edit }; return(codeAction); } }