From 33829fa4a4a4cc0b54d3793ced9a31fa42930e3a Mon Sep 17 00:00:00 2001 From: Armando Aguirre Date: Mon, 16 Aug 2021 21:09:12 -0700 Subject: [PATCH 1/5] Fix and updated tests --- src/services/completions.ts | 8 ++++---- .../cases/fourslash/completionInUncheckedJSFile.ts | 13 +------------ tests/cases/fourslash/getJavaScriptCompletions12.ts | 2 +- tests/cases/fourslash/javaScriptPrototype2.ts | 2 +- tests/cases/fourslash/server/jsdocTypedefTag2.ts | 10 +--------- 5 files changed, 8 insertions(+), 27 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index 285095e727a0c..1693185d62247 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -416,6 +416,10 @@ namespace ts.Completions { } } + if (!isNewIdentifierLocation && (!symbols || symbols.length === 0) && keywordFilters === KeywordCompletionFilters.None) { + return undefined; + } + const entries: CompletionEntry[] = []; if (isUncheckedFile(sourceFile, compilerOptions)) { @@ -443,10 +447,6 @@ namespace ts.Completions { getJSCompletionEntries(sourceFile, location.pos, uniqueNames, compilerOptions.target!, entries); // TODO: GH#18217 } else { - if (!isNewIdentifierLocation && (!symbols || symbols.length === 0) && keywordFilters === KeywordCompletionFilters.None) { - return undefined; - } - getCompletionEntriesFromSymbols( symbols, entries, diff --git a/tests/cases/fourslash/completionInUncheckedJSFile.ts b/tests/cases/fourslash/completionInUncheckedJSFile.ts index dcc3d95ed204d..1aa97c79f8d49 100644 --- a/tests/cases/fourslash/completionInUncheckedJSFile.ts +++ b/tests/cases/fourslash/completionInUncheckedJSFile.ts @@ -13,16 +13,5 @@ verify.completions({ marker: "0", - includes: [ - { - name: "hello", - sortText: completion.SortText.JavascriptIdentifiers, - isFromUncheckedFile: true - }, - { - name: "goodbye", - sortText: completion.SortText.JavascriptIdentifiers, - isFromUncheckedFile: true - } - ] + exact: undefined }); \ No newline at end of file diff --git a/tests/cases/fourslash/getJavaScriptCompletions12.ts b/tests/cases/fourslash/getJavaScriptCompletions12.ts index 2848ee27c5462..cbbcf7fe3a6fc 100644 --- a/tests/cases/fourslash/getJavaScriptCompletions12.ts +++ b/tests/cases/fourslash/getJavaScriptCompletions12.ts @@ -26,5 +26,5 @@ verify.completions( { marker: "1", includes: { name: "charCodeAt", kind: "method", kindModifiers: "declare" } }, { marker: ["2", "3", "4"], includes: { name: "toExponential", kind: "method", kindModifiers: "declare" } }, - { marker: "5", includes: { name: "test1", kind: "warning", sortText: completion.SortText.JavascriptIdentifiers } }, + { marker: "5", exact: undefined }, ); diff --git a/tests/cases/fourslash/javaScriptPrototype2.ts b/tests/cases/fourslash/javaScriptPrototype2.ts index 17afc1ed0aa4b..0020be5f16ec4 100644 --- a/tests/cases/fourslash/javaScriptPrototype2.ts +++ b/tests/cases/fourslash/javaScriptPrototype2.ts @@ -31,4 +31,4 @@ verify.completions({ includes: { name: "toFixed", kind: "method", kindModifiers: goTo.marker('3'); edit.insert('.'); // Make sure symbols don't leak out into the constructor -verify.completions({ includes: ["qua", "foo", "bar"].map(name => ({ name, kind: "warning", sortText: completion.SortText.JavascriptIdentifiers })) }); +verify.completions({ exact: undefined }); diff --git a/tests/cases/fourslash/server/jsdocTypedefTag2.ts b/tests/cases/fourslash/server/jsdocTypedefTag2.ts index 601db94513045..43d5c133fa899 100644 --- a/tests/cases/fourslash/server/jsdocTypedefTag2.ts +++ b/tests/cases/fourslash/server/jsdocTypedefTag2.ts @@ -16,14 +16,6 @@ //// my2.yes./*1*/ //// } -//// /** -//// * @param {MyType} my2 -//// */ -//// function b(my2) { -//// my2.yes./*2*/ -//// } - verify.completions( - { marker: "1", includes: "charAt" }, - { marker: "2", excludes: "charAt" }, + { marker: "1", includes: "charAt" } ); From 2249d6c83ec7e6ac00457f3a985888334ad22732 Mon Sep 17 00:00:00 2001 From: Armando Aguirre Date: Mon, 16 Aug 2021 21:32:22 -0700 Subject: [PATCH 2/5] Added test --- tests/cases/fourslash/getJavaScriptCompletions22.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tests/cases/fourslash/getJavaScriptCompletions22.ts diff --git a/tests/cases/fourslash/getJavaScriptCompletions22.ts b/tests/cases/fourslash/getJavaScriptCompletions22.ts new file mode 100644 index 0000000000000..86f82a346eeb5 --- /dev/null +++ b/tests/cases/fourslash/getJavaScriptCompletions22.ts @@ -0,0 +1,12 @@ +/// + +// Regresion test for GH#45436 + +// @allowNonTsExtensions: true +// @Filename: file.js +//// const abc = {}; +//// ({./*1*/}); + +goTo.marker('1'); +edit.insert('.'); +verify.completions({ exact: undefined }); From e1a2b9ed19a7170b8fa823b11725431dace8045e Mon Sep 17 00:00:00 2001 From: Armando Aguirre Date: Mon, 23 Aug 2021 16:27:51 -0700 Subject: [PATCH 3/5] Revert "Fix and updated tests" This reverts commit 33829fa4a4a4cc0b54d3793ced9a31fa42930e3a. --- src/services/completions.ts | 8 ++++---- .../cases/fourslash/completionInUncheckedJSFile.ts | 13 ++++++++++++- tests/cases/fourslash/getJavaScriptCompletions12.ts | 2 +- tests/cases/fourslash/javaScriptPrototype2.ts | 2 +- tests/cases/fourslash/server/jsdocTypedefTag2.ts | 10 +++++++++- 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index 1693185d62247..285095e727a0c 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -416,10 +416,6 @@ namespace ts.Completions { } } - if (!isNewIdentifierLocation && (!symbols || symbols.length === 0) && keywordFilters === KeywordCompletionFilters.None) { - return undefined; - } - const entries: CompletionEntry[] = []; if (isUncheckedFile(sourceFile, compilerOptions)) { @@ -447,6 +443,10 @@ namespace ts.Completions { getJSCompletionEntries(sourceFile, location.pos, uniqueNames, compilerOptions.target!, entries); // TODO: GH#18217 } else { + if (!isNewIdentifierLocation && (!symbols || symbols.length === 0) && keywordFilters === KeywordCompletionFilters.None) { + return undefined; + } + getCompletionEntriesFromSymbols( symbols, entries, diff --git a/tests/cases/fourslash/completionInUncheckedJSFile.ts b/tests/cases/fourslash/completionInUncheckedJSFile.ts index 1aa97c79f8d49..dcc3d95ed204d 100644 --- a/tests/cases/fourslash/completionInUncheckedJSFile.ts +++ b/tests/cases/fourslash/completionInUncheckedJSFile.ts @@ -13,5 +13,16 @@ verify.completions({ marker: "0", - exact: undefined + includes: [ + { + name: "hello", + sortText: completion.SortText.JavascriptIdentifiers, + isFromUncheckedFile: true + }, + { + name: "goodbye", + sortText: completion.SortText.JavascriptIdentifiers, + isFromUncheckedFile: true + } + ] }); \ No newline at end of file diff --git a/tests/cases/fourslash/getJavaScriptCompletions12.ts b/tests/cases/fourslash/getJavaScriptCompletions12.ts index cbbcf7fe3a6fc..2848ee27c5462 100644 --- a/tests/cases/fourslash/getJavaScriptCompletions12.ts +++ b/tests/cases/fourslash/getJavaScriptCompletions12.ts @@ -26,5 +26,5 @@ verify.completions( { marker: "1", includes: { name: "charCodeAt", kind: "method", kindModifiers: "declare" } }, { marker: ["2", "3", "4"], includes: { name: "toExponential", kind: "method", kindModifiers: "declare" } }, - { marker: "5", exact: undefined }, + { marker: "5", includes: { name: "test1", kind: "warning", sortText: completion.SortText.JavascriptIdentifiers } }, ); diff --git a/tests/cases/fourslash/javaScriptPrototype2.ts b/tests/cases/fourslash/javaScriptPrototype2.ts index 0020be5f16ec4..17afc1ed0aa4b 100644 --- a/tests/cases/fourslash/javaScriptPrototype2.ts +++ b/tests/cases/fourslash/javaScriptPrototype2.ts @@ -31,4 +31,4 @@ verify.completions({ includes: { name: "toFixed", kind: "method", kindModifiers: goTo.marker('3'); edit.insert('.'); // Make sure symbols don't leak out into the constructor -verify.completions({ exact: undefined }); +verify.completions({ includes: ["qua", "foo", "bar"].map(name => ({ name, kind: "warning", sortText: completion.SortText.JavascriptIdentifiers })) }); diff --git a/tests/cases/fourslash/server/jsdocTypedefTag2.ts b/tests/cases/fourslash/server/jsdocTypedefTag2.ts index 43d5c133fa899..601db94513045 100644 --- a/tests/cases/fourslash/server/jsdocTypedefTag2.ts +++ b/tests/cases/fourslash/server/jsdocTypedefTag2.ts @@ -16,6 +16,14 @@ //// my2.yes./*1*/ //// } +//// /** +//// * @param {MyType} my2 +//// */ +//// function b(my2) { +//// my2.yes./*2*/ +//// } + verify.completions( - { marker: "1", includes: "charAt" } + { marker: "1", includes: "charAt" }, + { marker: "2", excludes: "charAt" }, ); From 51881c4ea22583890c2d3daddfcc798c6df6665d Mon Sep 17 00:00:00 2001 From: Armando Aguirre Date: Mon, 23 Aug 2021 17:34:47 -0700 Subject: [PATCH 4/5] Filter out empty access expression --- src/services/completions.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index 285095e727a0c..1f987c0dec1fd 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -1338,13 +1338,16 @@ namespace ts.Completions { case SyntaxKind.PropertyAccessExpression: propertyAccessToConvert = parent as PropertyAccessExpression; node = propertyAccessToConvert.expression; - if ((isCallExpression(node) || isFunctionLike(node)) && - node.end === contextToken.pos && - node.getChildCount(sourceFile) && - last(node.getChildren(sourceFile)).kind !== SyntaxKind.CloseParenToken) { + const leftMostAccessExpression = getLeftmostAccessExpression(parent as Expression); + if (leftMostAccessExpression.pos === leftMostAccessExpression.end || + ((isCallExpression(node) || isFunctionLike(node)) && + node.end === contextToken.pos && + node.getChildCount(sourceFile) && + last(node.getChildren(sourceFile)).kind !== SyntaxKind.CloseParenToken)) { // This is likely dot from incorrectly parsed expression and user is starting to write spread // eg: Math.min(./**/) // const x = function (./**/) {} + // ({./**/}) return undefined; } break; From 2253da6ae90a1933f100186842e4e4a3c2b217d3 Mon Sep 17 00:00:00 2001 From: Armando Aguirre Date: Tue, 24 Aug 2021 13:41:13 -0700 Subject: [PATCH 5/5] PR feedback --- 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 1f987c0dec1fd..ef16b782c2971 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -1338,8 +1338,8 @@ namespace ts.Completions { case SyntaxKind.PropertyAccessExpression: propertyAccessToConvert = parent as PropertyAccessExpression; node = propertyAccessToConvert.expression; - const leftMostAccessExpression = getLeftmostAccessExpression(parent as Expression); - if (leftMostAccessExpression.pos === leftMostAccessExpression.end || + const leftmostAccessExpression = getLeftmostAccessExpression(propertyAccessToConvert); + if (nodeIsMissing(leftmostAccessExpression) || ((isCallExpression(node) || isFunctionLike(node)) && node.end === contextToken.pos && node.getChildCount(sourceFile) &&