From e3ed273d80a35fbeefa0280bf016c40b9083e7b8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 3 Sep 2026 12:48:42 +0000 Subject: [PATCH 1/3] Initial plan From bc584152b0fe36c428741b5f5ddc4b7f697a6f46 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 3 Sep 2026 12:56:00 +0000 Subject: [PATCH 2/3] Allow await property names in async functions Co-authored-by: hvitved <3667920+hvitved@users.noreply.github.com> --- javascript/extractor/src/com/semmle/jcorn/Parser.java | 4 ++-- .../AwaitPropertyName/AwaitPropertyName.expected | 0 .../library-tests/AwaitPropertyName/AwaitPropertyName.ql | 5 +++++ javascript/ql/test/library-tests/AwaitPropertyName/tst.js | 5 +++++ 4 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.expected create mode 100644 javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql create mode 100644 javascript/ql/test/library-tests/AwaitPropertyName/tst.js diff --git a/javascript/extractor/src/com/semmle/jcorn/Parser.java b/javascript/extractor/src/com/semmle/jcorn/Parser.java index a248a82dd140..cb9af6c6822c 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Parser.java +++ b/javascript/extractor/src/com/semmle/jcorn/Parser.java @@ -2296,9 +2296,9 @@ protected Identifier parseIdent(boolean liberal) { && (this.options.ecmaVersion() >= 6 || inputSubstring(this.start, this.end).indexOf("\\") == -1)) this.raiseRecoverable(this.start, "The keyword '" + this.value + "' is reserved"); - if (!isPrivateField && this.inGenerator && this.value.equals("yield")) + if (!liberal && !isPrivateField && this.inGenerator && this.value.equals("yield")) this.raiseRecoverable(this.start, "Can not use 'yield' as identifier inside a generator"); - if (!isPrivateField && this.inAsync && this.value.equals("await")) + if (!liberal && !isPrivateField && this.inAsync && this.value.equals("await")) this.raiseRecoverable( this.start, "Can not use 'await' as identifier inside an async function"); name = String.valueOf(this.value); diff --git a/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.expected b/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql b/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql new file mode 100644 index 000000000000..499d9bc46d6e --- /dev/null +++ b/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql @@ -0,0 +1,5 @@ +import javascript + +from Expr e +where e.toString() = "this expression should not exist" +select e diff --git a/javascript/ql/test/library-tests/AwaitPropertyName/tst.js b/javascript/ql/test/library-tests/AwaitPropertyName/tst.js new file mode 100644 index 000000000000..d2e91afcfa1a --- /dev/null +++ b/javascript/ql/test/library-tests/AwaitPropertyName/tst.js @@ -0,0 +1,5 @@ +const pool = { await() { return 42; } }; + +async function issue22499() { + return await pool.await(); +} From 365727c445c8f0d60e078809a590c84279ac1e7e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 4 Sep 2026 06:21:55 +0000 Subject: [PATCH 3/3] Test await and yield property names Co-authored-by: asgerf <316427+asgerf@users.noreply.github.com> --- .../library-tests/AwaitPropertyName/AwaitPropertyName.ql | 5 ++--- javascript/ql/test/library-tests/AwaitPropertyName/options | 1 + javascript/ql/test/library-tests/AwaitPropertyName/tst.js | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 javascript/ql/test/library-tests/AwaitPropertyName/options diff --git a/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql b/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql index 499d9bc46d6e..939784b52eab 100644 --- a/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql +++ b/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql @@ -1,5 +1,4 @@ import javascript -from Expr e -where e.toString() = "this expression should not exist" -select e +from JSParseError err +select err diff --git a/javascript/ql/test/library-tests/AwaitPropertyName/options b/javascript/ql/test/library-tests/AwaitPropertyName/options new file mode 100644 index 000000000000..13f987b19caf --- /dev/null +++ b/javascript/ql/test/library-tests/AwaitPropertyName/options @@ -0,0 +1 @@ +semmle-extractor-options: --tolerate-parse-errors diff --git a/javascript/ql/test/library-tests/AwaitPropertyName/tst.js b/javascript/ql/test/library-tests/AwaitPropertyName/tst.js index d2e91afcfa1a..4edc377402c0 100644 --- a/javascript/ql/test/library-tests/AwaitPropertyName/tst.js +++ b/javascript/ql/test/library-tests/AwaitPropertyName/tst.js @@ -1,5 +1,10 @@ const pool = { await() { return 42; } }; +const generator = { yield() { return 42; } }; async function issue22499() { return await pool.await(); } + +function* yieldPropertyName() { + return generator.yield(); +}