some missed token bugs
This commit is contained in:
parent
e02ac178ca
commit
27fe2df203
|
@ -2361,7 +2361,7 @@ namespace ts {
|
|||
return createArrayTypeNode(elementType);
|
||||
}
|
||||
else if (type.target.objectFlags & ObjectFlags.Tuple) {
|
||||
return createTupleTypeNode(mapToTypeNodeArray(typeArguments.slice(0, getTypeReferenceArity(type))));
|
||||
return createTupleTypeNode(typeArguments.length > 0 ? mapToTypeNodeArray(typeArguments.slice(0, getTypeReferenceArity(type))) : undefined);
|
||||
}
|
||||
else {
|
||||
// TODO: handle type parameters in qualified names...
|
||||
|
@ -2406,7 +2406,7 @@ namespace ts {
|
|||
entityName = nameIdentifier;
|
||||
}
|
||||
const typeParameterCount = (type.target.typeParameters || emptyArray).length;
|
||||
const typeArgumentNodes = mapToTypeNodeArray(typeArguments.slice(i, typeParameterCount - i));
|
||||
const typeArgumentNodes = mapToTypeNodeArray(typeArguments.length > 0 ? typeArguments.slice(i, typeParameterCount - i) : undefined);
|
||||
return createTypeReferenceNode(entityName, typeArgumentNodes);
|
||||
}
|
||||
}
|
||||
|
@ -2478,7 +2478,8 @@ namespace ts {
|
|||
, /*dotDotDotToken*/ undefined
|
||||
, name
|
||||
, /*questionToken*/ undefined
|
||||
, stringTypeNode);
|
||||
, stringTypeNode
|
||||
, /*initializer*/ undefined);
|
||||
const typeNode = createTypeNode(indexInfo.type);
|
||||
return createIndexSignatureDeclaration(
|
||||
[indexingParameter]
|
||||
|
@ -7261,10 +7262,6 @@ namespace ts {
|
|||
}
|
||||
}
|
||||
|
||||
// export function synthesizeTypeNode(type: Type, enclosingDeclaration: Node): TypeNode {
|
||||
// throw new Error("Not implemented" + enclosingDeclaration);
|
||||
// }
|
||||
|
||||
function instantiateList<T>(items: T[], mapper: TypeMapper, instantiator: (item: T, mapper: TypeMapper) => T): T[] {
|
||||
if (items && items.length) {
|
||||
const result: T[] = [];
|
||||
|
|
|
@ -355,8 +355,6 @@ namespace ts {
|
|||
|
||||
export function createIndexSignatureDeclaration(parameters: ParameterDeclaration[], type: TypeNode, decorators: Decorator[] | undefined, modifiers: Modifier[] | undefined): IndexSignatureDeclaration {
|
||||
const indexSignature = createSynthesizedNode(SyntaxKind.IndexSignature) as IndexSignatureDeclaration;
|
||||
// indexSignature.name = asName(name);
|
||||
// type parameters
|
||||
indexSignature.parameters = asNodeArray(parameters);
|
||||
indexSignature.type = type;
|
||||
indexSignature.decorators = asNodeArray(decorators);
|
||||
|
@ -373,6 +371,8 @@ namespace ts {
|
|||
: node;
|
||||
}
|
||||
|
||||
// Signature elements
|
||||
|
||||
export function createParameter(decorators: Decorator[] | undefined, modifiers: Modifier[] | undefined, dotDotDotToken: DotDotDotToken | undefined, name: string | BindingName, questionToken?: QuestionToken, type?: TypeNode, initializer?: Expression) {
|
||||
const node = <ParameterDeclaration>createSynthesizedNode(SyntaxKind.Parameter);
|
||||
node.decorators = asNodeArray(decorators);
|
||||
|
@ -385,11 +385,12 @@ namespace ts {
|
|||
return node;
|
||||
}
|
||||
|
||||
export function updateParameter(node: ParameterDeclaration, decorators: Decorator[] | undefined, modifiers: Modifier[] | undefined, dotDotDotToken: DotDotDotToken | undefined, name: BindingName, type: TypeNode | undefined, initializer: Expression | undefined) {
|
||||
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) {
|
||||
return node.decorators !== decorators
|
||||
|| node.modifiers !== modifiers
|
||||
|| node.dotDotDotToken !== dotDotDotToken
|
||||
|| node.name !== name
|
||||
|| node.questionToken !== questionToken
|
||||
|| node.type !== type
|
||||
|| node.initializer !== initializer
|
||||
? updateNode(createParameter(decorators, modifiers, dotDotDotToken, name, node.questionToken, type, initializer), node)
|
||||
|
@ -438,7 +439,7 @@ namespace ts {
|
|||
node.asteriskToken = asteriskToken;
|
||||
node.name = asName(name);
|
||||
node.typeParameters = asNodeArray(typeParameters);
|
||||
node.parameters = createNodeArray(parameters);
|
||||
node.parameters = asNodeArray(parameters);
|
||||
node.type = type;
|
||||
node.body = body;
|
||||
return node;
|
||||
|
|
|
@ -475,6 +475,7 @@ namespace ts {
|
|||
/*modifiers*/ undefined,
|
||||
node.dotDotDotToken,
|
||||
getGeneratedNameForNode(node),
|
||||
node.questionToken,
|
||||
/*type*/ undefined,
|
||||
visitNode(node.initializer, visitor, isExpression)
|
||||
);
|
||||
|
|
|
@ -895,7 +895,7 @@ namespace ts {
|
|||
exprName: EntityName;
|
||||
}
|
||||
|
||||
/** A TypeLiteral is the declaration node for an anonymous symbol. */
|
||||
// A TypeLiteral is the declaration node for an anonymous symbol.
|
||||
export interface TypeLiteralNode extends TypeNode, Declaration {
|
||||
kind: SyntaxKind.TypeLiteral;
|
||||
members: NodeArray<TypeElement>;
|
||||
|
|
|
@ -272,6 +272,7 @@ namespace ts {
|
|||
nodesVisitor((<ParameterDeclaration>node).modifiers, visitor, isModifier),
|
||||
(<ParameterDeclaration>node).dotDotDotToken,
|
||||
visitNode((<ParameterDeclaration>node).name, visitor, isBindingName),
|
||||
visitNode((<ParameterDeclaration>node).questionToken, visitor, isToken),
|
||||
visitNode((<ParameterDeclaration>node).type, visitor, isTypeNode),
|
||||
visitNode((<ParameterDeclaration>node).initializer, visitor, isExpression));
|
||||
|
||||
|
|
|
@ -61,7 +61,8 @@ namespace ts.codefix {
|
|||
, /*dotDotDotToken*/ undefined
|
||||
, "x"
|
||||
, /*questionToken*/ undefined
|
||||
, stringTypeNode);
|
||||
, stringTypeNode
|
||||
, /*initializer*/ undefined);
|
||||
const indexSignature = createIndexSignatureDeclaration(
|
||||
[indexingParameter]
|
||||
, typeNode
|
||||
|
|
|
@ -126,7 +126,7 @@ namespace ts.codefix {
|
|||
}
|
||||
else {
|
||||
Debug.assert(declarations.length === signatures.length);
|
||||
const methodImplementingSignatures = createMethodImplementingSignatures(signatures, enclosingDeclaration, name, modifiers);
|
||||
const methodImplementingSignatures = createMethodImplementingSignatures(signatures, name, modifiers);
|
||||
signatureDeclarations.push(methodImplementingSignatures);
|
||||
}
|
||||
return signatureDeclarations;
|
||||
|
@ -135,11 +135,8 @@ namespace ts.codefix {
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: infer types of arguments?
|
||||
function createMethodImplementingSignatures(signatures: Signature[], enclosingDeclaration: ClassLikeDeclaration, name: string, modifiers: Modifier[] | undefined): MethodDeclaration {
|
||||
const newMethodDeclaration = createNode(SyntaxKind.CallSignature) as SignatureDeclaration;
|
||||
newMethodDeclaration.parent = enclosingDeclaration;
|
||||
newMethodDeclaration.name = signatures[0].getDeclaration().name;
|
||||
function createMethodImplementingSignatures(signatures: Signature[], name: string, modifiers: Modifier[] | undefined): MethodDeclaration {
|
||||
Debug.assert(signatures && signatures.length > 0);
|
||||
|
||||
let maxNonRestArgs = -1;
|
||||
let maxArgsIndex = 0;
|
||||
|
@ -157,46 +154,45 @@ namespace ts.codefix {
|
|||
}
|
||||
const maxArgsParameterSymbolNames = signatures[maxArgsIndex].getParameters().map(symbol => symbol.getName());
|
||||
|
||||
const parameters = createNodeArray<ParameterDeclaration>();
|
||||
const parameters: ParameterDeclaration[] = [];
|
||||
for (let i = 0; i < maxNonRestArgs; i++) {
|
||||
const anyType = createKeywordTypeNode(SyntaxKind.AnyKeyword);
|
||||
const newParameter = createParameter(
|
||||
/*decorators*/ undefined
|
||||
, /*modifiers*/ undefined
|
||||
, /*dotDotDotToken*/ undefined
|
||||
, maxArgsParameterSymbolNames[i]
|
||||
, /*questionToken*/ i >= minArgumentCount ? createToken(SyntaxKind.QuestionToken) : undefined
|
||||
, /*type*/ undefined
|
||||
, anyType
|
||||
, /*initializer*/ undefined);
|
||||
parameters.push(newParameter);
|
||||
}
|
||||
|
||||
if (hasRestParameter) {
|
||||
const anyType = createKeywordTypeNode(SyntaxKind.AnyKeyword);
|
||||
const restParameter = createParameter(
|
||||
/*decorators*/ undefined
|
||||
, /*modifiers*/ undefined
|
||||
, createToken(SyntaxKind.DotDotDotToken)
|
||||
, maxArgsParameterSymbolNames[maxNonRestArgs] || "rest"
|
||||
, /*questionToken*/ maxNonRestArgs >= minArgumentCount ? createToken(SyntaxKind.QuestionToken) : undefined
|
||||
, /*type*/ undefined
|
||||
, anyType
|
||||
, /*initializer*/ undefined);
|
||||
parameters.push(restParameter);
|
||||
}
|
||||
|
||||
return createMethod(
|
||||
/*decorators*/ undefined
|
||||
, modifiers
|
||||
, /*asteriskToken*/ undefined
|
||||
return createStubbedMethod(
|
||||
modifiers
|
||||
, name
|
||||
, /*typeParameters*/undefined
|
||||
, parameters
|
||||
, /*type*/ undefined
|
||||
, /*body*/undefined);
|
||||
, /*returnType*/ undefined);
|
||||
}
|
||||
|
||||
export function createStubbedMethod(modifiers: Modifier[], name: string, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], returnType?: TypeNode) {
|
||||
export function createStubbedMethod(modifiers: Modifier[], name: string, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], returnType: TypeNode | undefined) {
|
||||
return createMethod(
|
||||
/*decorators*/undefined
|
||||
, /*modifiers*/modifiers
|
||||
, modifiers
|
||||
, /*asteriskToken*/undefined
|
||||
, name
|
||||
, typeParameters
|
||||
|
@ -231,12 +227,13 @@ namespace ts.codefix {
|
|||
const parameterTypeNode = checker.createTypeNode(parameterType);
|
||||
// TODO: deep cloning of decorators/any node.
|
||||
const parameterNode = createParameter(
|
||||
parameterDeclaration.decorators && parameterDeclaration.decorators.map(getSynthesizedClone)
|
||||
, parameterDeclaration.modifiers && parameterDeclaration.modifiers.map(getSynthesizedClone)
|
||||
parameterDeclaration.decorators && parameterDeclaration.decorators.map(getSynthesizedDeepClone)
|
||||
, parameterDeclaration.modifiers && parameterDeclaration.modifiers.map(getSynthesizedDeepClone)
|
||||
, parameterDeclaration.dotDotDotToken && createToken(SyntaxKind.DotDotDotToken)
|
||||
, parameterDeclaration.name
|
||||
, getSynthesizedDeepClone(parameterDeclaration.name)
|
||||
, parameterDeclaration.questionToken && createToken(SyntaxKind.QuestionToken)
|
||||
, parameterTypeNode);
|
||||
, parameterTypeNode
|
||||
, /*initializer*/ undefined);
|
||||
return parameterNode;
|
||||
}
|
||||
|
||||
|
|
|
@ -360,7 +360,7 @@ namespace ts.textChanges {
|
|||
return visited;
|
||||
}
|
||||
// clone nodearray if necessary
|
||||
const nodeArray = visited === nodes ? createNodeArray(visited) : visited;
|
||||
const nodeArray = visited === nodes ? createNodeArray(visited.slice(0)) : visited;
|
||||
nodeArray.pos = getPos(nodes);
|
||||
nodeArray.end = getEnd(nodes);
|
||||
return nodeArray;
|
||||
|
|
|
@ -28,4 +28,4 @@ verify.rangeAfterCodeFix(`
|
|||
e: this;
|
||||
f: A;
|
||||
g: string;
|
||||
`);
|
||||
`);
|
||||
|
|
Loading…
Reference in a new issue