mirror of
https://github.com/github/codeql.git
synced 2026-05-01 03:35:13 +02:00
add support for rest types elements in the middle of a tuple
This commit is contained in:
@@ -2149,18 +2149,23 @@ class TupleType extends ArrayType, @tuple_type {
|
||||
int getMinimumLength() { tuple_type_min_length(this, result) }
|
||||
|
||||
/**
|
||||
* Holds if this tuple type ends with a rest element, such as `[number, ...string[]]`.
|
||||
* Gets the index of the rest element.
|
||||
* E.g. for a type `[number, ...string[]]` the result is 1,
|
||||
* or for a type `[...number[], string]` the result is 0.
|
||||
*/
|
||||
predicate hasRestElement() { tuple_type_rest(this) }
|
||||
int getRestElementIndex() { tuple_type_rest_index(this, result) }
|
||||
|
||||
/**
|
||||
* Holds if this tuple type has a rest element, such as `[number, ...string[]]` or `[...number[], string]`.
|
||||
*/
|
||||
predicate hasRestElement() { exists(getRestElementIndex()) }
|
||||
|
||||
/**
|
||||
* Gets the type of the rest element, if there is one.
|
||||
*
|
||||
* For example, the rest element of `[number, ...string[]]` is `string`.
|
||||
*/
|
||||
Type getRestElementType() {
|
||||
hasRestElement() and result = getElementType(getNumElementType() - 1)
|
||||
}
|
||||
Type getRestElementType() { result = getElementType(getRestElementIndex()) }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -799,8 +799,9 @@ tuple_type_min_length(
|
||||
int minLength: int ref
|
||||
);
|
||||
|
||||
tuple_type_rest(
|
||||
unique int typ: @type ref
|
||||
tuple_type_rest_index(
|
||||
unique int typ: @type ref,
|
||||
int index: int ref
|
||||
);
|
||||
|
||||
// comments
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
let foo: [boolean, ...string[], number];
|
||||
|
||||
foo = [true, "hello", 123];
|
||||
@@ -15,6 +15,13 @@ getExprType
|
||||
| boolean-type.ts:15:5:15:12 | boolean6 | boolean |
|
||||
| dummy.ts:2:12:2:12 | x | number |
|
||||
| dummy.ts:2:16:2:16 | 5 | 5 |
|
||||
| middle-rest.ts:1:5:1:7 | foo | [boolean, ...string[], number] |
|
||||
| middle-rest.ts:3:1:3:3 | foo | [boolean, ...string[], number] |
|
||||
| middle-rest.ts:3:1:3:26 | foo = [ ... ", 123] | [true, string, number] |
|
||||
| middle-rest.ts:3:7:3:26 | [true, "hello", 123] | [boolean, ...string[], number] |
|
||||
| middle-rest.ts:3:8:3:11 | true | true |
|
||||
| middle-rest.ts:3:14:3:20 | "hello" | "hello" |
|
||||
| middle-rest.ts:3:23:3:25 | 123 | 123 |
|
||||
| tst.ts:1:13:1:17 | dummy | typeof library-tests/TypeScript/Types/dummy.ts |
|
||||
| tst.ts:1:24:1:32 | "./dummy" | any |
|
||||
| tst.ts:3:5:3:10 | numVar | number |
|
||||
@@ -185,6 +192,12 @@ getTypeExprType
|
||||
| boolean-type.ts:15:15:15:19 | false | false |
|
||||
| boolean-type.ts:15:15:15:29 | false \| boolean | boolean |
|
||||
| boolean-type.ts:15:23:15:29 | boolean | boolean |
|
||||
| middle-rest.ts:1:10:1:39 | [boolea ... number] | [boolean, ...string[], number] |
|
||||
| middle-rest.ts:1:11:1:17 | boolean | boolean |
|
||||
| middle-rest.ts:1:20:1:30 | ...string[] | string |
|
||||
| middle-rest.ts:1:23:1:28 | string | string |
|
||||
| middle-rest.ts:1:23:1:30 | string[] | string[] |
|
||||
| middle-rest.ts:1:33:1:38 | number | number |
|
||||
| tst.ts:3:13:3:18 | number | number |
|
||||
| tst.ts:9:13:9:18 | string | string |
|
||||
| tst.ts:14:20:14:25 | string | string |
|
||||
@@ -311,6 +324,18 @@ referenceDefinition
|
||||
| ValueOrArray<number> | type_alias.ts:5:1:5:50 | type Va ... ay<T>>; |
|
||||
| VirtualNode | type_alias.ts:19:1:21:57 | type Vi ... ode[]]; |
|
||||
tupleTypes
|
||||
| middle-rest.ts:1:5:1:7 | foo | [boolean, ...string[], number] | 0 | boolean | 2 | string |
|
||||
| middle-rest.ts:1:5:1:7 | foo | [boolean, ...string[], number] | 1 | string | 2 | string |
|
||||
| middle-rest.ts:1:5:1:7 | foo | [boolean, ...string[], number] | 2 | number | 2 | string |
|
||||
| middle-rest.ts:3:1:3:3 | foo | [boolean, ...string[], number] | 0 | boolean | 2 | string |
|
||||
| middle-rest.ts:3:1:3:3 | foo | [boolean, ...string[], number] | 1 | string | 2 | string |
|
||||
| middle-rest.ts:3:1:3:3 | foo | [boolean, ...string[], number] | 2 | number | 2 | string |
|
||||
| middle-rest.ts:3:1:3:26 | foo = [ ... ", 123] | [true, string, number] | 0 | true | 3 | no-rest |
|
||||
| middle-rest.ts:3:1:3:26 | foo = [ ... ", 123] | [true, string, number] | 1 | string | 3 | no-rest |
|
||||
| middle-rest.ts:3:1:3:26 | foo = [ ... ", 123] | [true, string, number] | 2 | number | 3 | no-rest |
|
||||
| middle-rest.ts:3:7:3:26 | [true, "hello", 123] | [boolean, ...string[], number] | 0 | boolean | 2 | string |
|
||||
| middle-rest.ts:3:7:3:26 | [true, "hello", 123] | [boolean, ...string[], number] | 1 | string | 2 | string |
|
||||
| middle-rest.ts:3:7:3:26 | [true, "hello", 123] | [boolean, ...string[], number] | 2 | number | 2 | string |
|
||||
| tst.ts:34:5:34:9 | tuple | [number, string] | 0 | number | 2 | no-rest |
|
||||
| tst.ts:34:5:34:9 | tuple | [number, string] | 1 | string | 2 | no-rest |
|
||||
| tst.ts:36:5:36:28 | tupleWi ... Element | [number, string, number?] | 0 | number | 2 | no-rest |
|
||||
|
||||
Reference in New Issue
Block a user