Skip to content

Commit 613173a

Browse files
committed
JS: Squash and rebase unified language lib work
1 parent 7fccdec commit 613173a

File tree

100 files changed

+21301
-12
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+21301
-12
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/javascript-all
4+
extensible: aliasModel
5+
data:
6+
- ["amd-define", "PredefinedVar[define]"]
7+
- ["require", "PredefinedVar[require]"]
8+
- ["module", "PredefinedVar[module]"]
9+
- ["exports", "PredefinedVar[exports]"]
10+
- ["exports", "PredefinedVar[module].Member[exports]"]
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
* @name Print DFG
3+
* @description Produces a representation of a file's data flow graph.
4+
* This query is used by the VS Code extension.
5+
* @id javascript/print-dfg
6+
* @kind graph
7+
* @tags ide-contextual-queries/print-dfg
8+
*/
9+
10+
private import semmle.javascript.internal.unified.minimal.minimal
11+
private import semmle.javascript.internal.unified.JSUnified
12+
13+
external string selectedSourceFile();
14+
15+
private predicate selectedSourceFileAlias = selectedSourceFile/0;
16+
17+
external int selectedSourceLine();
18+
19+
private predicate selectedSourceLineAlias = selectedSourceLine/0;
20+
21+
external int selectedSourceColumn();
22+
23+
private predicate selectedSourceColumnAlias = selectedSourceColumn/0;
24+
25+
module ViewDfgQueryInput implements ViewDfgQueryInputSig<File> {
26+
predicate selectedSourceFile = selectedSourceFileAlias/0;
27+
28+
predicate selectedSourceLine = selectedSourceLineAlias/0;
29+
30+
predicate selectedSourceColumn = selectedSourceColumnAlias/0;
31+
32+
File getFileFromLocation(Location loc) { result = loc.getFile() }
33+
}
34+
35+
import ViewDfgQuery<File, ViewDfgQueryInput>

javascript/ql/lib/qlpack.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ dependencies:
1717
codeql/util: ${workspace}
1818
codeql/xml: ${workspace}
1919
codeql/yaml: ${workspace}
20+
codeql/unified: ${workspace}
2021
dataExtensions:
2122
- semmle/javascript/frameworks/**/model.yml
2223
- semmle/javascript/frameworks/**/*.model.yml

javascript/ql/lib/semmle/javascript/Expr.qll

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,9 @@ class ArrayExpr extends @array_expr, Expr {
574574
override predicate isImpure() { this.getAnElement().isImpure() }
575575

576576
override string getAPrimaryQlClass() { result = "ArrayExpr" }
577+
578+
/** Gets the first index at which a `...` operator appears in this array literal. */
579+
int getFirstSpreadIndex() { result = min(int i | this.getElement(i) instanceof SpreadElement) }
577580
}
578581

579582
/**
@@ -1001,6 +1004,9 @@ class InvokeExpr extends @invokeexpr, Expr {
10011004
*/
10021005
predicate isSpreadArgument(int i) { this.getArgument(i).stripParens() instanceof SpreadElement }
10031006

1007+
/** Gets the first index of a spread argument (`...`), if any. */
1008+
int getFirstSpreadIndex() { result = min(int i | this.isSpreadArgument(i)) }
1009+
10041010
/**
10051011
* Holds if the `i`th argument of this invocation is an object literal whose property
10061012
* `name` is set to `value`.
@@ -2915,7 +2921,8 @@ deprecated private class LiteralDynamicImportPath extends PathExpr, ConstantStri
29152921
* Examples:
29162922
*
29172923
* ```
2918-
* x ?? f
2924+
* x?.f
2925+
* x?.()
29192926
* ```
29202927
*/
29212928
class OptionalUse extends Expr, @optionalchainable {

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
private import javascript
21
private import OverlayXml
32

43
/** Holds if the database is an overlay. */
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
overlay[local]
2+
module;
3+
4+
private import minimal.minimal
5+
private import codeql.util.Boolean
6+
7+
private newtype TConstant =
8+
TInt(int n) {
9+
n = [0 .. 10] or
10+
n = any(Expr e).getIntValue() or
11+
n = any(Parameter p).getIndex() or
12+
exists(any(InvokeExpr e).getArgument(n))
13+
} or
14+
TString(string s) { s = any(Expr e).getStringValue() } or
15+
TBoolean(Boolean b) or
16+
TNull() or
17+
TUndefined()
18+
19+
class Constant extends TConstant {
20+
int asInt() { this = TInt(result) }
21+
22+
string asString() { this = TString(result) }
23+
24+
boolean asBoolean() { this = TBoolean(result) }
25+
26+
predicate isNull() { this = TNull() }
27+
28+
predicate isUndefined() { this = TUndefined() }
29+
30+
string toString() {
31+
result = this.asInt().toString()
32+
or
33+
result = "\"" + this.asString() + "\""
34+
or
35+
result = this.asBoolean().toString()
36+
or
37+
this.isNull() and result = "null"
38+
or
39+
this.isUndefined() and result = "undefined"
40+
}
41+
42+
int asArrayIndex() { result = this.asInt() and result >= 0 }
43+
44+
string getAsOperand() {
45+
result = this.asInt().toString()
46+
or
47+
result = "\"" + this.asString() + "\""
48+
}
49+
}
50+
51+
module Constant {
52+
Constant fromInt(int n) { result = TInt(n) }
53+
54+
Constant fromString(string s) { result = TString(s) }
55+
56+
Constant fromBoolean(boolean b) { result = TBoolean(b) }
57+
58+
Constant null() { result = TNull() }
59+
60+
Constant undefined() { result = TUndefined() }
61+
}

0 commit comments

Comments
 (0)