提交 76182e63 编写于 作者: M Matt Bierner

Fix error where cancelled paramter hint request would still count as a retrigger

上级 cf9e62d3
...@@ -44,7 +44,8 @@ export class ParameterHintsModel extends Disposable { ...@@ -44,7 +44,8 @@ export class ParameterHintsModel extends Disposable {
private retriggerChars = new CharacterSet(); private retriggerChars = new CharacterSet();
private throttledDelayer: Delayer<boolean>; private throttledDelayer: Delayer<boolean>;
private provideSignatureHelpRequest?: CancelablePromise<modes.SignatureHelp | null | undefined>; private provideSignatureHelpRequest?: CancelablePromise<any>;
private triggerId = 0;
constructor( constructor(
editor: ICodeEditor, editor: ICodeEditor,
...@@ -85,18 +86,18 @@ export class ParameterHintsModel extends Disposable { ...@@ -85,18 +86,18 @@ export class ParameterHintsModel extends Disposable {
} }
trigger(context: TriggerContext, delay?: number): void { trigger(context: TriggerContext, delay?: number): void {
const model = this.editor.getModel(); const model = this.editor.getModel();
if (model === null || !modes.SignatureHelpProviderRegistry.has(model)) { if (model === null || !modes.SignatureHelpProviderRegistry.has(model)) {
return; return;
} }
const triggerId = ++this.triggerId;
this.throttledDelayer.trigger( this.throttledDelayer.trigger(
() => this.doTrigger({ () => this.doTrigger({
triggerKind: context.triggerKind, triggerKind: context.triggerKind,
triggerCharacter: context.triggerCharacter, triggerCharacter: context.triggerCharacter,
isRetrigger: this.isTriggered, isRetrigger: this.state.state === 'active' || this.state.state === 'pending',
}), delay).then(undefined, onUnexpectedError); }, triggerId), delay).then(undefined, onUnexpectedError);
} }
public next(): void { public next(): void {
...@@ -149,7 +150,7 @@ export class ParameterHintsModel extends Disposable { ...@@ -149,7 +150,7 @@ export class ParameterHintsModel extends Disposable {
this._onChangedHints.fire(this.state.hints); this._onChangedHints.fire(this.state.hints);
} }
private doTrigger(triggerContext: modes.SignatureHelpContext): Promise<boolean> { private doTrigger(triggerContext: modes.SignatureHelpContext, triggerId: number): Promise<boolean> {
this.cancel(true); this.cancel(true);
if (!this.editor.hasModel()) { if (!this.editor.hasModel()) {
...@@ -165,6 +166,11 @@ export class ParameterHintsModel extends Disposable { ...@@ -165,6 +166,11 @@ export class ParameterHintsModel extends Disposable {
provideSignatureHelp(model, position, triggerContext, token)); provideSignatureHelp(model, position, triggerContext, token));
return this.provideSignatureHelpRequest.then(result => { return this.provideSignatureHelpRequest.then(result => {
// Check that we are still resolving the correct signature help
if (triggerId !== this.triggerId) {
return false;
}
if (!result || !result.signatures || result.signatures.length === 0) { if (!result || !result.signatures || result.signatures.length === 0) {
this.cancel(); this.cancel();
return false; return false;
......
...@@ -89,12 +89,13 @@ suite('ParameterHintsModel', () => { ...@@ -89,12 +89,13 @@ suite('ParameterHintsModel', () => {
if (invokeCount === 1) { if (invokeCount === 1) {
assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter);
assert.strictEqual(context.triggerCharacter, triggerChar); assert.strictEqual(context.triggerCharacter, triggerChar);
assert.strictEqual(context.isRetrigger, false);
// Retrigger // Retrigger
editor.trigger('keyboard', Handler.Type, { text: triggerChar }); editor.trigger('keyboard', Handler.Type, { text: triggerChar });
} else { } else {
assert.strictEqual(invokeCount, 2); assert.strictEqual(invokeCount, 2);
assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter);
assert.ok(context.isRetrigger); assert.strictEqual(context.isRetrigger, true);
assert.strictEqual(context.triggerCharacter, triggerChar); assert.strictEqual(context.triggerCharacter, triggerChar);
done(); done();
} }
...@@ -122,6 +123,7 @@ suite('ParameterHintsModel', () => { ...@@ -122,6 +123,7 @@ suite('ParameterHintsModel', () => {
if (invokeCount === 1) { if (invokeCount === 1) {
assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter);
assert.strictEqual(context.triggerCharacter, triggerChar); assert.strictEqual(context.triggerCharacter, triggerChar);
assert.strictEqual(context.isRetrigger, false);
// Cancel and retrigger // Cancel and retrigger
hintModel.cancel(); hintModel.cancel();
...@@ -130,6 +132,8 @@ suite('ParameterHintsModel', () => { ...@@ -130,6 +132,8 @@ suite('ParameterHintsModel', () => {
assert.strictEqual(invokeCount, 2); assert.strictEqual(invokeCount, 2);
assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter);
assert.strictEqual(context.triggerCharacter, triggerChar); assert.strictEqual(context.triggerCharacter, triggerChar);
assert.strictEqual(context.isRetrigger, false);
done(); done();
} }
return emptySigHelpResult; return emptySigHelpResult;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册