From 640b17ec788f26b9e56762e1ecad898ffb13bbe7 Mon Sep 17 00:00:00 2001 From: Matthew Costabile Date: Tue, 5 May 2026 07:41:36 -0400 Subject: [PATCH 1/3] Add UseMemoDirective and UseNoMemoDirective classes --- javascript/ql/lib/semmle/javascript/Stmt.qll | 26 ++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/javascript/ql/lib/semmle/javascript/Stmt.qll b/javascript/ql/lib/semmle/javascript/Stmt.qll index db0d79de7bd5..6a757cc1d6ca 100644 --- a/javascript/ql/lib/semmle/javascript/Stmt.qll +++ b/javascript/ql/lib/semmle/javascript/Stmt.qll @@ -435,6 +435,32 @@ module Directive { UseClientDirective() { this.getDirectiveText() = "use client" } } + /** + * A `use memo` directive. + * + * Example: + * + * ``` + * "use memo"; + * ``` + */ + class UseMemoDirective extends KnownDirective { + UseMemoDirective() { this.getDirectiveText() = "use memo" } + } + + /** + * A `use no memo` directive. + * + * Example: + * + * ``` + * "use no memo"; + * ``` + */ + class UseNoMemoDirective extends KnownDirective { + UseNoMemoDirective() { this.getDirectiveText() = "use no memo" } + } + /** * A `use cache` directive. * From 0caa48392506265fe7689d344dc2085dc4b67edf Mon Sep 17 00:00:00 2001 From: Matthew Costabile Date: Tue, 5 May 2026 13:20:39 +0000 Subject: [PATCH 2/3] change note and test --- .../2026-05-05-use-memo-directive.md | 4 +++ .../Directives/KnownDirective.expected | 26 +++++++++++-------- .../ql/test/library-tests/Directives/tst.js | 4 +++ 3 files changed, 23 insertions(+), 11 deletions(-) create mode 100644 javascript/ql/lib/change-notes/2026-05-05-use-memo-directive.md diff --git a/javascript/ql/lib/change-notes/2026-05-05-use-memo-directive.md b/javascript/ql/lib/change-notes/2026-05-05-use-memo-directive.md new file mode 100644 index 000000000000..be95205c9ab5 --- /dev/null +++ b/javascript/ql/lib/change-notes/2026-05-05-use-memo-directive.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* Added `UseMemoDirective` and `UseNoMemoDirective` classes to model the React compiler directives `"use memo"` and `"use no memo"`. diff --git a/javascript/ql/test/library-tests/Directives/KnownDirective.expected b/javascript/ql/test/library-tests/Directives/KnownDirective.expected index 731158e7e8fb..0d7440e3f633 100644 --- a/javascript/ql/test/library-tests/Directives/KnownDirective.expected +++ b/javascript/ql/test/library-tests/Directives/KnownDirective.expected @@ -3,14 +3,18 @@ | tst.js:3:1:3:9 | 'bundle'; | bundle | | tst.js:4:1:4:13 | 'use server'; | use server | | tst.js:5:1:5:13 | 'use client'; | use client | -| tst.js:6:1:6:12 | 'use cache'; | use cache | -| tst.js:7:1:7:20 | 'use cache: remote'; | use cache: remote | -| tst.js:8:1:8:21 | 'use ca ... ivate'; | use cache: private | -| tst.js:17:3:17:12 | 'use asm'; | use asm | -| tst.js:18:3:18:11 | 'bundle'; | bundle | -| tst.js:19:3:19:15 | 'use server'; | use server | -| tst.js:20:3:20:15 | 'use client'; | use client | -| tst.js:21:3:21:14 | 'use cache'; | use cache | -| tst.js:22:3:22:22 | 'use cache: remote'; | use cache: remote | -| tst.js:23:3:23:23 | 'use ca ... ivate'; | use cache: private | -| tst.js:30:5:30:17 | 'use strict'; | use strict | +| tst.js:6:1:6:12 | 'use memo'; | use memo | +| tst.js:7:1:7:15 | 'use no memo'; | use no memo | +| tst.js:8:1:8:12 | 'use cache'; | use cache | +| tst.js:9:1:9:20 | 'use cache: remote'; | use cache: remote | +| tst.js:10:1:10:21 | 'use ca ... ivate'; | use cache: private | +| tst.js:19:3:19:12 | 'use asm'; | use asm | +| tst.js:20:3:20:11 | 'bundle'; | bundle | +| tst.js:21:3:21:15 | 'use server'; | use server | +| tst.js:22:3:22:15 | 'use client'; | use client | +| tst.js:23:3:23:13 | 'use memo'; | use memo | +| tst.js:24:3:24:17 | 'use no memo'; | use no memo | +| tst.js:25:3:25:14 | 'use cache'; | use cache | +| tst.js:26:3:26:22 | 'use cache: remote'; | use cache: remote | +| tst.js:27:3:27:23 | 'use ca ... ivate'; | use cache: private | +| tst.js:34:5:34:17 | 'use strict'; | use strict | diff --git a/javascript/ql/test/library-tests/Directives/tst.js b/javascript/ql/test/library-tests/Directives/tst.js index ec03cbffa0e5..7c7676322a4a 100644 --- a/javascript/ql/test/library-tests/Directives/tst.js +++ b/javascript/ql/test/library-tests/Directives/tst.js @@ -3,6 +3,8 @@ 'bundle';// and this 'use server'; 'use client'; +'use memo'; +'use no memo'; 'use cache'; 'use cache: remote'; 'use cache: private'; @@ -18,6 +20,8 @@ function f() { 'bundle'; 'use server'; 'use client'; + 'use memo'; + 'use no memo'; 'use cache'; 'use cache: remote'; 'use cache: private'; From 18550039f277e25620c083309ab5cc0e2296c85d Mon Sep 17 00:00:00 2001 From: Matthew Costabile Date: Tue, 5 May 2026 11:06:40 -0400 Subject: [PATCH 3/3] Update KnownDirective.expected --- .../test/library-tests/Directives/KnownDirective.expected | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/javascript/ql/test/library-tests/Directives/KnownDirective.expected b/javascript/ql/test/library-tests/Directives/KnownDirective.expected index 0d7440e3f633..065c0954f747 100644 --- a/javascript/ql/test/library-tests/Directives/KnownDirective.expected +++ b/javascript/ql/test/library-tests/Directives/KnownDirective.expected @@ -3,8 +3,8 @@ | tst.js:3:1:3:9 | 'bundle'; | bundle | | tst.js:4:1:4:13 | 'use server'; | use server | | tst.js:5:1:5:13 | 'use client'; | use client | -| tst.js:6:1:6:12 | 'use memo'; | use memo | -| tst.js:7:1:7:15 | 'use no memo'; | use no memo | +| tst.js:6:1:6:11 | 'use memo'; | use memo | +| tst.js:7:1:7:14 | 'use no memo'; | use no memo | | tst.js:8:1:8:12 | 'use cache'; | use cache | | tst.js:9:1:9:20 | 'use cache: remote'; | use cache: remote | | tst.js:10:1:10:21 | 'use ca ... ivate'; | use cache: private | @@ -13,7 +13,7 @@ | tst.js:21:3:21:15 | 'use server'; | use server | | tst.js:22:3:22:15 | 'use client'; | use client | | tst.js:23:3:23:13 | 'use memo'; | use memo | -| tst.js:24:3:24:17 | 'use no memo'; | use no memo | +| tst.js:24:3:24:16 | 'use no memo'; | use no memo | | tst.js:25:3:25:14 | 'use cache'; | use cache | | tst.js:26:3:26:22 | 'use cache: remote'; | use cache: remote | | tst.js:27:3:27:23 | 'use ca ... ivate'; | use cache: private |