Skip to content

Commit 27fe2df

Browse files
author
Arthur Ozga
committed
some missed token bugs
1 parent e02ac17 commit 27fe2df

9 files changed

Lines changed: 34 additions & 36 deletions

File tree

src/compiler/checker.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2361,7 +2361,7 @@ namespace ts {
23612361
return createArrayTypeNode(elementType);
23622362
}
23632363
else if (type.target.objectFlags & ObjectFlags.Tuple) {
2364-
return createTupleTypeNode(mapToTypeNodeArray(typeArguments.slice(0, getTypeReferenceArity(type))));
2364+
return createTupleTypeNode(typeArguments.length > 0 ? mapToTypeNodeArray(typeArguments.slice(0, getTypeReferenceArity(type))) : undefined);
23652365
}
23662366
else {
23672367
// TODO: handle type parameters in qualified names...
@@ -2406,7 +2406,7 @@ namespace ts {
24062406
entityName = nameIdentifier;
24072407
}
24082408
const typeParameterCount = (type.target.typeParameters || emptyArray).length;
2409-
const typeArgumentNodes = mapToTypeNodeArray(typeArguments.slice(i, typeParameterCount - i));
2409+
const typeArgumentNodes = mapToTypeNodeArray(typeArguments.length > 0 ? typeArguments.slice(i, typeParameterCount - i) : undefined);
24102410
return createTypeReferenceNode(entityName, typeArgumentNodes);
24112411
}
24122412
}
@@ -2478,7 +2478,8 @@ namespace ts {
24782478
, /*dotDotDotToken*/ undefined
24792479
, name
24802480
, /*questionToken*/ undefined
2481-
, stringTypeNode);
2481+
, stringTypeNode
2482+
, /*initializer*/ undefined);
24822483
const typeNode = createTypeNode(indexInfo.type);
24832484
return createIndexSignatureDeclaration(
24842485
[indexingParameter]
@@ -7261,10 +7262,6 @@ namespace ts {
72617262
}
72627263
}
72637264

