From 1d77caae6afb18a82c1869890fdb457f709b8646 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 15 Jun 2023 20:03:33 +0300 Subject: [PATCH 1/5] fix: no variable suggestions without semicolon --- src/services/completions.ts | 14 +++++++++----- tests/cases/fourslash/completionEntryForConst.ts | 7 +++++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index 0becb60309ed2..9ab6c450ca286 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -2439,7 +2439,7 @@ export function getCompletionEntriesFromSymbols( includeSymbol = false ): UniqueNameSet { const start = timestamp(); - const variableOrParameterDeclaration = getVariableOrParameterDeclaration(contextToken); + const variableOrParameterDeclaration = getVariableOrParameterDeclaration(contextToken, location); const useSemicolons = probablyUsesSemicolons(sourceFile); const typeChecker = program.getTypeChecker(); // Tracks unique names. @@ -5516,14 +5516,18 @@ function isModuleSpecifierMissingOrEmpty(specifier: ModuleReference | Expression return !tryCast(isExternalModuleReference(specifier) ? specifier.expression : specifier, isStringLiteralLike)?.text; } -function getVariableOrParameterDeclaration(contextToken: Node | undefined) { +function getVariableOrParameterDeclaration(contextToken: Node | undefined, location: Node) { if (!contextToken) return; - const declaration = findAncestor(contextToken, node => + const possiblyParameterDeclaration = findAncestor(contextToken, node => isFunctionBlock(node) || isArrowFunctionBody(node) || isBindingPattern(node) ? "quit" - : isVariableDeclaration(node) || ((isParameter(node) || isTypeParameterDeclaration(node)) && !isIndexSignatureDeclaration(node.parent))); - return declaration as ParameterDeclaration | TypeParameterDeclaration | VariableDeclaration | undefined; + : ((isParameter(node) || isTypeParameterDeclaration(node)) && !isIndexSignatureDeclaration(node.parent))); + const possiblyVariableDeclaration = findAncestor(location, (node) => { + return isFunctionBlock(node) || isArrowFunctionBody(node) || isBindingPattern(node) ? + "quit" : isVariableDeclaration(node) + }) + return (possiblyVariableDeclaration || possiblyParameterDeclaration) as ParameterDeclaration | TypeParameterDeclaration | VariableDeclaration | undefined; } function isArrowFunctionBody(node: Node) { diff --git a/tests/cases/fourslash/completionEntryForConst.ts b/tests/cases/fourslash/completionEntryForConst.ts index c89dd82124580..e08539393b51b 100644 --- a/tests/cases/fourslash/completionEntryForConst.ts +++ b/tests/cases/fourslash/completionEntryForConst.ts @@ -1,6 +1,9 @@ /// ////const c = "s"; -/////**/ +/////*1*/ +////const d = 1 +/////*2*/ -verify.completions({ marker: "", includes: { name: "c", text: 'const c: "s"', kind: "const" } }); +verify.completions({ marker: ["1"], includes: { name: "c", text: 'const c: "s"', kind: "const" } }); +verify.completions({ marker: ["2"], includes: { name: "d", text: 'const d: 1', kind: "const" } }); From 9c87f3a928424e45813a8ecb00b778e81811d1d9 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 15 Jun 2023 20:03:43 +0300 Subject: [PATCH 2/5] tests! --- tests/cases/fourslash/completionEntryForConst.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/cases/fourslash/completionEntryForConst.ts b/tests/cases/fourslash/completionEntryForConst.ts index e08539393b51b..db19101919cf0 100644 --- a/tests/cases/fourslash/completionEntryForConst.ts +++ b/tests/cases/fourslash/completionEntryForConst.ts @@ -1,9 +1,13 @@ /// +//@Filename ////const c = "s"; /////*1*/ ////const d = 1 -/////*2*/ +////d/*2*/ +////const e = 1 +/////*3*/ verify.completions({ marker: ["1"], includes: { name: "c", text: 'const c: "s"', kind: "const" } }); verify.completions({ marker: ["2"], includes: { name: "d", text: 'const d: 1', kind: "const" } }); +verify.completions({ marker: ["3"], includes: { name: "e", text: 'const e: 1', kind: "const" } }); From f67c9a3b13c364fda2a15e5754e6ae93c037607d Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 15 Jun 2023 20:09:25 +0300 Subject: [PATCH 3/5] lint --- src/services/completions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index 9ab6c450ca286..99c942720f7c2 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -5525,8 +5525,8 @@ function getVariableOrParameterDeclaration(contextToken: Node | undefined, locat : ((isParameter(node) || isTypeParameterDeclaration(node)) && !isIndexSignatureDeclaration(node.parent))); const possiblyVariableDeclaration = findAncestor(location, (node) => { return isFunctionBlock(node) || isArrowFunctionBody(node) || isBindingPattern(node) ? - "quit" : isVariableDeclaration(node) - }) + "quit" : isVariableDeclaration(node); + }); return (possiblyVariableDeclaration || possiblyParameterDeclaration) as ParameterDeclaration | TypeParameterDeclaration | VariableDeclaration | undefined; } From 862807be79d32e5d5d91955b92807478bee8426b Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 15 Jun 2023 20:27:16 +0300 Subject: [PATCH 4/5] make sure parameter takes priority --- src/services/completions.ts | 2 +- tests/cases/fourslash/completionEntryForConst.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index 99c942720f7c2..bb76d07c10f11 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -5527,7 +5527,7 @@ function getVariableOrParameterDeclaration(contextToken: Node | undefined, locat return isFunctionBlock(node) || isArrowFunctionBody(node) || isBindingPattern(node) ? "quit" : isVariableDeclaration(node); }); - return (possiblyVariableDeclaration || possiblyParameterDeclaration) as ParameterDeclaration | TypeParameterDeclaration | VariableDeclaration | undefined; + return (possiblyParameterDeclaration || possiblyVariableDeclaration) as ParameterDeclaration | TypeParameterDeclaration | VariableDeclaration | undefined; } function isArrowFunctionBody(node: Node) { diff --git a/tests/cases/fourslash/completionEntryForConst.ts b/tests/cases/fourslash/completionEntryForConst.ts index db19101919cf0..39d85df6de4c7 100644 --- a/tests/cases/fourslash/completionEntryForConst.ts +++ b/tests/cases/fourslash/completionEntryForConst.ts @@ -1,6 +1,5 @@ /// -//@Filename ////const c = "s"; /////*1*/ ////const d = 1 From 4c2bcc935563e509add094cc86ed5fb7eb82f51f Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 23 Jun 2023 03:35:37 +0300 Subject: [PATCH 5/5] better formatting --- src/services/completions.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index bb76d07c10f11..d39b357776885 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -5523,10 +5523,12 @@ function getVariableOrParameterDeclaration(contextToken: Node | undefined, locat isFunctionBlock(node) || isArrowFunctionBody(node) || isBindingPattern(node) ? "quit" : ((isParameter(node) || isTypeParameterDeclaration(node)) && !isIndexSignatureDeclaration(node.parent))); - const possiblyVariableDeclaration = findAncestor(location, (node) => { - return isFunctionBlock(node) || isArrowFunctionBody(node) || isBindingPattern(node) ? - "quit" : isVariableDeclaration(node); - }); + + const possiblyVariableDeclaration = findAncestor(location, node => + isFunctionBlock(node) || isArrowFunctionBody(node) || isBindingPattern(node) + ? "quit" + : isVariableDeclaration(node)); + return (possiblyParameterDeclaration || possiblyVariableDeclaration) as ParameterDeclaration | TypeParameterDeclaration | VariableDeclaration | undefined; }