Closed b12-144 closed 4 months ago
The problem is that you can't await a Task
The delegate for the completion provider is (CompletionList)
public delegate CompletionList ProvideCompletionItemsDelegate(string modelUri, Position position, CompletionContext context);
So you will not be able to await any asynchronous calls in the delegate method. The solution would be for the author to modify the CompletionItemProvider to have a ...
public delegate Task<CompletionList> ProvideCompletionItemsDelegate(string modelUri, Position position, CompletionContext context);
Here is a temporary solution. This is a CompletionItemProviderAsync to use instead...
using BlazorMonaco;
using BlazorMonaco.Languages;
using Microsoft.JSInterop;
namespace Core.MonacoEx {
public class CompletionItemProviderAsync {
public delegate Task<CompletionList> ProvideCompletionItemsDelegate(string modelUri, Position position, CompletionContext context);
public delegate Task<CompletionItem> ResolveCompletionItemDelegate(CompletionItem completionItem);
public List<string> TriggerCharacters { get; set; }
public ProvideCompletionItemsDelegate ProvideCompletionItemsFunc { get; set; }
public ResolveCompletionItemDelegate ResolveCompletionItemFunc { get; set; }
[JSInvokable]
public Task<CompletionList> ProvideCompletionItems(string modelUri, Position position, CompletionContext context) {
return ProvideCompletionItemsFunc(modelUri, position, context);
}
[JSInvokable]
async public Task<CompletionItem> ResolveCompletionItem(CompletionItem completionItem) {
return await ResolveCompletionItemFunc?.Invoke(completionItem);
}
public CompletionItemProviderAsync(ProvideCompletionItemsDelegate provideCompletionItems, ResolveCompletionItemDelegate resolveCompletionItem = null) {
ProvideCompletionItemsFunc = provideCompletionItems;
ResolveCompletionItemFunc = resolveCompletionItem;
}
}
}
And you can register it with...
public Task RegisterCompletionItemProvider(IJSRuntime jsRuntime, LanguageSelector language, CompletionItemProviderAsync.ProvideCompletionItemsDelegate provideCompletionItems, CompletionItemProviderAsync.ResolveCompletionItemDelegate resolveCompletionItem = null) {
return RegisterCompletionItemProvider(jsRuntime, language, new CompletionItemProviderAsync(provideCompletionItems, resolveCompletionItem));
}
And you can AWAIT all you want in the delegate method :)
Hi @DJSures , thank you so much for the help!
Hi, thank you for this awesome project. How can I register an async CompletionItemProvider in order to be able to
await editor.GetValue()
? The idea is to get the editor value, parse it and then calculate the suggestions to be presented to the User, but how to do it on a Blazor Server since GetValue() needs to be awaited and editor.GetValue().Result does not work? Follow the code I'm trying to use below:Thanks, Bruno.