7264-
// export function synthesizeTypeNode(type: Type, enclosingDeclaration: Node): TypeNode {
7265-
// throw new Error("Not implemented" + enclosingDeclaration);
7266-
// }
7267-
72687265
function instantiateList<T>(items: T[], mapper: TypeMapper, instantiator: (item: T, mapper: TypeMapper) => T): T[] {
72697266
if (items && items.length) {
72707267
const result: T[] = [];

src/compiler/factory.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,6 @@ namespace ts {
355355

356356
export function createIndexSignatureDeclaration(parameters: ParameterDeclaration[], type: TypeNode, decorators: Decorator[] | undefined, modifiers: Modifier[] | undefined): IndexSignatureDeclaration {
357357
const indexSignature = createSynthesizedNode(SyntaxKind.IndexSignature) as IndexSignatureDeclaration;
358-
// indexSignature.name = asName(name);
359-
// type parameters
360358
indexSignature.parameters = asNodeArray(parameters);
361359
indexSignature.type = type;
362360
indexSignature.decorators = asNodeArray(decorators);
@@ -373,6 +371,8 @@ namespace ts {
373371
: node;
374372
}
375373

374+
// Signature elements
375+
376376
export function createParameter(decorators: Decorator[] | undefined, modifiers: Modifier[] | undefined, dotDotDotToken: DotDotDotToken | undefined, name: string | BindingName, questionToken?: QuestionToken, type?: TypeNode, initializer?: Expression) {
377377
const node = <ParameterDeclaration>createSynthesizedNode(SyntaxKind.Parameter);
378378
node.decorators = asNodeArray(decorators);
@@ -385,11 +385,12 @@ namespace ts {
385385
return node;
386386
}
387387

388-
export function updateParameter(node: ParameterDeclaration, decorators: Decorator[] | undefined, modifiers: Modifier[] | undefined, dotDotDotToken: DotDotDotToken | undefined, name: BindingName, type: TypeNode | undefined, initializer: Expression | undefined) {
388+
export function updateParameter(node: ParameterDeclaration, decorators: Decorator[] | undefined, modifiers: Modifier[] | undefined, dotDotDotToken: DotDotDotToken | undefined, name: string | BindingName, questionToken: QuestionToken | undefined, type: TypeNode | undefined, initializer: Expression | undefined) {
389389
return node.decorators !== decorators
390390
|| node.modifiers !== modifiers
391391
|| node.dotDotDotToken !== dotDotDotToken
392392
|| node.name !== name
393+
|| node.questionToken !== questionToken
393394
|| node.type !== type
394395
|| node.initializer !== initializer
395396
? updateNode(createParameter(decorators, modifiers, dotDotDotToken, name, node.questionToken, type, initializer), node)
@@ -438,7 +439,7 @@ namespace ts {
438439
node.asteriskToken = asteriskToken;
439440
node.name = asName(name);
440441
node.typeParameters = asNodeArray(typeParameters);
441-
node.parameters = createNodeArray(parameters);
442+
node.parameters = asNodeArray(parameters);
442443
node.type = type;
443444
node.body = body;
444445
return node;

src/compiler/transformers/esnext.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,7 @@ namespace ts {
475475
/*modifiers*/ undefined,
476476
node.dotDotDotToken,
477477
getGeneratedNameForNode(node),
478+
node.questionToken,
478479
/*type*/ undefined,
479480
visitNode(node.initializer, visitor, isExpression)
480481
);

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,7 @@ namespace ts {
895895
exprName: EntityName;
896896
}
897897

898-
/** A TypeLiteral is the declaration node for an anonymous symbol. */
898+
// A TypeLiteral is the declaration node for an anonymous symbol.
899899
export interface TypeLiteralNode extends TypeNode, Declaration {
900900
kind: SyntaxKind.TypeLiteral;
901901
members: NodeArray<TypeElement>;

src/compiler/visitor.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ namespace ts {
272272
nodesVisitor((<ParameterDeclaration>node).modifiers, visitor, isModifier),
273273
(<ParameterDeclaration>node).dotDotDotToken,
274274
visitNode((<ParameterDeclaration>node).name, visitor, isBindingName),
275+
visitNode((<ParameterDeclaration>node).questionToken, visitor, isToken),
275276
visitNode((<ParameterDeclaration>node).type, visitor, isTypeNode),
276277
visitNode((<ParameterDeclaration>node).initializer, visitor, isExpression));
277278

src/services/codefixes/fixAddMissingMember.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ namespace ts.codefix {
6161
, /*dotDotDotToken*/ undefined
6262
, "x"
6363
, /*questionToken*/ undefined
64-
, stringTypeNode);
64+
, stringTypeNode
65+
, /*initializer*/ undefined);
6566
const indexSignature = createIndexSignatureDeclaration(
6667
[indexingParameter]
6768
, typeNode

src/services/codefixes/helpers.ts

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ namespace ts.codefix {
126126
}
127127
else {
128128
Debug.assert(declarations.length === signatures.length);
129-
const methodImplementingSignatures = createMethodImplementingSignatures(signatures, enclosingDeclaration, name, modifiers);
129+
const methodImplementingSignatures = createMethodImplementingSignatures(signatures, name, modifiers);
130130
signatureDeclarations.push(methodImplementingSignatures);
131131
}
132132
return signatureDeclarations;
@@ -135,11 +135,8 @@ namespace ts.codefix {
135135
}
136136
}
137137

138-
// TODO: infer types of arguments?
139-
function createMethodImplementingSignatures(signatures: Signature[], enclosingDeclaration: ClassLikeDeclaration, name: string, modifiers: Modifier[] | undefined): MethodDeclaration {
140-
const newMethodDeclaration = createNode(SyntaxKind.CallSignature) as SignatureDeclaration;
141-
newMethodDeclaration.parent = enclosingDeclaration;
142-
newMethodDeclaration.name = signatures[0].getDeclaration().name;
138+
function createMethodImplementingSignatures(signatures: Signature[], name: string, modifiers: Modifier[] | undefined): MethodDeclaration {
139+
Debug.assert(signatures && signatures.length > 0);
143140

144141
let maxNonRestArgs = -1;
145142
let maxArgsIndex = 0;
@@ -157,46 +154,45 @@ namespace ts.codefix {
157154
}
158155
const maxArgsParameterSymbolNames = signatures[maxArgsIndex].getParameters().map(symbol => symbol.getName());
159156

160-
const parameters = createNodeArray<ParameterDeclaration>();
157+
const parameters: ParameterDeclaration[] = [];
161158
for (let i = 0; i < maxNonRestArgs; i++) {
159+
const anyType = createKeywordTypeNode(SyntaxKind.AnyKeyword);
162160
const newParameter = createParameter(
163161
/*decorators*/ undefined
164162
, /*modifiers*/ undefined
165163
, /*dotDotDotToken*/ undefined
166164
, maxArgsParameterSymbolNames[i]
167165
, /*questionToken*/ i >= minArgumentCount ? createToken(SyntaxKind.QuestionToken) : undefined
168-
, /*type*/ undefined
166+
, anyType
169167
, /*initializer*/ undefined);
170168
parameters.push(newParameter);
171169
}
172170

173171
if (hasRestParameter) {
172+
const anyType = createKeywordTypeNode(SyntaxKind.AnyKeyword);
174173
const restParameter = createParameter(
175174
/*decorators*/ undefined
176175
, /*modifiers*/ undefined
177176
, createToken(SyntaxKind.DotDotDotToken)
178177
, maxArgsParameterSymbolNames[maxNonRestArgs] || "rest"
179178
, /*questionToken*/ maxNonRestArgs >= minArgumentCount ? createToken(SyntaxKind.QuestionToken) : undefined
180-
, /*type*/ undefined
179+
, anyType
181180
, /*initializer*/ undefined);
182181
parameters.push(restParameter);
183182
}
184183

185-
return createMethod(
186-
/*decorators*/ undefined
187-
, modifiers
188-
, /*asteriskToken*/ undefined
184+
return createStubbedMethod(
185+
modifiers
189186
, name
190187
, /*typeParameters*/undefined
191188
, parameters
192-
, /*type*/ undefined
193-
, /*body*/undefined);
189+
, /*returnType*/ undefined);
194190
}
195191

196-
export function createStubbedMethod(modifiers: Modifier[], name: string, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], returnType?: TypeNode) {
192+
export function createStubbedMethod(modifiers: Modifier[], name: string, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], returnType: TypeNode | undefined) {
197193
return createMethod(
198194
/*decorators*/undefined
199-
, /*modifiers*/modifiers
195+
, modifiers
200196
, /*asteriskToken*/undefined
201197
, name
202198
, typeParameters
@@ -231,12 +227,13 @@ namespace ts.codefix {
231227
const parameterTypeNode = checker.createTypeNode(parameterType);
232228
// TODO: deep cloning of decorators/any node.
233229
const parameterNode = createParameter(
234-
parameterDeclaration.decorators && parameterDeclaration.decorators.map(getSynthesizedClone)
235-
, parameterDeclaration.modifiers && parameterDeclaration.modifiers.map(getSynthesizedClone)
230+
parameterDeclaration.decorators && parameterDeclaration.decorators.map(getSynthesizedDeepClone)
231+
, parameterDeclaration.modifiers && parameterDeclaration.modifiers.map(getSynthesizedDeepClone)
236232
, parameterDeclaration.dotDotDotToken && createToken(SyntaxKind.DotDotDotToken)
237-
, parameterDeclaration.name
233+
, getSynthesizedDeepClone(parameterDeclaration.name)
238234
, parameterDeclaration.questionToken && createToken(SyntaxKind.QuestionToken)
239-
, parameterTypeNode);
235+
, parameterTypeNode
236+
, /*initializer*/ undefined);
240237
return parameterNode;
241238
}
242239

src/services/textChanges.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ namespace ts.textChanges {
360360
return visited;
361361
}
362362
// clone nodearray if necessary
363-
const nodeArray = visited === nodes ? createNodeArray(visited) : visited;
363+
const nodeArray = visited === nodes ? createNodeArray(visited.slice(0)) : visited;
364364
nodeArray.pos = getPos(nodes);
365365
nodeArray.end = getEnd(nodes);
366366
return nodeArray;

tests/cases/fourslash/codeFixClassExtendAbstractGetterSetter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@ verify.rangeAfterCodeFix(`
2828
e: this;
2929
f: A;
3030
g: string;
31-
`);
31+
`);

0 commit comments

Comments
 (0)