Skip to content

Commit 2ef7de5

Browse files
committed
feat: Now you can exclude non-contextual signature help on manual trigger with signatureHelp.excludeBlockScope (disabled by default)
1 parent 15c69b4 commit 2ef7de5

3 files changed

Lines changed: 42 additions & 0 deletions

File tree

src/configurationType.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,17 @@ export type Configuration = {
282282
* @default true
283283
*/
284284
removeDefinitionFromReferences: boolean
285+
/**
286+
* Make tsserver think signature help never gets triggered manually to make it not go outside of block eg:
287+
* ```ts
288+
* declare const a: (a) => void
289+
* a(() => {/* no annoying signature help on trigger *\/ })
290+
* ```
291+
* But it still allow it to be displayed in return statements which is more convenient
292+
* @recommended
293+
* @default false
294+
*/
295+
'signatureHelp.excludeBlockScope': boolean
285296
/**
286297
* @default true
287298
*/

typescript/src/decorateProxy.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import decorateWorkspaceSymbolSearch from './workspaceSymbolSearch'
1515
import decorateFormatFeatures from './decorateFormatFeatures'
1616
import namespaceAutoImports from './namespaceAutoImports'
1717
import libDomPatching from './libDomPatching'
18+
import decorateSignatureHelp from './decorateSignatureHelp'
1819

1920
/** @internal */
2021
export const thisPluginMarker = '__essentialPluginsMarker__'
@@ -88,6 +89,7 @@ export const decorateLanguageService = (
8889
decorateDocumentHighlights(proxy, languageService, c)
8990
decorateWorkspaceSymbolSearch(proxy, languageService, c, languageServiceHost)
9091
decorateFormatFeatures(proxy, languageService, languageServiceHost, c)
92+
decorateSignatureHelp(proxy, languageService, languageServiceHost, c)
9193
proxy.findRenameLocations = (fileName, position, findInStrings, findInComments, providePrefixAndSuffixTextForRename) => {
9294
if (overrideRequestPreferences.rename) {
9395
try {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { GetConfig } from './types'
2+
import { findChildContainingExactPosition } from './utils'
3+
4+
export default (proxy: ts.LanguageService, languageService: ts.LanguageService, languageServiceHost: ts.LanguageServiceHost, c: GetConfig) => {
5+
proxy.getSignatureHelpItems = (fileName, position, options) => {
6+
if (!c('signatureHelp.excludeBlockScope') || options?.triggerReason?.kind !== 'invoked') {
7+
return languageService.getSignatureHelpItems(fileName, position, options)
8+
}
9+
10+
const sourceFile = languageService.getProgram()!.getSourceFile(fileName)!
11+
const node = findChildContainingExactPosition(sourceFile, position)
12+
const returnStatement =
13+
ts.findAncestor(node, node => {
14+
return ts.isBlock(node) ? 'quit' : ts.isReturnStatement(node)
15+
}) ?? tsFull.findPrecedingToken?.(position, sourceFile as FullSourceFile)?.kind === ts.SyntaxKind.ReturnKeyword
16+
17+
return languageService.getSignatureHelpItems(
18+
fileName,
19+
position,
20+
returnStatement
21+
? options
22+
: {
23+
triggerReason: {
24+
kind: 'retrigger',
25+
},
26+
},
27+
)
28+
}
29+
}

0 commit comments

Comments
 (0)