From bd600cfd50a6568bed2d667ca0db87f5f36140a6 Mon Sep 17 00:00:00 2001 From: Andy Date: Wed, 25 Jul 2018 12:29:28 -0700 Subject: [PATCH] Fix duplicate "this" completion (#25900) --- src/compiler/checker.ts | 7 ++-- src/compiler/types.ts | 1 + .../reference/api/tsserverlibrary.d.ts | 3 +- tests/baselines/reference/api/typescript.d.ts | 3 +- tests/cases/fourslash/completionsThisType.ts | 35 +++++++++---------- 5 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 26a2e9fbc70..35ef4f991ce 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -4670,7 +4670,7 @@ namespace ts { } } // Use contextual parameter type if one is available - const type = declaration.symbol.escapedName === "this" ? getContextualThisParameterType(func) : getContextuallyTypedParameterType(declaration); + const type = declaration.symbol.escapedName === InternalSymbolName.This ? getContextualThisParameterType(func) : getContextuallyTypedParameterType(declaration); if (type) { return addOptionality(type, isOptional); } @@ -7488,7 +7488,7 @@ namespace ts { const resolvedSymbol = resolveName(param, paramSymbol.escapedName, SymbolFlags.Value, undefined, undefined, /*isUse*/ false); paramSymbol = resolvedSymbol!; } - if (i === 0 && paramSymbol.escapedName === "this") { + if (i === 0 && paramSymbol.escapedName === InternalSymbolName.This) { hasThisParameter = true; thisParameter = param.symbol; } @@ -15373,7 +15373,7 @@ namespace ts { const jsDocFunctionType = jsdocType; if (jsDocFunctionType.parameters.length > 0 && jsDocFunctionType.parameters[0].name && - (jsDocFunctionType.parameters[0].name as Identifier).escapedText === "this") { + (jsDocFunctionType.parameters[0].name as Identifier).escapedText === InternalSymbolName.This) { return getTypeFromTypeNode(jsDocFunctionType.parameters[0].type!); } } @@ -26797,6 +26797,7 @@ namespace ts { populateSymbols(); + symbols.delete(InternalSymbolName.This); // Not a symbol, a keyword return symbolsToArray(symbols); function populateSymbols() { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index e1f5dcfa4e8..99d2291e898 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -3559,6 +3559,7 @@ namespace ts { Resolving = "__resolving__", // Indicator symbol used to mark partially resolved type aliases ExportEquals = "export=", // Export assignment symbol Default = "default", // Default export symbol (technically not wholly internal, but included here for usability) + This = "this", } /** diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 5118830e840..99a9c3b6100 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -2106,7 +2106,8 @@ declare namespace ts { Computed = "__computed", Resolving = "__resolving__", ExportEquals = "export=", - Default = "default" + Default = "default", + This = "this" } /** * This represents a string whose leading underscore have been escaped by adding extra leading underscores. diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 488f7c85a69..41510d5192b 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -2106,7 +2106,8 @@ declare namespace ts { Computed = "__computed", Resolving = "__resolving__", ExportEquals = "export=", - Default = "default" + Default = "default", + This = "this" } /** * This represents a string whose leading underscore have been escaped by adding extra leading underscores. diff --git a/tests/cases/fourslash/completionsThisType.ts b/tests/cases/fourslash/completionsThisType.ts index 471251d2134..9923f937afc 100644 --- a/tests/cases/fourslash/completionsThisType.ts +++ b/tests/cases/fourslash/completionsThisType.ts @@ -9,21 +9,20 @@ //// ////function f(this: { x: number }) { /*f*/ } -goTo.marker(""); - -verify.completionListContains("xyz", "(method) C.xyz(): any", "", "method", undefined, undefined, { - includeInsertTextCompletions: true, - insertText: "this.xyz", -}); - -verify.completionListContains("foo bar", '(property) C["foo bar"]: number', "", "property", undefined, undefined, { - includeInsertTextCompletions: true, - insertText: 'this["foo bar"]', -}); - -goTo.marker("f"); - -verify.completionListContains("x", "(property) x: number", "", "property", undefined, undefined, { - includeInsertTextCompletions: true, - insertText: "this.x", -}); +const preferences: FourSlashInterface.UserPreferences = { includeInsertTextCompletions: true }; +verify.completions( + { + marker: "", + includes: [ + { name: "xyz", text: "(method) C.xyz(): any", kind: "method", insertText: "this.xyz" }, + { name: "foo bar", text: '(property) C["foo bar"]: number', kind: "property", insertText: 'this["foo bar"]' }, + ], + isNewIdentifierLocation: true, + preferences, + }, + { + marker: "f", + includes: { name: "x", text: "(property) x: number", kind: "property", insertText: "this.x" }, + preferences, + }, +);