| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- using System.Threading;
- using System.Threading.Tasks;
- using RoslynPad.Editor;
- public sealed class ManualOnlyCompletionProvider : ICodeEditorCompletionProvider
- {
- private readonly ICodeEditorCompletionProvider _inner;
- // 0 = blocked, 1 = allow exactly one completion request
- private int _allowOnce;
- public ManualOnlyCompletionProvider(ICodeEditorCompletionProvider inner)
- => _inner = inner;
- /// <summary>
- /// Call this immediately before letting the editor execute its completion action (Ctrl + Space).
- /// </summary>
- public void AllowNextCompletionOnce()
- => Interlocked.Exchange(ref _allowOnce, 1);
- /// <summary>
- /// If false, blocks signature help popups (parameter hints).
- /// </summary>
- public bool AllowSignatureHelp { get; set; } = false;
- /// <summary>
- /// If true, a request with triggerChar == null is treated as a manual invoke
- /// even if you didn't call AllowNextCompletionOnce().
- /// </summary>
- public bool TreatNullTriggerAsManualInvoke { get; set; } = true;
- /// <summary>
- /// If true, allows '.' to trigger completion while typing (classic IDE feel),
- /// while still blocking letter-by-letter popups.
- /// </summary>
- public bool AllowDotTrigger { get; set; } = false;
- public Task<CompletionResult> GetCompletionData(int position, char? triggerChar, bool useSignatureHelp)
- {
- // No results object for this build:
- static CompletionResult EmptyResult() => new CompletionResult(null, null, useHardSelection: false);
- // 1) Signature help requested?
- if (useSignatureHelp && !AllowSignatureHelp)
- return Task.FromResult(EmptyResult());
- // 2) Typed character triggers (auto popup on keystrokes)
- if (triggerChar is not null)
- {
- if (!(AllowDotTrigger && triggerChar == '.'))
- return Task.FromResult(EmptyResult());
- }
- // 3) Manual gating: either explicitly armed once, or inferred from null trigger
- if (Interlocked.Exchange(ref _allowOnce, 0) == 1)
- return _inner.GetCompletionData(position, triggerChar, useSignatureHelp);
- if (TreatNullTriggerAsManualInvoke && triggerChar is null && !useSignatureHelp)
- return _inner.GetCompletionData(position, triggerChar, useSignatureHelp);
- return Task.FromResult(EmptyResult());
- }
- }
|