Skip to content

Commit a7c166c

Browse files
author
Arthur Ozga
committed
optional signature
1 parent 5421812 commit a7c166c

File tree

3 files changed

+25
-29
lines changed

3 files changed

+25
-29
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2218,7 +2218,7 @@ namespace ts {
22182218
indexInfoToIndexSignatureDeclaration: (indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags) => {
22192219
Debug.assert(encounteredError === false, "Nested call into nodeBuilder are forbidden.");
22202220
encounteredError = false;
2221-
const resultingNode = indexInfoToIndexSignatureDeclarationHelper(indexInfo, kind, enclosingDeclaration, flags)
2221+
const resultingNode = indexInfoToIndexSignatureDeclarationHelper(indexInfo, kind, enclosingDeclaration, flags);
22222222
const result = encounteredError ? undefined : resultingNode;
22232223
encounteredError = false;
22242224
return result;
@@ -2568,8 +2568,8 @@ namespace ts {
25682568

25692569
function indexInfoToIndexSignatureDeclarationHelper(indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration: Node, flags: NodeBuilderFlags): IndexSignatureDeclaration {
25702570
const indexerTypeNode = createKeywordTypeNode(kind === IndexKind.String ? SyntaxKind.StringKeyword : SyntaxKind.NumberKeyword);
2571-
25722571
const name = getNameFromIndexInfo(indexInfo);
2572+
25732573
const indexingParameter = createParameter(
25742574
/*decorators*/ undefined,
25752575
/*modifiers*/ undefined,

src/services/codefixes/helpers.ts

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ namespace ts.codefix {
6767
const visibilityModifier = createVisibilityModifier(getModifierFlags(declaration));
6868
const modifiers = visibilityModifier ? createNodeArray([visibilityModifier]) : undefined;
6969
const type = checker.getWidenedType(checker.getTypeOfSymbolAtLocation(symbol, enclosingDeclaration));
70+
const optional = !!(symbol.flags & SymbolFlags.Optional);
7071

7172
switch (declaration.kind) {
7273
case SyntaxKind.GetAccessor:
@@ -78,7 +79,7 @@ namespace ts.codefix {
7879
/*decorators*/undefined,
7980
modifiers,
8081
name,
81-
/*questionToken*/ undefined,
82+
optional ? createToken(SyntaxKind.QuestionToken) : undefined,
8283
typeNode,
8384
/*initializer*/ undefined);
8485
return property;
@@ -96,36 +97,27 @@ namespace ts.codefix {
9697
return undefined;
9798
}
9899

99-
const optional = !!(symbol.flags & SymbolFlags.Optional);
100100
if (declarations.length === 1) {
101101
Debug.assert(signatures.length === 1);
102102
const signature = signatures[0];
103-
const signatureDeclaration = <MethodDeclaration>checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration);
104-
signatureDeclaration.modifiers = modifiers;
105-
signatureDeclaration.name = name;
106-
signatureDeclaration.questionToken = optional ? createToken(SyntaxKind.QuestionToken) : undefined;
107-
signatureDeclaration.body = createStubbedMethodBody();
108-
return signatureDeclaration;
103+
return signatureToMethodDeclaration(signature, enclosingDeclaration, createStubbedMethodBody());
109104
}
110105

111106
const signatureDeclarations = [];
112107
for (let i = 0; i < signatures.length; i++) {
113108
const signature = signatures[i];
114-
const signatureDeclaration = <MethodDeclaration>checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration);
115-
signatureDeclaration.modifiers = modifiers;
116-
signatureDeclaration.name = name;
117-
signatureDeclaration.questionToken = optional ? createToken(SyntaxKind.QuestionToken) : undefined;
118-
signatureDeclarations.push(signatureDeclaration);
109+
const methodDeclaration = signatureToMethodDeclaration(signature, enclosingDeclaration);
110+
if (methodDeclaration) {
111+
signatureDeclarations.push(methodDeclaration);
112+
}
119113
}
120114

121115
if (declarations.length > signatures.length) {
122116
const signature = checker.getSignatureFromDeclaration(declarations[declarations.length - 1] as SignatureDeclaration);
123-
const signatureDeclaration = <MethodDeclaration>checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration);
124-
signatureDeclaration.modifiers = modifiers;
125-
signatureDeclaration.name = name;
126-
signatureDeclaration.questionToken = optional ? createToken(SyntaxKind.QuestionToken) : undefined;
127-
signatureDeclaration.body = createStubbedMethodBody();
128-
signatureDeclarations.push(signatureDeclaration);
117+
const methodDeclaration = signatureToMethodDeclaration(signature, enclosingDeclaration, createStubbedMethodBody());
118+
if (methodDeclaration) {
119+
signatureDeclarations.push(methodDeclaration);
120+
}
129121
}
130122
else {
131123
Debug.assert(declarations.length === signatures.length);
@@ -136,6 +128,17 @@ namespace ts.codefix {
136128
default:
137129
return undefined;
138130
}
131+
132+
function signatureToMethodDeclaration(signature: Signature, enclosingDeclaration: Node, body?: Block) {
133+
const signatureDeclaration = <MethodDeclaration>checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration);
134+
if (signatureDeclaration) {
135+
signatureDeclaration.modifiers = modifiers;
136+
signatureDeclaration.name = name;
137+
signatureDeclaration.questionToken = optional ? createToken(SyntaxKind.QuestionToken) : undefined;
138+
signatureDeclaration.body = body;
139+
}
140+
return signatureDeclaration;
141+
}
139142
}
140143

141144
function createMethodImplementingSignatures(signatures: Signature[], name: PropertyName, optional: boolean, modifiers: Modifier[] | undefined): MethodDeclaration {

tests/cases/fourslash/codeFixClassImplementClassMemberAnonymousClass.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,4 @@
1010
//// }
1111
//// class C implements A {[| |]}
1212

13-
verify.rangeAfterCodeFix(`
14-
foo() {
15-
throw new Error("Method not implemented.");
16-
}
17-
bar() {
18-
throw new Error("Method not implemented.");
19-
}
20-
`);
13+
verify.not.codeFixAvailable();

0 commit comments

Comments
 (0)