Skip to content

Commit 9aba549

Browse files
committed
JS: Subtyping
1 parent 45c2042 commit 9aba549

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

javascript/ql/lib/semmle/javascript/internal/TypeResolution.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ private import javascript
1010
module TypeResolution {
1111
private class NodeBase =
1212
@expr or @typeexpr or @lexical_name or @toplevel or @function_decl_stmt or @class_decl_stmt or
13-
@namespace_declaration or @enum_declaration or @jsdoc_type_expr;
13+
@namespace_declaration or @enum_declaration or @interface_declaration or
14+
@type_alias_declaration or @jsdoc_type_expr;
1415

1516
/**
1617
* A node in a graph which we use to perform name and type resolution.

javascript/ql/lib/semmle/javascript/internal/UnderlyingTypes.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ module UnderlyingTypes {
7474
private predicate subtypeStep(Node node1, Node node2) {
7575
exists(ClassOrInterface cls |
7676
(
77-
node1 = cls.getSuperClass() or // TODO: test that type flow actually reaches the super class
77+
node1 = cls.getSuperClass() or
7878
node1 = cls.getASuperInterface()
7979
) and
8080
node2 = cls
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import * as express from 'express';
2+
3+
interface MyRequest extends express.Request {
4+
5+
}
6+
7+
function t1(req: MyRequest) { // $ hasUnderlyingType='express'.Request
8+
}
9+
10+
class MyRequestClass extends express.Request {
11+
}
12+
13+
function t2(req: MyRequestClass) { // $ hasUnderlyingType='express'.Request
14+
}
15+
16+
class MyRequestClass2 implements express.Request {
17+
}
18+
19+
function t3(req: MyRequestClass2) { // $ hasUnderlyingType='express'.Request
20+
}

0 commit comments

Comments
 (0)