From 00894d55311da5d9f7b261d4947689ed9983d457 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Fri, 16 Sep 2022 16:34:06 +0200 Subject: [PATCH] (fix) better completions for tags In fallback-mode when a parser error happened only show completion suggestions for things that start with an uppercase and therefore are maybe a component --- .../typescript/features/CompletionProvider.ts | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts b/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts index aa57d6399..02588fc5b 100644 --- a/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts @@ -252,7 +252,7 @@ export class CompletionsProviderImpl implements CompletionsProvider this.toCompletionItem( tsDoc, @@ -857,10 +857,24 @@ const svelte2tsxTypes = new Set([ 'SvelteStore' ]); +const startsWithUppercase = /^[A-Z]/; + function isValidCompletion( document: Document, - position: Position + position: Position, + hasParserError: boolean ): (value: ts.CompletionEntry) => boolean { + // Make fallback completions for tags inside the template a bit better + const isAtStartTag = + !isInTag(position, document.scriptInfo) && + /<\w*$/.test( + document.getText(Range.create(position.line, 0, position.line, position.character)) + ); + const noWrongCompletionAtStartTag = + isAtStartTag && hasParserError + ? (value: ts.CompletionEntry) => startsWithUppercase.test(value.name) + : () => true; + const isNoSvelte2tsxCompletion = (value: ts.CompletionEntry) => value.kindModifiers !== 'declare' || (!value.name.startsWith('__sveltets_') && !svelte2tsxTypes.has(value.name)); @@ -880,5 +894,7 @@ function isValidCompletion( // Remove jsx attributes on html tags because they are doubled by the HTML // attribute suggestions, and for events they are wrong (onX instead of on:X). // Therefore filter them out. - value.kind !== ts.ScriptElementKind.jsxAttribute && isNoSvelte2tsxCompletion(value); + value.kind !== ts.ScriptElementKind.jsxAttribute && + isNoSvelte2tsxCompletion(value) && + noWrongCompletionAtStartTag(value); }