Skip to content

Commit d025d59

Browse files
committedMar 20, 2025
JS: Add test for underlying types
1 parent 34a9c2f commit d025d59

20 files changed

+222
-0
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import * as express from 'express';
2+
3+
function getRequest(): express.Request { }
4+
5+
function t1() {
6+
getRequest(); // $ hasUnderlyingType='express'.Request
7+
}
8+
9+
declare function getRequestAmbient(): express.Request;
10+
11+
function t2() {
12+
getRequestAmbient(); // $ MISSING: hasUnderlyingType='express'.Request
13+
}
14+
15+
class C {
16+
method(): express.Request { }
17+
}
18+
19+
function t3(c: C) {
20+
c.method(); // $ hasUnderlyingType='express'.Request
21+
new C().method(); // $ hasUnderlyingType='express'.Request
22+
}
23+
24+
function callback(fn: (req: express.Request) => void) { // $ SPURIOUS: hasUnderlyingType='express'.Request - req seems to be a SourceNode
25+
}
26+
27+
function t4() {
28+
callback(function (
29+
req // $ hasUnderlyingType='express'.Request
30+
) { }
31+
);
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from 'express';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { Request, Response } from './expressBulkExport';
2+
3+
function t1(req: Request) { // $ hasUnderlyingType='express'.Request
4+
}
5+
6+
function t2(res: Response) { // $ hasUnderlyingType='express'.Response
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import E = require('express');
2+
export = E;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { Request } from "./expressExportAssign";
2+
3+
function t1(req: Request) { // $ hasUnderlyingType='express'.Request
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import Express = require('express');
2+
namespace Wrapper {
3+
export import E = Express;
4+
}
5+
export = Wrapper;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { E } from "./expressExportAssignWrapper";
2+
3+
function t1(req: E.Request) { // $ hasUnderlyingType='express'.Request
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { Request } from 'express';
2+
export { Response as R } from 'express';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Request, Response, R } from './expressSelectiveExport';
2+
3+
function t1(req: Request) { // $ hasUnderlyingType='express'.Request
4+
}
5+
6+
function t2(res: Response) { // none, not exported
7+
}
8+
9+
function t3(res: R) { // $ hasUnderlyingType='express'.Response
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * as wrapper from 'express';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { Request, Response, wrapper } from './expressWrapperExport';
2+
import * as w from './expressWrapperExport';
3+
4+
function t1(req: Request) { // none
5+
}
6+
7+
function t2(res: Response) { // none
8+
}
9+
10+
function t3(req: wrapper.Request) { // $ hasUnderlyingType='express'.Request
11+
}
12+
13+
function t4(res: wrapper.Response) { // $ hasUnderlyingType='express'.Response
14+
}
15+
16+
function t5(req: w.wrapper.Request) { // $ hasUnderlyingType='express'.Request
17+
}
18+
19+
function t6(res: w.wrapper.Response) { // $ hasUnderlyingType='express'.Response
20+
}
21+
22+
function t7(req: w.Request) { // none
23+
}
24+
25+
function t8(res: w.Response) { // none
26+
}
27+
28+
function t9(e: typeof w.wrapper) { // $ hasUnderlyingType='express'
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import * as e from 'express';
2+
import { Response } from 'express';
3+
4+
/**
5+
* @param {e.Request} req
6+
*/
7+
function t1(req) { // $ hasUnderlyingType='express'.Request SPURIOUS: hasUnderlyingType=e.Request
8+
}
9+
10+
/**
11+
* @param {Response} res
12+
*/
13+
function t2(res) { // $ hasUnderlyingType='express'.Response SPURIOUS: hasUnderlyingType=Response
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { Request } from 'express';
2+
3+
function t1(req: Request) { // $ hasUnderlyingType='express'.Request
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import Express = require('express');
2+
3+
namespace A {
4+
export import E = Express;
5+
}
6+
namespace B {
7+
export import Q = A
8+
}
9+
namespace C {
10+
import E = Express;
11+
export const A = E;
12+
}
13+
14+
function t1(x: A.E.Request) { // $ hasUnderlyingType='express'.Request
15+
}
16+
17+
function t2(x: B.Q.E.Request) { // $ hasUnderlyingType='express'.Request
18+
}
19+
20+
function t3(x: typeof Express) { // $ hasUnderlyingType='express'
21+
}
22+
23+
function t4(x: typeof A.E) { // $ hasUnderlyingType='express'
24+
}
25+
26+
function t5(x: typeof C.A) { // $ hasUnderlyingType='express'
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import * as express from 'express';
2+
3+
function t1(e: typeof express) { // $ hasUnderlyingType='express'
4+
}
5+
6+
function t2(req: express.Request) { // $ hasUnderlyingType='express'.Request
7+
}
8+
9+
function t3(req: Request) { // none, not in scope
10+
}
11+
12+
type E = typeof express;
13+
14+
function t4(e: E) { // $ hasUnderlyingType='express'
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import * as express from 'express';
2+
3+
interface Foo {
4+
req: express.Request;
5+
e: typeof express;
6+
}
7+
8+
function t1(f: Foo) {
9+
f.req; // $ hasUnderlyingType='express'.Request
10+
f.e; // $ hasUnderlyingType='express'
11+
12+
const {
13+
req, // $ hasUnderlyingType='express'.Request
14+
e // $ hasUnderlyingType='express'
15+
} = f;
16+
}
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+
}

‎javascript/ql/test/library-tests/UnderlyingTypes/test.expected

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import javascript
2+
private import utils.test.InlineExpectationsTest
3+
4+
bindingset[x, y]
5+
private string join(string x, string y) {
6+
if x = "" or y = "" then result = x + y else result = x + "." + y
7+
}
8+
9+
module TestConfig implements TestSig {
10+
string getARelevantTag() { result = "hasUnderlyingType" }
11+
12+
predicate hasActualResult(Location location, string element, string tag, string value) {
13+
element = "" and
14+
tag = "hasUnderlyingType" and
15+
exists(DataFlow::SourceNode sn | location = sn.getLocation() |
16+
sn.hasUnderlyingType(value)
17+
or
18+
exists(string mod, string name |
19+
sn.hasUnderlyingType(mod, name) and
20+
value = join("'" + mod + "'", name)
21+
)
22+
)
23+
}
24+
}
25+
26+
import MakeTest<TestConfig>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"include": ["."]
3+
}

0 commit comments

Comments
 (0)