From b1f2db7e8e13e40b72a8c5102e3ed6a850be7887 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Sat, 30 Oct 2021 00:23:37 +0300 Subject: [PATCH] fix(46589): omit ? in method signature completion for optional methods --- src/services/codefixes/helpers.ts | 7 ++- src/services/completions.ts | 3 +- .../fourslash/completionsOverridingMethod9.ts | 44 +++++++++++++++++++ 3 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 tests/cases/fourslash/completionsOverridingMethod9.ts diff --git a/src/services/codefixes/helpers.ts b/src/services/codefixes/helpers.ts index 4564a571b1f43..7d2bcbf4865dd 100644 --- a/src/services/codefixes/helpers.ts +++ b/src/services/codefixes/helpers.ts @@ -63,7 +63,6 @@ namespace ts.codefix { const visibilityModifier = createVisibilityModifier(getEffectiveModifierFlags(declaration)); const modifiers = visibilityModifier ? factory.createNodeArray([visibilityModifier]) : undefined; const type = checker.getWidenedType(checker.getTypeOfSymbolAtLocation(symbol, enclosingDeclaration)); - const optional = !!(symbol.flags & SymbolFlags.Optional); const ambient = !!(enclosingDeclaration.flags & NodeFlags.Ambient) || isAmbient; const quotePreference = getQuotePreference(sourceFile, preferences); @@ -83,7 +82,7 @@ namespace ts.codefix { /*decorators*/ undefined, modifiers, name, - optional ? factory.createToken(SyntaxKind.QuestionToken) : undefined, + /*questionOrExclamationToken*/ undefined, typeNode, /*initializer*/ undefined)); break; @@ -158,14 +157,14 @@ namespace ts.codefix { } else { Debug.assert(declarations.length === signatures.length, "Declarations and signatures should match count"); - addClassElement(createMethodImplementingSignatures(checker, context, enclosingDeclaration, signatures, name, optional, modifiers, quotePreference, body)); + addClassElement(createMethodImplementingSignatures(checker, context, enclosingDeclaration, signatures, name, /*optional*/ false, modifiers, quotePreference, body)); } } break; } function outputMethod(quotePreference: QuotePreference, signature: Signature, modifiers: NodeArray | undefined, name: PropertyName, body?: Block): void { - const method = createSignatureDeclarationFromSignature(SyntaxKind.MethodDeclaration, context, quotePreference, signature, body, name, modifiers, optional, enclosingDeclaration, importAdder); + const method = createSignatureDeclarationFromSignature(SyntaxKind.MethodDeclaration, context, quotePreference, signature, body, name, modifiers, /*optional*/ false, enclosingDeclaration, importAdder); if (method) addClassElement(method); } } diff --git a/src/services/completions.ts b/src/services/completions.ts index c70efda3f34e7..966daeb455a31 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -888,7 +888,7 @@ namespace ts.Completions { node => { let requiredModifiers = ModifierFlags.None; if (isAbstract) { - requiredModifiers |= ModifierFlags.Abstract; + requiredModifiers |= ModifierFlags.Abstract; } if (isClassElement(node) && checker.getMemberOverrideModifierStatus(classLikeDeclaration, node) === MemberOverrideStatus.NeedsOverride) { @@ -3882,5 +3882,6 @@ namespace ts.Completions { } return charCode; } + } diff --git a/tests/cases/fourslash/completionsOverridingMethod9.ts b/tests/cases/fourslash/completionsOverridingMethod9.ts new file mode 100644 index 0000000000000..0be512f698801 --- /dev/null +++ b/tests/cases/fourslash/completionsOverridingMethod9.ts @@ -0,0 +1,44 @@ +/// + +// @Filename: a.ts +// @newline: LF + +////interface IFoo { +//// a?: number; +//// b?(x: number): void; +////} +////class Foo implements IFoo { +//// /**/ +////} + +verify.completions({ + marker: "", + isNewIdentifierLocation: true, + preferences: { + includeCompletionsWithInsertText: true, + includeCompletionsWithSnippetText: false, + includeCompletionsWithClassMemberSnippets: true, + }, + includes: [ + { + name: "a", + sortText: completion.SortText.LocationPriority, + replacementSpan: { + fileName: "", + pos: 0, + end: 0, + }, + insertText: "a: number;\n" + }, + { + name: "b", + sortText: completion.SortText.LocationPriority, + replacementSpan: { + fileName: "", + pos: 0, + end: 0, + }, + insertText: "b(x: number): void {\n}\n" + }, + ], +});