Skip to content

Commit ec997f3

Browse files
author
Arthur Ozga
committed
more temp
1 parent 0a2d7a7 commit ec997f3

8 files changed

+340
-31
lines changed

src/compiler/checker.ts

Lines changed: 223 additions & 10 deletions
Large diffs are not rendered by default.

src/compiler/factory.ts

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -255,25 +255,8 @@ namespace ts {
255255
: node;
256256
}
257257

258-
export function createSignatureDeclaration<T extends SignatureDeclaration>(kind: SyntaxKind, name: string | PropertyName | undefined, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): T {
259-
const signatureDeclaration = createSynthesizedNode(kind) as T;
260-
signatureDeclaration.name = asName(name);
261-
signatureDeclaration.typeParameters = asNodeArray(typeParameters);
262-
signatureDeclaration.type = type;
263-
return signatureDeclaration;
264-
}
265-
266-
export function updateSignatureDeclaration<T extends SignatureDeclaration>(node: T, name: string | PropertyName | undefined, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): T {
267-
return node.name !== name
268-
|| node.typeParameters !== typeParameters
269-
|| node.type !== type
270-
? <T>updateNode(createSignatureDeclaration(node.kind, name, typeParameters, parameters, type), node)
271-
: node;
272-
}
273-
274258
export function createTypeReferenceNode(typeName: string | EntityName, typeArguments: NodeArray<TypeNode> | undefined) {
275259
const typeReference = createSynthesizedNode(SyntaxKind.TypeReference) as TypeReferenceNode;
276-
277260
typeReference.typeName = isQualifiedName(<EntityName>typeName) ? <QualifiedName>typeName : asName(<string | Identifier>typeName);
278261
typeReference.typeArguments = typeArguments;
279262
return typeReference;
@@ -286,6 +269,16 @@ namespace ts {
286269
: node;
287270
}
288271

272+
export function createTypeQueryNode(exprName: EntityName) {
273+
const typeQueryNode = createSynthesizedNode(SyntaxKind.TypeQuery) as TypeQueryNode;
274+
typeQueryNode.exprName = exprName;
275+
return typeQueryNode;
276+
}
277+
278+
export function updateTypeQueryNode(node: TypeQueryNode, exprName: EntityName) {
279+
return node.exprName !== exprName ? updateNode(createTypeQueryNode(exprName) , node) : node;
280+
}
281+
289282
export function createArrayTypeNode(elementType: TypeNode): ArrayTypeNode {
290283
const arrayTypeNode = createSynthesizedNode(SyntaxKind.ArrayType) as ArrayTypeNode;
291284
arrayTypeNode.elementType = elementType;
@@ -355,6 +348,33 @@ namespace ts {
355348
: node;
356349
}
357350

351+
export function createTypeOperatorNode(type: TypeNode) {
352+
const typeOperatorNode = createSynthesizedNode(SyntaxKind.TypeOperator) as TypeOperatorNode;
353+
typeOperatorNode.operator = SyntaxKind.KeyOfKeyword;
354+
typeOperatorNode.type = type
355+
return typeOperatorNode;
356+
}
357+
358+
export function updateTypeOperatorNode(node: TypeOperatorNode, type: TypeNode) {
359+
return node.type !== type ? updateNode(createTypeOperatorNode(type), node) : node;
360+
}
361+
362+
export function createIndexedAccessTypeNode(objectType: TypeNode, indexType: TypeNode) {
363+
const indexedAccessTypeNode = createSynthesizedNode(SyntaxKind.IndexedAccessType) as IndexedAccessTypeNode;
364+
indexedAccessTypeNode.objectType = objectType;
365+
indexedAccessTypeNode.indexType = indexType;
366+
return indexedAccessTypeNode;
367+
}
368+
369+
370+
export function updateIndexedAccessTypeNode(node: IndexedAccessTypeNode, objectType: TypeNode, indexType: TypeNode) {
371+
return node.objectType !== objectType
372+
|| node.indexType !== indexType
373+
? updateNode(createIndexedAccessTypeNode(objectType, indexType), node)
374+
: node;
375+
}
376+
377+
358378
// Type Declarations
359379

360380
export function createTypeParameterDeclaration(name: string | Identifier, constraint: TypeNode | undefined, defaultParameter: TypeNode | undefined) {
@@ -374,6 +394,24 @@ namespace ts {
374394
: node;
375395
}
376396

397+
export function createSignatureDeclaration<T extends SignatureDeclaration>(kind: SyntaxKind, name: string | PropertyName | undefined, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): T {
398+
const signatureDeclaration = createSynthesizedNode(kind) as T;
399+
signatureDeclaration.name = asName(name);
400+
signatureDeclaration.typeParameters = asNodeArray(typeParameters);
401+
signatureDeclaration.parameters = asNodeArray(parameters);
402+
signatureDeclaration.type = type;
403+
return signatureDeclaration;
404+
}
405+
406+
export function updateSignatureDeclaration<T extends SignatureDeclaration>(node: T, name: string | PropertyName | undefined, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): T {
407+
return node.name !== name
408+
|| node.typeParameters !== typeParameters
409+
|| node.parameters !== parameters
410+
|| node.type !== type
411+
? <T>updateNode(createSignatureDeclaration(node.kind, name, typeParameters, parameters, type), node)
412+
: node;
413+
}
414+
377415
// Signature elements
378416

379417
export function createPropertySignature(name: PropertyName, questionToken: QuestionToken | undefined, type: TypeNode | undefined, initializer: Expression | undefined): PropertySignature {

src/compiler/visitor.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,13 +320,13 @@ namespace ts {
320320
case SyntaxKind.ConstructorType:
321321
throw new Error("reached unsupported type in visitor.");
322322
case SyntaxKind.TypeQuery:
323-
throw new Error("reached unsupported type in visitor.");
323+
return updateTypeQueryNode((<TypeQueryNode>node), visitNode((<TypeQueryNode>node).exprName, visitor, isEntityName));
324324
case SyntaxKind.TypeLiteral:
325325
return updateTypeLiteralNode((<TypeLiteralNode>node), nodesVisitor((<TypeLiteralNode>node).members, visitor));
326326
case SyntaxKind.ArrayType:
327327
return updateArrayTypeNode(<ArrayTypeNode>node, visitNode((<ArrayTypeNode>node).elementType, visitor, isTypeNode));
328328
case SyntaxKind.TupleType:
329-
throw new Error("reached unsupported type in visitor.");
329+
return updateTypleTypeNode((<TupleTypeNode>node), nodesVisitor((<TupleTypeNode>node).elementTypes, visitor, isTypeNode));
330330
case SyntaxKind.UnionType:
331331
case SyntaxKind.IntersectionType:
332332
return updateUnionOrIntersectionTypeNode(<UnionOrIntersectionTypeNode>node
@@ -336,9 +336,11 @@ namespace ts {
336336
case SyntaxKind.ThisType:
337337
throw new Error("reached unsupported type in visitor.");
338338
case SyntaxKind.TypeOperator:
339-
throw new Error("reached unsupported type in visitor.");
339+
return updateTypeOperatorNode(<TypeOperatorNode>node, visitNode((<TypeOperatorNode>node).type, visitor, isTypeNode));
340340
case SyntaxKind.IndexedAccessType:
341-
throw new Error("reached unsupported type in visitor.");
341+
return updateIndexedAccessTypeNode((<IndexedAccessTypeNode>node)
342+
, visitNode((<IndexedAccessTypeNode>node).objectType, visitor, isTypeNode)
343+
, visitNode((<IndexedAccessTypeNode>node).indexType, visitor, isTypeNode));
342344
case SyntaxKind.MappedType:
343345
throw new Error("reached unsupported type in visitor.");
344346
case SyntaxKind.LiteralType:
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// interface I {
4+
//// (x: number, b: string): number;
5+
//// }
6+
//// class C implements I {[| |]}
7+
8+
verify.not.codeFixAvailable();
9+
10+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// interface I {
4+
//// new (x: number, b: string);
5+
//// }
6+
//// class C implements I {[| |]}
7+
8+
verify.not.codeFixAvailable();
9+
10+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// interface I {
4+
//// a1: { (b1: number, c1: string): number; };
5+
//// a2: (b2: number, c2: string) => number;
6+
//// }
7+
//// class C implements I {[| |]}
8+
9+
verify.rangeAfterCodeFix(`
10+
a1: (b1: number, c1: string) => number;
11+
a2: (b2: number, c2: string) => number;
12+
`);
13+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// interface I {
4+
//// a1: { new (b1: number, c1: string): number; };
5+
//// a2: new (b2: number, c2: string) => number;
6+
//// }
7+
//// class C implements I {[| |]}
8+
9+
verify.rangeAfterCodeFix(`
10+
a1: new (b1: number, c1: string) => number;
11+
a2: new (b2: number, c2: string) => number;
12+
`);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// interface I {
4+
//// x: { a(b: number, c: string): number };
5+
//// }
6+
//// class C implements I {[| |]}
7+
8+
verify.rangeAfterCodeFix(`
9+
a: { (b: number, c: string): number; };
10+
`);
11+

0 commit comments

Comments
 (0)