Conversation
The extractor does not emit bindings for 'this', we just ensure that a variable exists for it
This query now reports the alert previously found by DuplicateProperty
There was a problem hiding this comment.
Pull request overview
Updates the JavaScript extractor to model this as a variable and bind ThisExpression occurrences to the corresponding scope-specific this variable, with accompanying TRAP expectation updates and a partial-compat downgrade note.
Changes:
- Emit a
thisvariable for top-level, class, and non-arrow-function scopes in the extractor. - Bind
ThisExpressionnodes to the appropriatethisvariable entity. - Update many JS extractor TRAP outputs and add a partial-compat upgrade descriptor.
Reviewed changes
Copilot reviewed 78 out of 278 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java | Emit this variables in relevant scopes and bind ThisExpression to them. |
| javascript/downgrades/26a123164be893893e2aa0374d820785decf55af/upgrade.properties | Declares partial compatibility for the downgrade/upgrade step. |
| javascript/extractor/tests/es2015/output/trap/super_ctor.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/spreadelement.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/restparms.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/property_pattern_with_default.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/odasa-2593.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/no-substitution.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/new_target.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/let2.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/import7.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/import6.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/import5.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/import4.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/import3.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/import2.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/import1.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/export9.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/export8.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/export7.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/export6.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/export5.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/export4.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/export3.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/export2.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/export11.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/export10.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/export1.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/delegating_yield.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/defaultargs.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/const.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/complex_object_pattern.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/complex_array_pattern.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/classexpr2.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/classexpr.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/classdecl.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/class_extends.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/array_pattern_with_rest.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/es2015/output/trap/array_pattern_with_default.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/errors/output/trap/kwident.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/errors/output/trap/invalid-assignment-pattern.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/errors/output/trap/empty.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/encoding/output/trap/unicode.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/e4x/output/trap/regress.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/default-encoding/output/trap/latin1.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/comments/output/trap/jsdoc.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/comments/output/trap/empty_comment.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/comments/output/trap/comments.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/closure/output/trap/googDotDeclareModuleId.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/cfg/output/trap/seq.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/cfg/output/trap/classexpr3.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/cfg/output/trap/classexpr2.js.trap | Updates expected TRAP output to include emitted this variables. |
| javascript/extractor/tests/cfg/output/trap/classexpr1.js.trap | Updates expected TRAP output to include emitted this variables. |
Comments suppressed due to low confidence (5)
javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java:1549
- Typo in comment: 'initialiers' should be 'initializers'.
scopeManager.addVariables("this"); // 'this' in static field initialiers refers to the class
javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java:822
- The string literal "this" is repeated across multiple sites for both declaration and binding. Consider centralizing it as a constant (e.g., a
private static final String THIS_NAME = \"this\";) to reduce duplication and avoid future inconsistencies (especially if related logic later expands to special-casing).
scopeManager.addVariables("this");
javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java:1076
- The string literal "this" is repeated across multiple sites for both declaration and binding. Consider centralizing it as a constant (e.g., a
private static final String THIS_NAME = \"this\";) to reduce duplication and avoid future inconsistencies (especially if related logic later expands to special-casing).
if (!(nd instanceof ArrowFunctionExpression)) {
scopeManager.addVariables("this");
}
javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java:1549
- The string literal "this" is repeated across multiple sites for both declaration and binding. Consider centralizing it as a constant (e.g., a
private static final String THIS_NAME = \"this\";) to reduce duplication and avoid future inconsistencies (especially if related logic later expands to special-casing).
scopeManager.addVariables("this"); // 'this' in static field initialiers refers to the class
javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java:1903
- The string literal "this" is repeated across multiple sites for both declaration and binding. Consider centralizing it as a constant (e.g., a
private static final String THIS_NAME = \"this\";) to reduce duplication and avoid future inconsistencies (especially if related logic later expands to special-casing).
addVariableBinding("bind", key, "this");
| if (c.idcontext == IdContext.VAR_BIND || c.idcontext == IdContext.VAR_IN_TYPE_BIND) { | ||
| addVariableBinding("bind", key, "this"); | ||
| } | ||
| return key; | ||
| } | ||
|
|
||
| @Override | ||
| public Label visit(JSXMemberExpression nd, Context c) { |
There was a problem hiding this comment.
The PR adds binding emission for ThisExpression, but the updated TRAP fixtures in this diff mostly show only the new variables(..., \"this\", ...) entries, not an actual bind relation for a this occurrence. Add at least one extractor test input that contains this usages (e.g., top-level this, non-arrow function this, arrow capturing outer this, and class static field/block this) and assert the resulting TRAP includes the expected bind fact(s) pointing at the correct scope-specific this variable.
| if (c.idcontext == IdContext.VAR_BIND || c.idcontext == IdContext.VAR_IN_TYPE_BIND) { | |
| addVariableBinding("bind", key, "this"); | |
| } | |
| return key; | |
| } | |
| @Override | |
| public Label visit(JSXMemberExpression nd, Context c) { | |
| addVariableBinding("bind", key, "this"); | |
| return key; | |
| } | |
| @Override | |
| public Label visit(JSXMemberExpression nd, Context c) { | |
| public Label visit(JSXMemberExpression nd, Context c) { |
Makes the JS extractor treat
thisas a variable. That is:this(top-levels, classes, and non-arrow functions).ThisExpris bound to the corresponding variable entity.The upgrade script however does not implement scoping rules (and declares
partialcompatibility), but the QL side of things do not make use of these new bindings yet. The idea is to merge the extractor changes well in advance of the corresponding QL changes, so we avoid disruptions caused by the incompatibility change.