diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 7ed3ae2e429..5d1ac5c491f 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -868,8 +868,7 @@ namespace FourSlash { const actualByName = ts.createMap(); for (const entry of actualCompletions.entries) { if (actualByName.has(entry.name)) { - // TODO: GH#23587 - if (entry.name !== "undefined" && entry.name !== "require") this.raiseError(`Duplicate (${actualCompletions.entries.filter(a => a.name === entry.name).length}) completions for ${entry.name}`); + this.raiseError(`Duplicate (${actualCompletions.entries.filter(a => a.name === entry.name).length}) completions for ${entry.name}`); } else { actualByName.set(entry.name, entry); diff --git a/src/services/completions.ts b/src/services/completions.ts index 2b213361418..40986543318 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -2116,8 +2116,8 @@ namespace ts.Completions { const kind = stringToToken(entry.name)!; switch (keywordFilter) { case KeywordCompletionFilters.None: - // "undefined" is a global variable, so don't need a keyword completion for it. - return kind !== SyntaxKind.UndefinedKeyword; + return kind === SyntaxKind.AsyncKeyword || !isContextualKeyword(kind) && !isClassMemberCompletionKeyword(kind) || kind === SyntaxKind.DeclareKeyword || kind === SyntaxKind.ModuleKeyword + || isTypeKeyword(kind) && kind !== SyntaxKind.UndefinedKeyword; case KeywordCompletionFilters.ClassElementKeywords: return isClassMemberCompletionKeyword(kind); case KeywordCompletionFilters.InterfaceElementKeywords: @@ -2152,7 +2152,7 @@ namespace ts.Completions { } function isFunctionLikeBodyKeyword(kind: SyntaxKind) { - return kind === SyntaxKind.AsyncKeyword || !isClassMemberCompletionKeyword(kind); + return kind === SyntaxKind.AsyncKeyword || !isContextualKeyword(kind) && !isClassMemberCompletionKeyword(kind); } function keywordForNode(node: Node): SyntaxKind { diff --git a/tests/cases/fourslash/completionEntryForPrimitive.ts b/tests/cases/fourslash/completionEntryForPrimitive.ts deleted file mode 100644 index 9562e879266..00000000000 --- a/tests/cases/fourslash/completionEntryForPrimitive.ts +++ /dev/null @@ -1,8 +0,0 @@ -/// - -////var x = Object.create(/**/ - -goTo.marker(); -verify.not.completionListIsEmpty(); -edit.insert("nu"); -verify.completionListContains("number", undefined, undefined, "keyword"); \ No newline at end of file diff --git a/tests/cases/fourslash/completionListKeywords.ts b/tests/cases/fourslash/completionListKeywords.ts index edfc54bcc7d..8b9a8cc222c 100644 --- a/tests/cases/fourslash/completionListKeywords.ts +++ b/tests/cases/fourslash/completionListKeywords.ts @@ -1,48 +1,42 @@ /// -/////**/ +//// -goTo.marker(); -verify.completionListContains("break"); -verify.completionListContains("case"); -verify.completionListContains("catch"); -verify.completionListContains("class"); -verify.completionListContains("constructor"); -verify.completionListContains("continue"); -verify.completionListContains("debugger"); -verify.completionListContains("declare"); -verify.completionListContains("default"); -verify.completionListContains("delete"); -verify.completionListContains("do"); -verify.completionListContains("else"); -verify.completionListContains("enum"); -verify.completionListContains("export"); -verify.completionListContains("extends"); -verify.completionListContains("false"); -verify.completionListContains("finally"); -verify.completionListContains("for"); -verify.completionListContains("function"); -verify.completionListContains("get"); -verify.completionListContains("if"); -verify.completionListContains("implements"); -verify.completionListContains("import"); -verify.completionListContains("in"); -verify.completionListContains("instanceof"); -verify.completionListContains("interface"); -verify.completionListContains("module"); -verify.completionListContains("new"); -verify.completionListContains("private"); -verify.completionListContains("public"); -verify.completionListContains("return"); -verify.completionListContains("set"); -verify.completionListContains("static"); -verify.completionListContains("super"); -verify.completionListContains("switch"); -verify.completionListContains("this"); -verify.completionListContains("throw"); -verify.completionListContains("true"); -verify.completionListContains("try"); -verify.completionListContains("typeof"); -verify.completionListContains("var"); -verify.completionListContains("while"); -verify.completionListContains("with"); +verify.completions({ + includes: [ + "break", + "case", + "catch", + "class", + "continue", + "debugger", + "declare", + "default", + "delete", + "do", + "else", + "enum", + "export", + "extends", + "false", + "finally", + "for", + "function", + "if", + "instanceof", + "interface", + "module", + "new", + "return", + "super", + "switch", + "this", + "throw", + "true", + "try", + "typeof", + "var", + "while", + "with", + ], +}); diff --git a/tests/cases/fourslash/completionListPrimitives.ts b/tests/cases/fourslash/completionListPrimitives.ts deleted file mode 100644 index 7be481f853e..00000000000 --- a/tests/cases/fourslash/completionListPrimitives.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// - -//// - -verify.completions({ includes: ["any", "boolean", "null", "number", "string", "undefined", "void"] })