diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9dd1fda7f53..7c5e8153a66 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2218,7 +2218,7 @@ namespace ts { indexInfoToIndexSignatureDeclaration: (indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags) => { Debug.assert(encounteredError === false, "Nested call into nodeBuilder are forbidden."); encounteredError = false; - const resultingNode = indexInfoToIndexSignatureDeclarationHelper(indexInfo, kind, enclosingDeclaration, flags) + const resultingNode = indexInfoToIndexSignatureDeclarationHelper(indexInfo, kind, enclosingDeclaration, flags); const result = encounteredError ? undefined : resultingNode; encounteredError = false; return result; @@ -2568,8 +2568,8 @@ namespace ts { function indexInfoToIndexSignatureDeclarationHelper(indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration: Node, flags: NodeBuilderFlags): IndexSignatureDeclaration { const indexerTypeNode = createKeywordTypeNode(kind === IndexKind.String ? SyntaxKind.StringKeyword : SyntaxKind.NumberKeyword); - const name = getNameFromIndexInfo(indexInfo); + const indexingParameter = createParameter( /*decorators*/ undefined, /*modifiers*/ undefined, diff --git a/src/services/codefixes/helpers.ts b/src/services/codefixes/helpers.ts index d26edbac17a..49f95243c95 100644 --- a/src/services/codefixes/helpers.ts +++ b/src/services/codefixes/helpers.ts @@ -67,6 +67,7 @@ namespace ts.codefix { const visibilityModifier = createVisibilityModifier(getModifierFlags(declaration)); const modifiers = visibilityModifier ? createNodeArray([visibilityModifier]) : undefined; const type = checker.getWidenedType(checker.getTypeOfSymbolAtLocation(symbol, enclosingDeclaration)); + const optional = !!(symbol.flags & SymbolFlags.Optional); switch (declaration.kind) { case SyntaxKind.GetAccessor: @@ -78,7 +79,7 @@ namespace ts.codefix { /*decorators*/undefined, modifiers, name, - /*questionToken*/ undefined, + optional ? createToken(SyntaxKind.QuestionToken) : undefined, typeNode, /*initializer*/ undefined); return property; @@ -96,36 +97,27 @@ namespace ts.codefix { return undefined; } - const optional = !!(symbol.flags & SymbolFlags.Optional); if (declarations.length === 1) { Debug.assert(signatures.length === 1); const signature = signatures[0]; - const signatureDeclaration = checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration); - signatureDeclaration.modifiers = modifiers; - signatureDeclaration.name = name; - signatureDeclaration.questionToken = optional ? createToken(SyntaxKind.QuestionToken) : undefined; - signatureDeclaration.body = createStubbedMethodBody(); - return signatureDeclaration; + return signatureToMethodDeclaration(signature, enclosingDeclaration, createStubbedMethodBody()); } const signatureDeclarations = []; for (let i = 0; i < signatures.length; i++) { const signature = signatures[i]; - const signatureDeclaration = checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration); - signatureDeclaration.modifiers = modifiers; - signatureDeclaration.name = name; - signatureDeclaration.questionToken = optional ? createToken(SyntaxKind.QuestionToken) : undefined; - signatureDeclarations.push(signatureDeclaration); + const methodDeclaration = signatureToMethodDeclaration(signature, enclosingDeclaration); + if (methodDeclaration) { + signatureDeclarations.push(methodDeclaration); + } } if (declarations.length > signatures.length) { const signature = checker.getSignatureFromDeclaration(declarations[declarations.length - 1] as SignatureDeclaration); - const signatureDeclaration = checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration); - signatureDeclaration.modifiers = modifiers; - signatureDeclaration.name = name; - signatureDeclaration.questionToken = optional ? createToken(SyntaxKind.QuestionToken) : undefined; - signatureDeclaration.body = createStubbedMethodBody(); - signatureDeclarations.push(signatureDeclaration); + const methodDeclaration = signatureToMethodDeclaration(signature, enclosingDeclaration, createStubbedMethodBody()); + if (methodDeclaration) { + signatureDeclarations.push(methodDeclaration); + } } else { Debug.assert(declarations.length === signatures.length); @@ -136,6 +128,17 @@ namespace ts.codefix { default: return undefined; } + + function signatureToMethodDeclaration(signature: Signature, enclosingDeclaration: Node, body?: Block) { + const signatureDeclaration = checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration); + if (signatureDeclaration) { + signatureDeclaration.modifiers = modifiers; + signatureDeclaration.name = name; + signatureDeclaration.questionToken = optional ? createToken(SyntaxKind.QuestionToken) : undefined; + signatureDeclaration.body = body; + } + return signatureDeclaration; + } } function createMethodImplementingSignatures(signatures: Signature[], name: PropertyName, optional: boolean, modifiers: Modifier[] | undefined): MethodDeclaration { diff --git a/tests/cases/fourslash/codeFixClassImplementClassMemberAnonymousClass.ts b/tests/cases/fourslash/codeFixClassImplementClassMemberAnonymousClass.ts index a8a024d194b..ee8b8cafffe 100644 --- a/tests/cases/fourslash/codeFixClassImplementClassMemberAnonymousClass.ts +++ b/tests/cases/fourslash/codeFixClassImplementClassMemberAnonymousClass.ts @@ -10,11 +10,4 @@ //// } //// class C implements A {[| |]} -verify.rangeAfterCodeFix(` - foo() { - throw new Error("Method not implemented."); - } - bar() { - throw new Error("Method not implemented."); - } -`); +verify.not.codeFixAvailable();