Skip to content

Commit 0e70b58

Browse files
authored
Merge pull request github#5205 from erik-krogh/ts42
Approved by asgerf
2 parents ac67c67 + 00cfc77 commit 0e70b58

File tree

20 files changed

+2913
-92
lines changed

20 files changed

+2913
-92
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
lgtm,codescanning
2+
* TypeScript 4.2 is now supported.

javascript/extractor/lib/typescript/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "typescript-parser-wrapper",
33
"private": true,
44
"dependencies": {
5-
"typescript": "4.1.2"
5+
"typescript": "4.2.2"
66
},
77
"scripts": {
88
"build": "tsc --project tsconfig.json",

javascript/extractor/lib/typescript/src/type_table.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,14 @@ export class TypeTable {
632632
? tupleType.minLength
633633
: this.typeChecker.getTypeArguments(tupleReference).length;
634634
let hasRestElement = tupleType.hasRestElement ? 't' : 'f';
635-
let prefix = `tuple;${minLength};${hasRestElement}`;
635+
let restIndex = -1;
636+
for (let i = 0; i < tupleType.elementFlags.length; i++) {
637+
if (tupleType.elementFlags[i] & ts.ElementFlags.Rest) {
638+
restIndex = i;
639+
break;
640+
}
641+
}
642+
let prefix = `tuple;${minLength};${restIndex}`;
636643
return this.makeTypeStringVectorFromTypeReferenceArguments(prefix, type);
637644
}
638645
if (objectFlags & ts.ObjectFlags.Anonymous) {
@@ -940,6 +947,9 @@ export class TypeTable {
940947
* Returns a unique string for the given call/constructor signature.
941948
*/
942949
private getSignatureString(kind: ts.SignatureKind, signature: AugmentedSignature): string {
950+
let modifiers : ts.ModifiersArray = signature.getDeclaration()?.modifiers;
951+
let isAbstract = modifiers && modifiers.filter(modifier => modifier.kind == ts.SyntaxKind.AbstractKeyword).length > 0
952+
943953
let parameters = signature.getParameters();
944954
let numberOfTypeParameters = signature.typeParameters == null
945955
? 0
@@ -971,7 +981,7 @@ export class TypeTable {
971981
if (returnTypeId == null) {
972982
return null;
973983
}
974-
let tag = `${kind};${numberOfTypeParameters};${requiredParameters};${restParameterTag};${returnTypeId}`;
984+
let tag = `${kind};${isAbstract ? "t" : "f"};${numberOfTypeParameters};${requiredParameters};${restParameterTag};${returnTypeId}`;
975985
for (let typeParameter of signature.typeParameters || []) {
976986
tag += ";" + typeParameter.symbol.name;
977987
let constraint = typeParameter.getConstraint();

javascript/extractor/lib/typescript/yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
version "12.7.11"
77
resolved node-12.7.11.tgz#be879b52031cfb5d295b047f5462d8ef1a716446
88

9-
typescript@4.1.2:
10-
version "4.1.2"
11-
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.2.tgz#6369ef22516fe5e10304aae5a5c4862db55380e9"
12-
integrity sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==
9+
typescript@4.2.2:
10+
version "4.2.2"
11+
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.2.tgz#1450f020618f872db0ea17317d16d8da8ddb8c4c"
12+
integrity sha512-tbb+NVrLfnsJy3M59lsDgrzWIflR4d4TIUjz+heUnHZwdF7YsrMTKoRERiIvI2lvBG95dfpLxB21WZhys1bgaQ==

javascript/extractor/src/com/semmle/js/extractor/Main.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class Main {
4343
* A version identifier that should be updated every time the extractor changes in such a way that
4444
* it may produce different tuples for the same file under the same {@link ExtractorConfig}.
4545
*/
46-
public static final String EXTRACTOR_VERSION = "2021-02-05";
46+
public static final String EXTRACTOR_VERSION = "2021-02-24";
4747

4848
public static final Pattern NEWLINE = Pattern.compile("\n");
4949

javascript/extractor/src/com/semmle/ts/extractor/TypeExtractor.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,11 @@ private void extractType(int id) {
118118
}
119119
case tupleKind:
120120
{
121-
// The first two parts denote minimum length and presence of rest element.
121+
// The first two parts denote minimum length and index of rest element (or -1 if no rest element).
122122
trapWriter.addTuple("tuple_type_min_length", lbl, Integer.parseInt(parts[1]));
123-
if (parts[2].equals("t")) {
124-
trapWriter.addTuple("tuple_type_rest", lbl);
123+
int restIndex = Integer.parseInt(parts[2]);
124+
if (restIndex != -1) {
125+
trapWriter.addTuple("tuple_type_rest_index", lbl, restIndex);
125126
}
126127
firstChild += 2;
127128
break;
@@ -201,18 +202,22 @@ private void extractSymbolNameMapping(String relationName, JsonObject mappings)
201202

202203
private void extractSignature(int index) {
203204
// Format is:
204-
// kind;numTypeParams;requiredParams;restParamType;returnType(;paramName;paramType)*
205+
// kind;isAbstract;numTypeParams;requiredParams;restParamType;returnType(;paramName;paramType)*
205206
String[] parts = split(table.getSignatureString(index));
206207
Label label = trapWriter.globalID("signature;" + index);
207208
int kind = Integer.parseInt(parts[0]);
208-
int numberOfTypeParameters = Integer.parseInt(parts[1]);
209-
int requiredParameters = Integer.parseInt(parts[2]);
210-
String restParamTypeTag = parts[3];
209+
boolean isAbstract = parts[1].equals("t");
210+
if (isAbstract) {
211+
trapWriter.addTuple("is_abstract_signature", label);
212+
}
213+
int numberOfTypeParameters = Integer.parseInt(parts[2]);
214+
int requiredParameters = Integer.parseInt(parts[3]);
215+
String restParamTypeTag = parts[4];
211216
if (!restParamTypeTag.isEmpty()) {
212217
trapWriter.addTuple(
213218
"signature_rest_parameter", label, trapWriter.globalID("type;" + restParamTypeTag));
214219
}
215-
Label returnType = trapWriter.globalID("type;" + parts[4]);
220+
Label returnType = trapWriter.globalID("type;" + parts[5]);
216221
trapWriter.addTuple(
217222
"signature_types",
218223
label,
@@ -221,9 +226,9 @@ private void extractSignature(int index) {
221226
numberOfTypeParameters,
222227
requiredParameters);
223228
trapWriter.addTuple("signature_contains_type", returnType, label, -1);
224-
int numberOfParameters = (parts.length - 5) / 2; // includes type parameters
229+
int numberOfParameters = (parts.length - 6) / 2; // includes type parameters
225230
for (int i = 0; i < numberOfParameters; ++i) {
226-
int partIndex = 5 + (2 * i);
231+
int partIndex = 6 + (2 * i);
227232
String paramName = parts[partIndex];
228233
String paramTypeId = parts[partIndex + 1];
229234
if (paramTypeId.length() > 0) { // Unconstrained type parameters have an empty type ID.

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2149,18 +2149,23 @@ class TupleType extends ArrayType, @tuple_type {
21492149
int getMinimumLength() { tuple_type_min_length(this, result) }
21502150

21512151
/**
2152-
* Holds if this tuple type ends with a rest element, such as `[number, ...string[]]`.
2152+
* Gets the index of the rest element.
2153+
* For example, for a type `[number, ...string[]]` the result is 1,
2154+
* or for a type `[...number[], string]` the result is 0.
21532155
*/
2154-
predicate hasRestElement() { tuple_type_rest(this) }
2156+
int getRestElementIndex() { tuple_type_rest_index(this, result) }
2157+
2158+
/**
2159+
* Holds if this tuple type has a rest element, such as `[number, ...string[]]` or `[...number[], string]`.
2160+
*/
2161+
predicate hasRestElement() { exists(getRestElementIndex()) }
21552162

21562163
/**
21572164
* Gets the type of the rest element, if there is one.
21582165
*
21592166
* For example, the rest element of `[number, ...string[]]` is `string`.
21602167
*/
2161-
Type getRestElementType() {
2162-
hasRestElement() and result = getElementType(getNumElementType() - 1)
2163-
}
2168+
Type getRestElementType() { result = getElementType(getRestElementIndex()) }
21642169
}
21652170

21662171
/**
@@ -2789,6 +2794,11 @@ class CallSignatureType extends @signature_type {
27892794
* For example, for the signature `(...y: string[])`, this gets the type `string[]`.
27902795
*/
27912796
PlainArrayType getRestParameterArrayType() { signature_rest_parameter(this, result) }
2797+
2798+
/**
2799+
* Holds if this signature is abstract.
2800+
*/
2801+
predicate isAbstract() { is_abstract_signature(this) }
27922802
}
27932803

27942804
/**

javascript/ql/src/semmlecode.javascript.dbscheme

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,10 @@ signature_types (
742742
int required_params: int ref
743743
);
744744

745+
is_abstract_signature(
746+
unique int sig: @signature_type ref
747+
);
748+
745749
signature_rest_parameter(
746750
unique int sig: @signature_type ref,
747751
int rest_param_arra_type: @type ref
@@ -799,8 +803,9 @@ tuple_type_min_length(
799803
int minLength: int ref
800804
);
801805

802-
tuple_type_rest(
803-
unique int typ: @type ref
806+
tuple_type_rest_index(
807+
unique int typ: @type ref,
808+
int index: int ref
804809
);
805810

806811
// comments

javascript/ql/src/semmlecode.javascript.dbscheme.stats

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14480,6 +14480,17 @@
1448014480
</dependencies>
1448114481
</relation>
1448214482
<relation>
14483+
<name>is_abstract_signature</name>
14484+
<cardinality>12</cardinality>
14485+
<columnsizes>
14486+
<e>
14487+
<k>sig</k>
14488+
<v>12</v>
14489+
</e>
14490+
</columnsizes>
14491+
<dependencies/>
14492+
</relation>
14493+
<relation>
1448314494
<name>signature_rest_parameter</name>
1448414495
<cardinality>19521</cardinality>
1448514496
<columnsizes>
@@ -15891,13 +15902,17 @@
1589115902
</dependencies>
1589215903
</relation>
1589315904
<relation>
15894-
<name>tuple_type_rest</name>
15905+
<name>tuple_type_rest_index</name>
1589515906
<cardinality>100</cardinality>
1589615907
<columnsizes>
1589715908
<e>
1589815909
<k>typ</k>
1589915910
<v>100</v>
1590015911
</e>
15912+
<e>
15913+
<k>index</k>
15914+
<v>100</v>
15915+
</e>
1590115916
</columnsizes>
1590215917
<dependencies/>
1590315918
</relation>

javascript/ql/test/library-tests/TypeScript/Nullability/Types.expected

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ exprType
33
| tst.ts:2:5:2:21 | stringOrUndefined | string \| undefined |
44
| tst.ts:3:5:3:27 | stringO ... defined | string \| null \| undefined |
55
| tst.ts:4:5:4:16 | stringOrVoid | string \| void |
6-
| tst.ts:7:5:7:21 | stringOrNullAlias | string \| null |
6+
| tst.ts:7:5:7:21 | stringOrNullAlias | StringOrNullAlias |
77
| tst.ts:8:5:8:32 | stringO ... defined | string \| null \| undefined |
88
| tst.ts:10:5:10:23 | arrayOfStringOrNull | (string \| null)[] |
99
unaliasedType
10+
| StringOrNullAlias | string \| null |

0 commit comments

Comments
 (0)