Skip to content

Commit 0a2d7a7

Browse files
author
Arthur Ozga
committed
temp
* added signature factory/visitor entry
1 parent a4b981a commit 0a2d7a7

10 files changed

+166
-15
lines changed

src/compiler/checker.ts

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2322,10 +2322,18 @@ namespace ts {
23222322

23232323
if (objectFlags & ObjectFlags.Mapped) {
23242324
Debug.assert(!!(type.flags & TypeFlags.Object));
2325-
// const typeParameter = getTypeParameterFromMappedType(<MappedType>type);
2325+
2326+
// TODO: does typeParameter have the same constraint or do we need to overwrite it somehow?
2327+
const typeParameter = getTypeParameterFromMappedType(<MappedType>type);
23262328
// const constraintType = getConstraintTypeFromMappedType(<MappedType>type);
2327-
// const templateType = getTemplateTypeFromMappedType(<MappedType>type);
2328-
throw new Error("Mapped types not implemented");
2329+
const typeParameterNode = createTypeParameterDeclarationFromType(typeParameter);
2330+
2331+
const templateTypeNode = createTypeNode(getTemplateTypeFromMappedType(<MappedType>type));
2332+
const readonlyToken = (<MappedType>type).declaration && (<MappedType>type).declaration.readonlyToken ? createToken(SyntaxKind.ReadonlyKeyword) : undefined;
2333+
const questionToken = (<MappedType>type).declaration && (<MappedType>type).declaration.questionToken ? createToken(SyntaxKind.QuestionToken) : undefined;
2334+
2335+
// TODO: test.
2336+
return createMappedTypeNode(readonlyToken, typeParameterNode, questionToken, templateTypeNode);
23292337
}
23302338

23312339
if (objectFlags & ObjectFlags.Anonymous) {
@@ -2334,6 +2342,7 @@ namespace ts {
23342342
if (!type.symbol) {
23352343
// Anonymous types without symbols are literals.
23362344
// TODO: handle this case correctly.
2345+
// TODO: test.
23372346
noop();
23382347
}
23392348

@@ -2343,9 +2352,11 @@ namespace ts {
23432352
// TODO: string or number literal here or above?
23442353

23452354
if (type.flags & TypeFlags.Index) {
2355+
// TODO: implement and test.
23462356
throw new Error("index not implemented");
23472357
}
23482358
if (type.flags & TypeFlags.IndexedAccess) {
2359+
// TODO: implement and test.
23492360
throw new Error("indexed access not implemented");
23502361
}
23512362

@@ -2414,7 +2425,6 @@ namespace ts {
24142425
}
24152426

24162427
function createTypeLiteralNodeFromType(type: ObjectType) {
2417-
// TODO: do we need to do something for mapped types here???
24182428
const resolvedType = resolveStructuredTypeMembers(type);
24192429
const newMembers = createTypeNodesFromResolvedType(resolvedType);
24202430
return createTypeLiteralNode(newMembers);
@@ -2446,21 +2456,29 @@ namespace ts {
24462456
}
24472457

24482458
const kind = oldDeclaration.kind;
2449-
const memberName = symbolToString(memberSymbol);
2459+
const memberName = getSynthesizedDeepClone(oldDeclaration.name);
2460+
const memberType = getTypeOfSymbol(memberSymbol);
24502461

24512462
switch (kind) {
24522463
case SyntaxKind.PropertySignature:
24532464
const optional = !!oldDeclaration.questionToken;
2454-
const typeOfOldMember = getTypeOfSymbol(memberSymbol);
24552465
typeElements.push(createPropertySignature(
2456-
createIdentifier(memberName)
2466+
memberName
24572467
, optional ? createToken(SyntaxKind.QuestionToken) : undefined
2458-
, createTypeNode(typeOfOldMember)
2468+
, createTypeNode(memberType)
24592469
, /*initializer*/undefined));
24602470
break;
24612471
case SyntaxKind.MethodSignature:
24622472
case SyntaxKind.CallSignature:
24632473
case SyntaxKind.ConstructSignature:
2474+
const signatureType = getSignaturesOfSymbol(memberSymbol);
2475+
signatureType
2476+
createSignatureDeclaration
2477+
throw new Error("signature problems.");
2478+
// name ?: PropertyName;
2479+
// typeParameters ?: NodeArray<TypeParameterDeclaration>;
2480+
// parameters: NodeArray<ParameterDeclaration>;
2481+
// type ?: TypeNode;
24642482
case SyntaxKind.IndexSignature:
24652483
throw new Error("type literal constituent not implemented.");
24662484
default:

src/compiler/factory.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,22 @@ 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+
258274
export function createTypeReferenceNode(typeName: string | EntityName, typeArguments: NodeArray<TypeNode> | undefined) {
259275
const typeReference = createSynthesizedNode(SyntaxKind.TypeReference) as TypeReferenceNode;
260276

@@ -321,6 +337,24 @@ namespace ts {
321337
: node;
322338
}
323339

340+
export function createMappedTypeNode(readonlyToken: ReadonlyToken | undefined, typeParameter: TypeParameterDeclaration, questionToken: QuestionToken | undefined, type: TypeNode | undefined): MappedTypeNode {
341+
const mappedTypeNode = createSynthesizedNode(SyntaxKind.MappedType) as MappedTypeNode;
342+
mappedTypeNode.readonlyToken = readonlyToken;
343+
mappedTypeNode.typeParameter = typeParameter;
344+
mappedTypeNode.questionToken = questionToken;
345+
mappedTypeNode.type = type;
346+
return mappedTypeNode;
347+
}
348+
349+
export function updateMappedTypeNode(node: MappedTypeNode, readonlyToken: ReadonlyToken | undefined, typeParameter: TypeParameterDeclaration, questionToken: QuestionToken | undefined, type: TypeNode | undefined): MappedTypeNode {
350+
return node.readonlyToken !== readonlyToken
351+
|| node.typeParameter !== typeParameter
352+
|| node.questionToken !== questionToken
353+
|| node.type !== type
354+
? updateNode(createMappedTypeNode(readonlyToken, typeParameter, questionToken, type), node)
355+
: node;
356+
}
357+
324358
// Type Declarations
325359

326360
export function createTypeParameterDeclaration(name: string | Identifier, constraint: TypeNode | undefined, defaultParameter: TypeNode | undefined) {

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -856,6 +856,7 @@ namespace ts {
856856
| SyntaxKind.BooleanKeyword
857857
| SyntaxKind.StringKeyword
858858
| SyntaxKind.SymbolKeyword
859+
| SyntaxKind.ThisKeyword
859860
| SyntaxKind.VoidKeyword
860861
| SyntaxKind.UndefinedKeyword
861862
| SyntaxKind.NullKeyword

src/compiler/utilities.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3717,10 +3717,14 @@ namespace ts {
37173717
return (kind >= SyntaxKind.FirstTypeNode && kind <= SyntaxKind.LastTypeNode)
37183718
|| kind === SyntaxKind.AnyKeyword
37193719
|| kind === SyntaxKind.NumberKeyword
3720+
|| kind === SyntaxKind.ObjectKeyword
37203721
|| kind === SyntaxKind.BooleanKeyword
37213722
|| kind === SyntaxKind.StringKeyword
37223723
|| kind === SyntaxKind.SymbolKeyword
3724+
|| kind === SyntaxKind.ThisKeyword
37233725
|| kind === SyntaxKind.VoidKeyword
3726+
|| kind === SyntaxKind.UndefinedKeyword
3727+
|| kind === SyntaxKind.NullKeyword
37243728
|| kind === SyntaxKind.NeverKeyword
37253729
|| kind === SyntaxKind.ExpressionWithTypeArguments;
37263730
}

src/compiler/visitor.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -258,13 +258,23 @@ namespace ts {
258258
return updateComputedPropertyName(<ComputedPropertyName>node,
259259
visitNode((<ComputedPropertyName>node).expression, visitor, isExpression));
260260

261-
// Signature elements
261+
// Signatures and Signature Elements
262+
case SyntaxKind.FunctionType:
263+
case SyntaxKind.CallSignature:
264+
case SyntaxKind.ConstructSignature:
265+
case SyntaxKind.MethodSignature:
266+
return updateSignatureDeclaration(<SignatureDeclaration>node
267+
, visitNode((<SignatureDeclaration>node).name, visitor, isPropertyName)
268+
, nodesVisitor((<SignatureDeclaration>node).typeParameters, visitor, isTypeParameter)
269+
, nodesVisitor((<SignatureDeclaration>node).parameters, visitor, isParameter)
270+
, visitNode((<SignatureDeclaration>node).type, visitor, isTypeNode));
271+
262272
case SyntaxKind.IndexSignature:
263273
return updateIndexSignatureDeclaration(<IndexSignatureDeclaration>node
264-
, nodesVisitor((<IndexSignatureDeclaration>node).parameters, visitor)
265-
, visitNode((<IndexSignatureDeclaration>node).type, visitor)
266-
, nodesVisitor((<IndexSignatureDeclaration>node).decorators, visitor, isDecorator)
267-
, nodesVisitor((<IndexSignatureDeclaration>node).modifiers, visitor, isModifier));
274+
, nodesVisitor((<IndexSignatureDeclaration>node).parameters, visitor)
275+
, visitNode((<IndexSignatureDeclaration>node).type, visitor, isTypeNode)
276+
, nodesVisitor((<IndexSignatureDeclaration>node).decorators, visitor, isDecorator)
277+
, nodesVisitor((<IndexSignatureDeclaration>node).modifiers, visitor, isModifier));
268278

269279
case SyntaxKind.Parameter:
270280
return updateParameter(<ParameterDeclaration>node,

src/harness/fourslash.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1673,7 +1673,7 @@ namespace FourSlash {
16731673
// We get back a set of edits, but langSvc.editScript only accepts one at a time. Use this to keep track
16741674
// of the incremental offset from each edit to the next. Assumption is that these edit ranges don't overlap
16751675
let runningOffset = 0;
1676-
edits = edits.sort((a, b) => a.span.start - b.span.start);
1676+
edits = ts.stableSort(edits, (a, b) => a.span.start - b.span.start);
16771677
// Get a snapshot of the content of the file so we can make sure any formatting edits didn't destroy non-whitespace characters
16781678
const oldContent = this.getFileContent(fileName);
16791679

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// @lib: es2017
4+
5+
//// /** interface prefix */
6+
//// interface /**interface name prefix */ I /**open-brace prefix*/{
7+
//// /** property prefix*/ x /**colon prefix*/: /**number prefix*/ number;
8+
////
9+
//// /**close-brace prefix*/ }
10+
//// class C implements I {[| |]}
11+
12+
verify.rangeAfterCodeFix(`
13+
x: number;
14+
`);

tests/cases/fourslash/codeFixClassImplementInterfaceComputedPropertyNameWellKnownSymbols.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
//// [Symbol.toStringTag]: string;
1818
//// [Symbol.unscopables]: any;
1919
//// }
20-
////
2120
//// class C implements I<number> {[| |]}
2221

2322
verify.rangeAfterCodeFix(`
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+
//// x: {};
5+
//// }
6+
////
7+
//// class C implements I {[|
8+
//// |]constructor() { }
9+
//// }
10+
11+
verify.rangeAfterCodeFix(`
12+
x: {};
13+
`);
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// @lib: es2017
4+
5+
//// /** asdf */
6+
//// interface I {
7+
//// 1;
8+
//// 2;
9+
//// 3;
10+
//// 4;
11+
//// 5;
12+
//// 6;
13+
//// 7;
14+
//// 8;
15+
//// 9;
16+
//// 10;
17+
//// 11;
18+
//// 12;
19+
//// 13;
20+
//// 14;
21+
//// 15;
22+
//// 16;
23+
//// 17;
24+
//// 18;
25+
//// 19;
26+
//// 20;
27+
//// 21;
28+
//// 22;
29+
//// /** a nice safe prime */
30+
//// 23;
31+
//// }
32+
//// class C implements I {[| |]}
33+
34+
verify.rangeAfterCodeFix(`
35+
1: any;
36+
2: any;
37+
3: any;
38+
4: any;
39+
5: any;
40+
6: any;
41+
7: any;
42+
8: any;
43+
9: any;
44+
10: any;
45+
11: any;
46+
12: any;
47+
13: any;
48+
14: any;
49+
15: any;
50+
16: any;
51+
17: any;
52+
18: any;
53+
19: any;
54+
20: any;
55+
21: any;
56+
22: any;
57+
23: any;
58+
`);

0 commit comments

Comments
 (0)