Initial work on signature help context (#58135)

* Initial work on signature help context

Fixes #54972

Adds `SignatureHelpContext`. This tells providers why signature help was requested

TODO:

- [ ] Better understand semantics of retrigger. Should `retrigger` be an flag instead of a `triggerReason`?
- [ ]  Fix skipped test
- [ ] Add more tests for trigger reasons / trigger characters

* Fix unit test

* Make sure we retrigger sig help if it is already showing

* Add test for dismiss and re-invoke

* Extract some constants

* Extract createMockEditor
This commit is contained in:
Matt Bierner
2018-09-10 17:44:21 -07:00
committed by GitHub
parent 4f2ffa00f6
commit d33b1c3063
15 changed files with 373 additions and 92 deletions

View File

@@ -20,13 +20,17 @@ class TypeScriptSignatureHelpProvider implements vscode.SignatureHelpProvider {
public async provideSignatureHelp(
document: vscode.TextDocument,
position: vscode.Position,
token: vscode.CancellationToken
token: vscode.CancellationToken,
context?: vscode.SignatureHelpContext,
): Promise<vscode.SignatureHelp | undefined> {
const filepath = this.client.toPath(document.uri);
if (!filepath) {
return undefined;
}
const args: Proto.SignatureHelpRequestArgs = typeConverters.Position.toFileLocationRequestArgs(filepath, position);
const args: Proto.SignatureHelpRequestArgs = {
...typeConverters.Position.toFileLocationRequestArgs(filepath, position),
triggerReason: toTsTriggerReason(context!)
};
let info: Proto.SignatureHelpItems;
try {
@@ -71,6 +75,23 @@ class TypeScriptSignatureHelpProvider implements vscode.SignatureHelpProvider {
}
}
function toTsTriggerReason(context: vscode.SignatureHelpContext): Proto.SignatureHelpTriggerReason {
switch (context.triggerReason) {
case vscode.SignatureHelpTriggerReason.Retrigger:
return { kind: 'retrigger' };
case vscode.SignatureHelpTriggerReason.TriggerCharacter:
if (context.triggerCharacter) {
return { kind: 'characterTyped', triggerCharacter: context.triggerCharacter as any };
} else {
return { kind: 'invoked' };
}
case vscode.SignatureHelpTriggerReason.Invoke:
default:
return { kind: 'invoked' };
}
}
export function register(
selector: vscode.DocumentSelector,
client: ITypeScriptServiceClient,