From e185ebb8d52bac8e0a344629d7cfda8e7e39c2b3 Mon Sep 17 00:00:00 2001 From: Arthur Ozga Date: Tue, 14 Mar 2017 18:24:00 -0700 Subject: [PATCH] simplify rest param handling --- src/compiler/checker.ts | 6 ++--- src/services/codefixes/fixAddMissingMember.ts | 4 +-- src/services/codefixes/helpers.ts | 25 +++++++++++-------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e9cea047ea..df4bfbb845 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2340,8 +2340,8 @@ namespace ts { // The type is an object literal type. if (!type.symbol) { // Anonymous types without symbols are literals. - // mapToTypeDeclarationsArray(type) - throw new Error("unknown case."); + // TODO: handle this case correctly. + noop(); } return createTypeLiteralNodeFromType(type); @@ -2471,7 +2471,7 @@ namespace ts { case SyntaxKind.IndexSignature: throw new Error("type literal constituent not implemented."); default: - throw new Error("Unknown case."); + throw new Error("Unknown resolved member kind."); } }); return typeElements.length ? typeElements : undefined; diff --git a/src/services/codefixes/fixAddMissingMember.ts b/src/services/codefixes/fixAddMissingMember.ts index 61c823908d..ace11cda80 100644 --- a/src/services/codefixes/fixAddMissingMember.ts +++ b/src/services/codefixes/fixAddMissingMember.ts @@ -52,7 +52,7 @@ namespace ts.codefix { , /*initializer*/ undefined); // TODO: make index signature. const propertyChangeTracker = textChanges.ChangeTracker.fromCodeFixContext(context); - propertyChangeTracker.insertNodeAfter(sourceFile, openBrace, property, { insertTrailingNewLine: true }); + propertyChangeTracker.insertNodeAfter(sourceFile, openBrace, property, { suffix: context.newLineCharacter }); const stringTypeNode = createKeywordTypeNode(SyntaxKind.StringKeyword); const indexingParameter = createParameter( @@ -70,7 +70,7 @@ namespace ts.codefix { , /*modifiers*/ undefined); const indexSignatureChangeTracker = textChanges.ChangeTracker.fromCodeFixContext(context); - indexSignatureChangeTracker.insertNodeAfter(sourceFile, openBrace, indexSignature, { insertTrailingNewLine: true }); + indexSignatureChangeTracker.insertNodeAfter(sourceFile, openBrace, indexSignature, { suffix: context.newLineCharacter }); return [{ description: formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Add_declaration_for_missing_property_0), [token.getText()]), diff --git a/src/services/codefixes/helpers.ts b/src/services/codefixes/helpers.ts index e6f4524c71..da579cccb1 100644 --- a/src/services/codefixes/helpers.ts +++ b/src/services/codefixes/helpers.ts @@ -11,7 +11,7 @@ namespace ts.codefix { const changeTracker = textChanges.ChangeTracker.fromCodeFixContext(context); for (const newNode of newNodes) { - changeTracker.insertNodeAfter(sourceFile, insertAfter, newNode, { insertTrailingNewLine: true }); + changeTracker.insertNodeAfter(sourceFile, insertAfter, newNode, { suffix: context.newLineCharacter }); } return changeTracker.getChanges(); } @@ -137,20 +137,23 @@ namespace ts.codefix { function createMethodImplementingSignatures(signatures: Signature[], name: PropertyName, modifiers: Modifier[] | undefined): MethodDeclaration { Debug.assert(signatures && signatures.length > 0); - let maxNonRestArgs = -1; let maxArgsIndex = 0; + /** This is *a* signature with the maximal number of arguments, + * such that if there is a "maximal" signature without rest arguments, + * this is one of them. + */ + let maxArgsSignature = signatures[0]; let minArgumentCount = signatures[0].minArgumentCount; - let hasRestParameter = false; + let someSigHasRestParameter = false; for (let i = 0; i < signatures.length; i++) { const sig = signatures[i]; minArgumentCount = Math.min(sig.minArgumentCount, minArgumentCount); - hasRestParameter = hasRestParameter || sig.hasRestParameter; - const nonRestLength = sig.parameters.length - (sig.hasRestParameter ? 1 : 0); - if (nonRestLength >= maxNonRestArgs) { - maxNonRestArgs = nonRestLength; - maxArgsIndex = i; + someSigHasRestParameter = someSigHasRestParameter || sig.hasRestParameter; + if (sig.parameters.length >= maxArgsSignature.parameters.length && (!sig.hasRestParameter || maxArgsSignature.hasRestParameter)) { + maxArgsSignature = sig; } } + const maxNonRestArgs = maxArgsSignature.parameters.length - (maxArgsSignature.hasRestParameter ? 1 : 0); const maxArgsParameterSymbolNames = signatures[maxArgsIndex].getParameters().map(symbol => symbol.getName()); const parameters: ParameterDeclaration[] = []; @@ -167,15 +170,15 @@ namespace ts.codefix { parameters.push(newParameter); } - if (hasRestParameter) { - const anyType = createKeywordTypeNode(SyntaxKind.AnyKeyword); + if (someSigHasRestParameter) { + const anyArrayType = createArrayTypeNode(createKeywordTypeNode(SyntaxKind.AnyKeyword)); const restParameter = createParameter( /*decorators*/ undefined , /*modifiers*/ undefined , createToken(SyntaxKind.DotDotDotToken) , maxArgsParameterSymbolNames[maxNonRestArgs] || "rest" , /*questionToken*/ maxNonRestArgs >= minArgumentCount ? createToken(SyntaxKind.QuestionToken) : undefined - , anyType + , anyArrayType , /*initializer*/ undefined); parameters.push(restParameter); }