private static IEnumerable <RazorCodeAction> ProcessCodeActionsVS( RazorCodeActionContext context, IEnumerable <RazorCodeAction> codeActions) { var typeAccessibilityCodeActions = new List <RazorCodeAction>(1); foreach (var codeAction in codeActions) { if (codeAction.Name.Equals(RazorPredefinedCodeFixProviderNames.FullyQualify, StringComparison.Ordinal)) { string action; if (!TryGetOwner(context, out var owner)) { // Failed to locate a valid owner for the light bulb continue; } else if (IsSingleLineDirectiveNode(owner)) { // Don't support single line directives continue; } else if (IsExplicitExpressionNode(owner)) { // Don't support explicit expressions continue; } else if (IsImplicitExpressionNode(owner)) { action = LanguageServerConstants.CodeActions.UnformattedRemap; } else { // All other scenarios we support default formatted code action behavior action = LanguageServerConstants.CodeActions.Default; } typeAccessibilityCodeActions.Add(codeAction.WrapResolvableCSharpCodeAction(context, action)); } // For add using suggestions, the code action title is of the form: // `using System.Net;` else if (codeAction.Name.Equals(RazorPredefinedCodeFixProviderNames.AddImport, StringComparison.Ordinal) && AddUsingsCodeActionProviderHelper.TryExtractNamespace(codeAction.Title, out var @namespace)) { var newCodeAction = codeAction with { Title = $"@using {@namespace}" }; typeAccessibilityCodeActions.Add(newCodeAction.WrapResolvableCSharpCodeAction(context, LanguageServerConstants.CodeActions.AddUsing)); } // Not a type accessibility code action else { continue; } } return(typeAccessibilityCodeActions);
public void TryExtractNamespace_WithStatic_ReturnsTruue() { // Arrange var csharpAddUsing = "using static X.Y.Z;"; // Act var res = AddUsingsCodeActionProviderHelper.TryExtractNamespace(csharpAddUsing, out var @namespace); // Assert Assert.True(res); Assert.Equal("static X.Y.Z", @namespace); }
public void TryExtractNamespace_ReturnsTrue() { // Arrange var csharpAddUsing = "using Abc.Xyz;"; // Act var res = AddUsingsCodeActionProviderHelper.TryExtractNamespace(csharpAddUsing, out var @namespace); // Assert Assert.True(res); Assert.Equal("Abc.Xyz", @namespace); }
public void TryExtractNamespace_Invalid_ReturnsFalse() { // Arrange var csharpAddUsing = "Abc.Xyz;"; // Act var res = AddUsingsCodeActionProviderHelper.TryExtractNamespace(csharpAddUsing, out var @namespace); // Assert Assert.False(res); Assert.Empty(@namespace); }
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); } }