private void CreateCodeActionResolver( out CSharpCodeActionParams codeActionParams, out AddUsingsCSharpCodeActionResolver addUsingResolver, ClientNotifierServiceBase languageServer = null, DocumentVersionCache documentVersionCache = null) { var documentPath = "c:/Test.razor"; var documentUri = new Uri(documentPath); var contents = string.Empty; var codeDocument = CreateCodeDocument(contents, documentPath); codeActionParams = new CSharpCodeActionParams() { Data = new JObject(), RazorFileUri = documentUri }; languageServer ??= CreateLanguageServer(); documentVersionCache ??= CreateDocumentVersionCache(); addUsingResolver = new AddUsingsCSharpCodeActionResolver( new DefaultForegroundDispatcher(), CreateDocumentResolver(documentPath, codeDocument), languageServer, documentVersionCache); }
private void CreateCodeActionResolver( out CSharpCodeActionParams codeActionParams, out DefaultCSharpCodeActionResolver csharpCodeActionResolver, ClientNotifierServiceBase languageServer = null, DocumentVersionCache documentVersionCache = null, RazorFormattingService razorFormattingService = null) { var documentPath = "c:/Test.razor"; var documentUri = new Uri(documentPath); var contents = string.Empty; var codeDocument = CreateCodeDocument(contents, documentPath); codeActionParams = new CSharpCodeActionParams() { Data = new JObject(), RazorFileUri = documentUri }; languageServer ??= CreateLanguageServer(); documentVersionCache ??= CreateDocumentVersionCache(); razorFormattingService ??= CreateRazorFormattingService(documentUri); csharpCodeActionResolver = new DefaultCSharpCodeActionResolver( LegacyDispatcher, CreateDocumentResolver(documentPath, codeDocument), languageServer, razorFormattingService, documentVersionCache); }
public override Task <CodeAction> ResolveAsync(CSharpCodeActionParams csharpParams, CodeAction codeAction, CancellationToken cancellationToken) { codeAction = codeAction with { Edit = new WorkspaceEdit() }; return(Task.FromResult(codeAction)); } }
private void CreateCodeActionResolver( out CSharpCodeActionParams codeActionParams, out AddUsingsCSharpCodeActionResolver addUsingResolver) { var documentPath = "c:/Test.razor"; var documentUri = new Uri(documentPath); var contents = string.Empty; var codeDocument = CreateCodeDocument(contents, documentPath); codeActionParams = new CSharpCodeActionParams() { Data = new JObject(), RazorFileUri = documentUri }; var languageServer = CreateLanguageServer(); var documentVersionCache = CreateDocumentVersionCache(); addUsingResolver = new AddUsingsCSharpCodeActionResolver( Dispatcher, CreateDocumentResolver(documentPath, codeDocument), languageServer, documentVersionCache); }
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 override Task <CodeAction> ResolveAsync(CSharpCodeActionParams csharpParams, CodeAction codeAction, CancellationToken cancellationToken) { return(Task.FromResult <CodeAction>(null)); }
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(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 Debug.Fail($"Encountered an unsupported multi-document code action edit with ${codeAction.Title}."); 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 textEdit = documentChanged.TextDocumentEdit.Edits.FirstOrDefault(); if (textEdit is null) { // No text edit available return(codeAction); } var(documentSnapshot, documentVersion) = await Task.Factory.StartNew(() => { _documentResolver.TryResolveDocument(csharpParams.RazorFileUri.ToUri().GetAbsoluteOrUNCPath(), out var documentSnapshot); _documentVersionCache.TryGetDocumentVersion(documentSnapshot, out var version); return(documentSnapshot, version); }, cancellationToken, TaskCreationOptions.None, _foregroundDispatcher.ForegroundScheduler).ConfigureAwait(false); if (documentSnapshot is null) { return(codeAction); } var codeDocument = await documentSnapshot.GetGeneratedOutputAsync().ConfigureAwait(false); if (codeDocument.IsUnsupported()) { return(codeAction); } if (!_documentMappingService.TryMapFromProjectedDocumentRange(codeDocument, textEdit.Range, MappingBehavior.Inclusive, out var originalRange)) { // Text edit failed to map return(codeAction); } textEdit.Range = originalRange; var codeDocumentIdentifier = new VersionedTextDocumentIdentifier() { Uri = csharpParams.RazorFileUri, Version = documentVersion }; resolvedCodeAction.Edit = new WorkspaceEdit() { DocumentChanges = new[] { new WorkspaceEditDocumentChange( new TextDocumentEdit() { TextDocument = codeDocumentIdentifier, Edits = new[] { textEdit }, } ) } }; 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)); } 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); } cancellationToken.ThrowIfCancellationRequested(); 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 documentChanged = resolvedCodeAction.Edit.DocumentChanges.First(); if (!documentChanged.IsTextDocumentEdit) { // Only Text Document Edit changes are supported currently, return original code action return(codeAction); } cancellationToken.ThrowIfCancellationRequested(); var csharpTextEdits = documentChanged.TextDocumentEdit.Edits.ToArray(); // Remaps the text edits from the generated C# to the razor file, // as well as applying appropriate formatting. var formattedEdits = await _razorFormattingService.ApplyFormattedEditsAsync( csharpParams.RazorFileUri, documentSnapshot, RazorLanguageKind.CSharp, csharpTextEdits, s_defaultFormattingOptions, cancellationToken, bypassValidationPasses : true); cancellationToken.ThrowIfCancellationRequested(); 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 }; resolvedCodeAction = resolvedCodeAction with { Edit = new WorkspaceEdit() { DocumentChanges = new[] { new WorkspaceEditDocumentChange( new TextDocumentEdit() { TextDocument = codeDocumentIdentifier, Edits = formattedEdits, }) } } }; return(resolvedCodeAction); } }
public abstract Task <CodeAction> ResolveAsync( CSharpCodeActionParams csharpParams, CodeAction codeAction, CancellationToken cancellationToken);
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); } }
public override Task <RazorCodeAction> ResolveAsync(CSharpCodeActionParams csharpParams, RazorCodeAction codeAction, CancellationToken cancellationToken) { return(null); }