diff --git a/src/services/codefixes/helpers.ts b/src/services/codefixes/helpers.ts index 4564a571b1f43..de474f57c7954 100644 --- a/src/services/codefixes/helpers.ts +++ b/src/services/codefixes/helpers.ts @@ -50,6 +50,7 @@ namespace ts.codefix { importAdder: ImportAdder | undefined, addClassElement: (node: AddNode) => void, body: Block | undefined, + preserveOptional = true, isAmbient = false, ): void { const declarations = symbol.getDeclarations(); @@ -63,7 +64,7 @@ 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 optional = preserveOptional && !!(symbol.flags & SymbolFlags.Optional); const ambient = !!(enclosingDeclaration.flags & NodeFlags.Ambient) || isAmbient; const quotePreference = getQuotePreference(sourceFile, preferences); diff --git a/src/services/completions.ts b/src/services/completions.ts index c70efda3f34e7..f86c30777523d 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) { @@ -912,6 +912,7 @@ namespace ts.Completions { completionNodes.push(node); }, body, + /*preserveOptional*/ false, isAbstract); if (completionNodes.length) { @@ -3882,5 +3883,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" + }, + ], +});