Skip to content

Commit 241ce10

Browse files
committed
TypeScript: support syntax for rest elements in tuple types
1 parent 204b2a3 commit 241ce10

File tree

6 files changed

+23
-0
lines changed

6 files changed

+23
-0
lines changed

javascript/ql/src/semmle/javascript/TypeScript.qll

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,6 +1081,17 @@ class OptionalTypeExpr extends @optionaltypeexpr, TypeExpr {
10811081
TypeExpr getElementType() { result = getChildTypeExpr(0) }
10821082
}
10831083

1084+
/**
1085+
* A rest element in a tuple type, such as `...string[]` in `[number, ...string[]]`.
1086+
*/
1087+
class RestTypeExpr extends @resttypeexpr, TypeExpr {
1088+
/** Gets the type `T[]` in `...T[]`, such as `string[]` in `[number, ...string[]]`. */
1089+
TypeExpr getArrayType() { result = getChildTypeExpr(0) }
1090+
1091+
/** Gets the type `T` in `...T[]`, such as `string` in `[number, ...string[]]`. */
1092+
TypeExpr getElementType() { result = getArrayType().(ArrayTypeExpr).getElementType() }
1093+
}
1094+
10841095
/**
10851096
* A possibly qualified name that refers to a variable from inside a type.
10861097
*

javascript/ql/src/semmlecode.javascript.dbscheme

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,7 @@ case @typeexpr.kind of
558558
| 31 = @importnamespaceaccess
559559
| 32 = @importvartypeaccess
560560
| 33 = @optionaltypeexpr
561+
| 34 = @resttypeexpr
561562
;
562563

563564
@typeref = @typeaccess | @typedecl;

javascript/ql/test/library-tests/TypeScript/TypeAnnotations/ArrayTypeExpr.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@
66
| tst.ts:40:17:40:28 | string[][][] | tst.ts:40:17:40:26 | string[][] |
77
| tst.ts:80:49:80:54 | Leaf[] | tst.ts:80:49:80:52 | Leaf |
88
| tst.ts:81:27:81:34 | string[] | tst.ts:81:27:81:32 | string |
9+
| tst.ts:135:39:135:46 | string[] | tst.ts:135:39:135:44 | string |
10+
| tst.ts:136:60:136:67 | number[] | tst.ts:136:60:136:65 | number |

javascript/ql/test/library-tests/TypeScript/TypeAnnotations/TupleTypeExpr.expected

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,8 @@
66
| tst.ts:133:31:133:55 | [number ... umber?] | 0 | 3 | tst.ts:133:32:133:37 | number |
77
| tst.ts:133:31:133:55 | [number ... umber?] | 1 | 3 | tst.ts:133:40:133:45 | string |
88
| tst.ts:133:31:133:55 | [number ... umber?] | 2 | 3 | tst.ts:133:48:133:54 | number? |
9+
| tst.ts:135:27:135:47 | [number ... ring[]] | 0 | 2 | tst.ts:135:28:135:33 | number |
10+
| tst.ts:135:27:135:47 | [number ... ring[]] | 1 | 2 | tst.ts:135:36:135:46 | ...string[] |
11+
| tst.ts:136:39:136:68 | [number ... mber[]] | 0 | 3 | tst.ts:136:40:136:45 | number |
12+
| tst.ts:136:39:136:68 | [number ... mber[]] | 1 | 3 | tst.ts:136:48:136:54 | string? |
13+
| tst.ts:136:39:136:68 | [number ... mber[]] | 2 | 3 | tst.ts:136:57:136:67 | ...number[] |

javascript/ql/test/library-tests/TypeScript/TypeAnnotations/VariableTypes.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,5 @@
7171
| tst.ts:128:5:128:35 | importe ... tespace | importedQualifiedTypeWhitespace | tst.ts:131:4:131:6 | bar |
7272
| tst.ts:133:5:133:28 | tupleWi ... Element | tupleWithOptionalElement | tst.ts:133:31:133:55 | [number ... umber?] |
7373
| tst.ts:134:5:134:14 | emptyTuple | emptyTuple | tst.ts:134:17:134:18 | [] |
74+
| tst.ts:135:5:135:24 | tupleWithRestElement | tupleWithRestElement | tst.ts:135:27:135:47 | [number ... ring[]] |
75+
| tst.ts:136:5:136:36 | tupleWi ... lements | tupleWithOptionalAndRestElements | tst.ts:136:39:136:68 | [number ... mber[]] |

javascript/ql/test/library-tests/TypeScript/TypeAnnotations/tst.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,5 @@ var importedQualifiedTypeWhitespace: import(
132132

133133
let tupleWithOptionalElement: [number, string, number?];
134134
let emptyTuple: [];
135+
let tupleWithRestElement: [number, ...string[]];
136+
let tupleWithOptionalAndRestElements: [number, string?, ...number[]];

0 commit comments

Comments
 (0)