mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-06-26 09:19:04 -05:00
optional signature
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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 = <MethodDeclaration>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 = <MethodDeclaration>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 = <MethodDeclaration>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 = <MethodDeclaration>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 {
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user