mirror of
https://github.com/github/codeql.git
synced 2026-06-26 23:27:06 +02:00
Compare commits
47 Commits
codeql-cli
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
da3d0cf977 | ||
|
|
2767b8dbbf | ||
|
|
b1f60acf2c | ||
|
|
2b2613de4e | ||
|
|
14acc7fcab | ||
|
|
37ce885b0c | ||
|
|
52acaec03d | ||
|
|
d6e8555f8b | ||
|
|
b5ef15c70f | ||
|
|
5735ac330d | ||
|
|
5348c7d07c | ||
|
|
f89f304e50 | ||
|
|
ff7dc297d5 | ||
|
|
cacdc467de | ||
|
|
7b800b1dd6 | ||
|
|
1b6ff24642 | ||
|
|
3d1b6b64ed | ||
|
|
ac618e1cb2 | ||
|
|
221a54d22e | ||
|
|
5fcaac7cb2 | ||
|
|
cc215858e4 | ||
|
|
56a1b12c9e | ||
|
|
688213056c | ||
|
|
1c37688ec1 | ||
|
|
336df3ccf4 | ||
|
|
587f9c24ed | ||
|
|
456e33773b | ||
|
|
af7ae8c4cb | ||
|
|
1c4552edb0 | ||
|
|
5136d872ae | ||
|
|
474bcd4dd1 | ||
|
|
199489a225 | ||
|
|
ae4ccc651c | ||
|
|
0d845c2ea9 | ||
|
|
6d138c2bd4 | ||
|
|
85c39c04e0 | ||
|
|
1ee142d8bd | ||
|
|
a523c7f47f | ||
|
|
5f73754b95 | ||
|
|
e0fa6cf785 | ||
|
|
d1d9df7729 | ||
|
|
9bffcf81b5 | ||
|
|
f7c4e61956 | ||
|
|
575ece6ae2 | ||
|
|
f6ed5c19be | ||
|
|
4298b70f1c | ||
|
|
e88b8c53f3 |
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/actions-all
|
name: codeql/actions-all
|
||||||
version: 0.4.38
|
version: 0.4.39-dev
|
||||||
library: true
|
library: true
|
||||||
warnOnImplicitThis: true
|
warnOnImplicitThis: true
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/actions-queries
|
name: codeql/actions-queries
|
||||||
version: 0.6.30
|
version: 0.6.31-dev
|
||||||
library: false
|
library: false
|
||||||
warnOnImplicitThis: true
|
warnOnImplicitThis: true
|
||||||
groups: [actions, queries]
|
groups: [actions, queries]
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/cpp-all
|
name: codeql/cpp-all
|
||||||
version: 11.0.0
|
version: 11.0.1-dev
|
||||||
groups: cpp
|
groups: cpp
|
||||||
dbscheme: semmlecode.cpp.dbscheme
|
dbscheme: semmlecode.cpp.dbscheme
|
||||||
extractor: cpp
|
extractor: cpp
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/cpp-queries
|
name: codeql/cpp-queries
|
||||||
version: 1.6.5
|
version: 1.6.6-dev
|
||||||
groups:
|
groups:
|
||||||
- cpp
|
- cpp
|
||||||
- queries
|
- queries
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/csharp-solorigate-all
|
name: codeql/csharp-solorigate-all
|
||||||
version: 1.7.69
|
version: 1.7.70-dev
|
||||||
groups:
|
groups:
|
||||||
- csharp
|
- csharp
|
||||||
- solorigate
|
- solorigate
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/csharp-solorigate-queries
|
name: codeql/csharp-solorigate-queries
|
||||||
version: 1.7.69
|
version: 1.7.70-dev
|
||||||
groups:
|
groups:
|
||||||
- csharp
|
- csharp
|
||||||
- solorigate
|
- solorigate
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/csharp-all
|
name: codeql/csharp-all
|
||||||
version: 7.0.0
|
version: 7.0.1-dev
|
||||||
groups: csharp
|
groups: csharp
|
||||||
dbscheme: semmlecode.csharp.dbscheme
|
dbscheme: semmlecode.csharp.dbscheme
|
||||||
extractor: csharp
|
extractor: csharp
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/csharp-queries
|
name: codeql/csharp-queries
|
||||||
version: 1.7.5
|
version: 1.7.6-dev
|
||||||
groups:
|
groups:
|
||||||
- csharp
|
- csharp
|
||||||
- queries
|
- queries
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ toolchain go1.26.4
|
|||||||
// bazel mod tidy
|
// bazel mod tidy
|
||||||
require (
|
require (
|
||||||
golang.org/x/mod v0.37.0
|
golang.org/x/mod v0.37.0
|
||||||
golang.org/x/tools v0.46.0
|
golang.org/x/tools v0.47.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require github.com/stretchr/testify v1.11.1
|
require github.com/stretchr/testify v1.11.1
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ=
|
|||||||
golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0=
|
golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0=
|
||||||
golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
|
golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
|
||||||
golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
||||||
golang.org/x/tools v0.46.0 h1:7jTurBkPZu4moS/Uy4OQT1M+QBlsj3wejyZwsT8Z7rk=
|
golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q=
|
||||||
golang.org/x/tools v0.46.0/go.mod h1:FrD85F8l+NWL+9XWBSyVSHO6Ne4jutsfIFba7AWQ5Ys=
|
golang.org/x/tools v0.47.0/go.mod h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql-go-consistency-queries
|
name: codeql-go-consistency-queries
|
||||||
version: 1.0.52
|
version: 1.0.53-dev
|
||||||
groups:
|
groups:
|
||||||
- go
|
- go
|
||||||
- queries
|
- queries
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/go-all
|
name: codeql/go-all
|
||||||
version: 7.2.0
|
version: 7.2.1-dev
|
||||||
groups: go
|
groups: go
|
||||||
dbscheme: go.dbscheme
|
dbscheme: go.dbscheme
|
||||||
extractor: go
|
extractor: go
|
||||||
|
|||||||
@@ -33,9 +33,11 @@ module StoredXss {
|
|||||||
walkFn.getACall().getArgument(1) = f.getASuccessor*()
|
walkFn.getACall().getArgument(1) = f.getASuccessor*()
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
// A call to os.FileInfo.Name
|
// The return value of a call to `os.DirEntry.Name`, `os.FileInfo.Name`
|
||||||
exists(Method m | m.implements("io/fs", "FileInfo", "Name") |
|
// or `os.File.ReadDirNames`.
|
||||||
m = this.(DataFlow::CallNode).getTarget()
|
exists(DataFlow::CallNode cn, Method m | m = cn.getTarget() and this = cn.getResult(0) |
|
||||||
|
m.implements("io/fs", ["DirEntry", "FileInfo"], "Name") or
|
||||||
|
m.hasQualifiedName("os", "File", "ReadDirNames")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/go-queries
|
name: codeql/go-queries
|
||||||
version: 1.6.5
|
version: 1.6.6-dev
|
||||||
groups:
|
groups:
|
||||||
- go
|
- go
|
||||||
- queries
|
- queries
|
||||||
|
|||||||
@@ -156,12 +156,3 @@ nodes
|
|||||||
| websocketXss.go:54:3:54:38 | ... := ...[1] | semmle.label | ... := ...[1] |
|
| websocketXss.go:54:3:54:38 | ... := ...[1] | semmle.label | ... := ...[1] |
|
||||||
| websocketXss.go:55:24:55:31 | gorilla3 | semmle.label | gorilla3 |
|
| websocketXss.go:55:24:55:31 | gorilla3 | semmle.label | gorilla3 |
|
||||||
subpaths
|
subpaths
|
||||||
testFailures
|
|
||||||
| websocketXss.go:30:32:30:60 | comment | Missing result: Source[go/reflected-xss] |
|
|
||||||
| websocketXss.go:31:11:31:14 | xnet [postupdate] | Unexpected result: Source |
|
|
||||||
| websocketXss.go:34:30:34:58 | comment | Missing result: Source[go/reflected-xss] |
|
|
||||||
| websocketXss.go:35:21:35:25 | xnet2 [postupdate] | Unexpected result: Source |
|
|
||||||
| websocketXss.go:46:38:46:66 | comment | Missing result: Source[go/reflected-xss] |
|
|
||||||
| websocketXss.go:47:26:47:35 | gorillaMsg [postupdate] | Unexpected result: Source |
|
|
||||||
| websocketXss.go:50:33:50:61 | comment | Missing result: Source[go/reflected-xss] |
|
|
||||||
| websocketXss.go:51:17:51:24 | gorilla2 [postupdate] | Unexpected result: Source |
|
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
#select
|
#select
|
||||||
|
| StoredXss.go:13:21:13:36 | ...+... | StoredXss.go:13:21:13:31 | call to Name | StoredXss.go:13:21:13:36 | ...+... | Stored cross-site scripting vulnerability due to $@. | StoredXss.go:13:21:13:31 | call to Name | stored value |
|
||||||
| stored.go:30:22:30:25 | name | stored.go:18:3:18:28 | ... := ...[0] | stored.go:30:22:30:25 | name | Stored cross-site scripting vulnerability due to $@. | stored.go:18:3:18:28 | ... := ...[0] | stored value |
|
| stored.go:30:22:30:25 | name | stored.go:18:3:18:28 | ... := ...[0] | stored.go:30:22:30:25 | name | Stored cross-site scripting vulnerability due to $@. | stored.go:18:3:18:28 | ... := ...[0] | stored value |
|
||||||
| stored.go:61:22:61:25 | path | stored.go:59:30:59:33 | SSA def(path) | stored.go:61:22:61:25 | path | Stored cross-site scripting vulnerability due to $@. | stored.go:59:30:59:33 | SSA def(path) | stored value |
|
| stored.go:61:22:61:25 | path | stored.go:59:30:59:33 | SSA def(path) | stored.go:61:22:61:25 | path | Stored cross-site scripting vulnerability due to $@. | stored.go:59:30:59:33 | SSA def(path) | stored value |
|
||||||
edges
|
edges
|
||||||
|
| StoredXss.go:13:21:13:31 | call to Name | StoredXss.go:13:21:13:36 | ...+... | provenance | |
|
||||||
| stored.go:18:3:18:28 | ... := ...[0] | stored.go:25:14:25:17 | rows | provenance | Src:MaD:1 |
|
| stored.go:18:3:18:28 | ... := ...[0] | stored.go:25:14:25:17 | rows | provenance | Src:MaD:1 |
|
||||||
| stored.go:25:14:25:17 | rows | stored.go:25:29:25:33 | &... [postupdate] | provenance | FunctionModel |
|
| stored.go:25:14:25:17 | rows | stored.go:25:29:25:33 | &... [postupdate] | provenance | FunctionModel |
|
||||||
| stored.go:25:29:25:33 | &... [postupdate] | stored.go:30:22:30:25 | name | provenance | |
|
| stored.go:25:29:25:33 | &... [postupdate] | stored.go:30:22:30:25 | name | provenance | |
|
||||||
@@ -9,6 +11,8 @@ edges
|
|||||||
models
|
models
|
||||||
| 1 | Source: database/sql; DB; true; Query; ; ; ReturnValue[0]; database; manual |
|
| 1 | Source: database/sql; DB; true; Query; ; ; ReturnValue[0]; database; manual |
|
||||||
nodes
|
nodes
|
||||||
|
| StoredXss.go:13:21:13:31 | call to Name | semmle.label | call to Name |
|
||||||
|
| StoredXss.go:13:21:13:36 | ...+... | semmle.label | ...+... |
|
||||||
| stored.go:18:3:18:28 | ... := ...[0] | semmle.label | ... := ...[0] |
|
| stored.go:18:3:18:28 | ... := ...[0] | semmle.label | ... := ...[0] |
|
||||||
| stored.go:25:14:25:17 | rows | semmle.label | rows |
|
| stored.go:25:14:25:17 | rows | semmle.label | rows |
|
||||||
| stored.go:25:29:25:33 | &... [postupdate] | semmle.label | &... [postupdate] |
|
| stored.go:25:29:25:33 | &... [postupdate] | semmle.label | &... [postupdate] |
|
||||||
@@ -16,5 +20,3 @@ nodes
|
|||||||
| stored.go:59:30:59:33 | SSA def(path) | semmle.label | SSA def(path) |
|
| stored.go:59:30:59:33 | SSA def(path) | semmle.label | SSA def(path) |
|
||||||
| stored.go:61:22:61:25 | path | semmle.label | path |
|
| stored.go:61:22:61:25 | path | semmle.label | path |
|
||||||
subpaths
|
subpaths
|
||||||
testFailures
|
|
||||||
| StoredXss.go:13:39:13:63 | comment | Missing result: Alert[go/stored-xss] |
|
|
||||||
|
|||||||
@@ -27,12 +27,12 @@ func xss(w http.ResponseWriter, r *http.Request) {
|
|||||||
origin := "test"
|
origin := "test"
|
||||||
{
|
{
|
||||||
ws, _ := websocket.Dial(uri, "", origin)
|
ws, _ := websocket.Dial(uri, "", origin)
|
||||||
var xnet = make([]byte, 512) // $ Source[go/reflected-xss]
|
var xnet = make([]byte, 512)
|
||||||
ws.Read(xnet)
|
ws.Read(xnet) // $ Source[go/reflected-xss]
|
||||||
fmt.Fprintf(w, "%v", xnet) // $ Alert[go/reflected-xss]
|
fmt.Fprintf(w, "%v", xnet) // $ Alert[go/reflected-xss]
|
||||||
codec := &websocket.Codec{Marshal: marshal, Unmarshal: unmarshal}
|
codec := &websocket.Codec{Marshal: marshal, Unmarshal: unmarshal}
|
||||||
xnet2 := make([]byte, 512) // $ Source[go/reflected-xss]
|
xnet2 := make([]byte, 512)
|
||||||
codec.Receive(ws, xnet2)
|
codec.Receive(ws, xnet2) // $ Source[go/reflected-xss]
|
||||||
fmt.Fprintf(w, "%v", xnet2) // $ Alert[go/reflected-xss]
|
fmt.Fprintf(w, "%v", xnet2) // $ Alert[go/reflected-xss]
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@@ -43,12 +43,12 @@ func xss(w http.ResponseWriter, r *http.Request) {
|
|||||||
{
|
{
|
||||||
dialer := gorilla.Dialer{}
|
dialer := gorilla.Dialer{}
|
||||||
conn, _, _ := dialer.Dial(uri, nil)
|
conn, _, _ := dialer.Dial(uri, nil)
|
||||||
var gorillaMsg = make([]byte, 512) // $ Source[go/reflected-xss]
|
var gorillaMsg = make([]byte, 512)
|
||||||
gorilla.ReadJSON(conn, gorillaMsg)
|
gorilla.ReadJSON(conn, gorillaMsg) // $ Source[go/reflected-xss]
|
||||||
fmt.Fprintf(w, "%v", gorillaMsg) // $ Alert[go/reflected-xss]
|
fmt.Fprintf(w, "%v", gorillaMsg) // $ Alert[go/reflected-xss]
|
||||||
|
|
||||||
gorilla2 := make([]byte, 512) // $ Source[go/reflected-xss]
|
gorilla2 := make([]byte, 512)
|
||||||
conn.ReadJSON(gorilla2)
|
conn.ReadJSON(gorilla2) // $ Source[go/reflected-xss]
|
||||||
fmt.Fprintf(w, "%v", gorilla2) // $ Alert[go/reflected-xss]
|
fmt.Fprintf(w, "%v", gorilla2) // $ Alert[go/reflected-xss]
|
||||||
|
|
||||||
_, gorilla3, _ := conn.ReadMessage() // $ Source[go/reflected-xss]
|
_, gorilla3, _ := conn.ReadMessage() // $ Source[go/reflected-xss]
|
||||||
|
|||||||
@@ -14,7 +14,9 @@ pluginManagement {
|
|||||||
repositories {
|
repositories {
|
||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencyResolutionManagement {
|
dependencyResolutionManagement {
|
||||||
@@ -33,7 +35,9 @@ dependencyResolutionManagement {
|
|||||||
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rootProject.name = "Android Sample"
|
rootProject.name = "Android Sample"
|
||||||
|
|||||||
@@ -14,7 +14,9 @@ pluginManagement {
|
|||||||
repositories {
|
repositories {
|
||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = uri("https://maven-central.storage-download.googleapis.com/maven2/")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencyResolutionManagement {
|
dependencyResolutionManagement {
|
||||||
@@ -33,7 +35,9 @@ dependencyResolutionManagement {
|
|||||||
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = uri("https://maven-central.storage-download.googleapis.com/maven2/")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rootProject.name = "Android Sample"
|
rootProject.name = "Android Sample"
|
||||||
|
|||||||
@@ -14,7 +14,9 @@ pluginManagement {
|
|||||||
repositories {
|
repositories {
|
||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = uri("https://maven-central.storage-download.googleapis.com/maven2/")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencyResolutionManagement {
|
dependencyResolutionManagement {
|
||||||
@@ -33,7 +35,9 @@ dependencyResolutionManagement {
|
|||||||
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = uri("https://maven-central.storage-download.googleapis.com/maven2/")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rootProject.name = "Android Sample"
|
rootProject.name = "Android Sample"
|
||||||
|
|||||||
@@ -14,7 +14,9 @@ pluginManagement {
|
|||||||
repositories {
|
repositories {
|
||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencyResolutionManagement {
|
dependencyResolutionManagement {
|
||||||
@@ -33,7 +35,9 @@ dependencyResolutionManagement {
|
|||||||
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rootProject.name = "Android Sample"
|
rootProject.name = "Android Sample"
|
||||||
|
|||||||
@@ -13,7 +13,9 @@ buildscript {
|
|||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
jcenter()
|
maven {
|
||||||
|
url = uri("https://maven-central.storage-download.googleapis.com/maven2/")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -39,6 +41,8 @@ buildscript {
|
|||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
jcenter()
|
maven {
|
||||||
|
url = uri("https://maven-central.storage-download.googleapis.com/maven2/")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,9 @@ buildscript {
|
|||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
jcenter()
|
maven {
|
||||||
|
url = uri("https://maven-central.storage-download.googleapis.com/maven2/")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -39,6 +41,8 @@ buildscript {
|
|||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
jcenter()
|
maven {
|
||||||
|
url = uri("https://maven-central.storage-download.googleapis.com/maven2/")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,9 @@ buildscript {
|
|||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
jcenter()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -39,6 +41,8 @@ buildscript {
|
|||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
jcenter()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,9 @@ buildscript {
|
|||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
jcenter()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -32,13 +34,15 @@ buildscript {
|
|||||||
* dependencies used by all modules in your project, such as third-party plugins
|
* dependencies used by all modules in your project, such as third-party plugins
|
||||||
* or libraries. However, you should configure module-specific dependencies in
|
* or libraries. However, you should configure module-specific dependencies in
|
||||||
* each module-level build.gradle file. For new projects, Android Studio
|
* each module-level build.gradle file. For new projects, Android Studio
|
||||||
* includes JCenter and Google's Maven repository by default, but it does not
|
* includes Maven Central and Google's Maven repository by default, but it does not
|
||||||
* configure any dependencies (unless you select a template that requires some).
|
* configure any dependencies (unless you select a template that requires some).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
jcenter()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,9 @@ pluginManagement {
|
|||||||
repositories {
|
repositories {
|
||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencyResolutionManagement {
|
dependencyResolutionManagement {
|
||||||
@@ -33,7 +35,9 @@ dependencyResolutionManagement {
|
|||||||
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rootProject.name = "Android Sample"
|
rootProject.name = "Android Sample"
|
||||||
|
|||||||
@@ -8,7 +8,9 @@
|
|||||||
apply plugin: 'java-library'
|
apply plugin: 'java-library'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
https://repo.maven.apache.org/maven2/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar
|
https://maven-central.storage-download.googleapis.com/maven2/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar
|
||||||
https://repo.maven.apache.org/maven2/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar
|
https://maven-central.storage-download.googleapis.com/maven2/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar
|
||||||
https://repo.maven.apache.org/maven2/org/junit/jupiter/junit-jupiter-api/5.12.1/junit-jupiter-api-5.12.1.jar
|
https://maven-central.storage-download.googleapis.com/maven2/org/junit/jupiter/junit-jupiter-api/5.12.1/junit-jupiter-api-5.12.1.jar
|
||||||
https://repo.maven.apache.org/maven2/org/junit/platform/junit-platform-commons/1.12.1/junit-platform-commons-1.12.1.jar
|
https://maven-central.storage-download.googleapis.com/maven2/org/junit/platform/junit-platform-commons/1.12.1/junit-platform-commons-1.12.1.jar
|
||||||
https://repo.maven.apache.org/maven2/org/opentest4j/opentest4j/1.3.0/opentest4j-1.3.0.jar
|
https://maven-central.storage-download.googleapis.com/maven2/org/opentest4j/opentest4j/1.3.0/opentest4j-1.3.0.jar
|
||||||
|
|||||||
@@ -8,7 +8,9 @@
|
|||||||
apply plugin: 'java-library'
|
apply plugin: 'java-library'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
https://repo.maven.apache.org/maven2/joda-time/joda-time/2.12.7/joda-time-2.12.7-no-tzdb.jar
|
https://maven-central.storage-download.googleapis.com/maven2/joda-time/joda-time/2.12.7/joda-time-2.12.7-no-tzdb.jar
|
||||||
https://repo.maven.apache.org/maven2/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar
|
https://maven-central.storage-download.googleapis.com/maven2/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ apply plugin: 'java'
|
|||||||
|
|
||||||
// In this section you declare where to find the dependencies of your project
|
// In this section you declare where to find the dependencies of your project
|
||||||
repositories {
|
repositories {
|
||||||
// Use 'jcenter' for resolving your dependencies.
|
maven {
|
||||||
// You can declare any Maven/Ivy/file repository here.
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
jcenter()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// In this section you declare the dependencies for your production and test code
|
// In this section you declare the dependencies for your production and test code
|
||||||
|
|||||||
@@ -8,7 +8,9 @@
|
|||||||
apply plugin: 'java-library'
|
apply plugin: 'java-library'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
https://repo.maven.apache.org/maven2/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar
|
https://maven-central.storage-download.googleapis.com/maven2/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar
|
||||||
|
|||||||
@@ -8,7 +8,9 @@
|
|||||||
apply plugin: 'java-library'
|
apply plugin: 'java-library'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
https://repo.maven.apache.org/maven2/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar
|
https://maven-central.storage-download.googleapis.com/maven2/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
https://jcenter.bintray.com/junit/junit/4.12/junit-4.12.jar
|
https://maven-central.storage-download.googleapis.com/maven2/junit/junit/4.11/junit-4.11.jar
|
||||||
https://jcenter.bintray.com/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
|
https://maven-central.storage-download.googleapis.com/maven2/junit/junit/4.12/junit-4.12.jar
|
||||||
https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.21/slf4j-api-1.7.21.jar
|
https://maven-central.storage-download.googleapis.com/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
|
||||||
|
https://maven-central.storage-download.googleapis.com/maven2/org/slf4j/slf4j-api/1.7.21/slf4j-api-1.7.21.jar
|
||||||
https://repo.maven.apache.org/maven2/com/feiniaojin/naaf/naaf-graceful-response-example/1.0/naaf-graceful-response-example-1.0.jar
|
https://repo.maven.apache.org/maven2/com/feiniaojin/naaf/naaf-graceful-response-example/1.0/naaf-graceful-response-example-1.0.jar
|
||||||
https://repo.maven.apache.org/maven2/com/github/MoebiusSolutions/avro-registry-in-source/avro-registry-in-source-tests/1.8/avro-registry-in-source-tests-1.8.jar
|
https://repo.maven.apache.org/maven2/com/github/MoebiusSolutions/avro-registry-in-source/avro-registry-in-source-tests/1.8/avro-registry-in-source-tests-1.8.jar
|
||||||
https://repo.maven.apache.org/maven2/com/github/MoebiusSolutions/avro-registry-in-source/example-project/1.5/example-project-1.5.jar
|
https://repo.maven.apache.org/maven2/com/github/MoebiusSolutions/avro-registry-in-source/example-project/1.5/example-project-1.5.jar
|
||||||
@@ -12,7 +13,6 @@ https://repo.maven.apache.org/maven2/de/knutwalker/rx-redis-example_2.11/0.1.2/r
|
|||||||
https://repo.maven.apache.org/maven2/de/knutwalker/rx-redis-java-example_2.11/0.1.2/rx-redis-java-example_2.11-0.1.2.jar
|
https://repo.maven.apache.org/maven2/de/knutwalker/rx-redis-java-example_2.11/0.1.2/rx-redis-java-example_2.11-0.1.2.jar
|
||||||
https://repo.maven.apache.org/maven2/io/github/scrollsyou/example-spring-boot-starter/1.0.0/example-spring-boot-starter-1.0.0.jar
|
https://repo.maven.apache.org/maven2/io/github/scrollsyou/example-spring-boot-starter/1.0.0/example-spring-boot-starter-1.0.0.jar
|
||||||
https://repo.maven.apache.org/maven2/io/streamnative/com/example/maven-central-template/server/3.0.0/server-3.0.0.jar
|
https://repo.maven.apache.org/maven2/io/streamnative/com/example/maven-central-template/server/3.0.0/server-3.0.0.jar
|
||||||
https://repo.maven.apache.org/maven2/junit/junit/4.11/junit-4.11.jar
|
|
||||||
https://repo.maven.apache.org/maven2/no/nav/security/token-validation-ktor-demo/3.1.0/token-validation-ktor-demo-3.1.0.jar
|
https://repo.maven.apache.org/maven2/no/nav/security/token-validation-ktor-demo/3.1.0/token-validation-ktor-demo-3.1.0.jar
|
||||||
https://repo.maven.apache.org/maven2/org/minijax/minijax-example-fileupload/0.5.10/minijax-example-fileupload-0.5.10.jar
|
https://repo.maven.apache.org/maven2/org/minijax/minijax-example-fileupload/0.5.10/minijax-example-fileupload-0.5.10.jar
|
||||||
https://repo.maven.apache.org/maven2/org/minijax/minijax-example-inject/0.5.10/minijax-example-inject-0.5.10.jar
|
https://repo.maven.apache.org/maven2/org/minijax/minijax-example-inject/0.5.10/minijax-example-inject-0.5.10.jar
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ apply plugin: 'java'
|
|||||||
|
|
||||||
// In this section you declare where to find the dependencies of your project
|
// In this section you declare where to find the dependencies of your project
|
||||||
repositories {
|
repositories {
|
||||||
// Use 'jcenter' for resolving your dependencies.
|
maven {
|
||||||
// You can declare any Maven/Ivy/file repository here.
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
jcenter()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// In this section you declare the dependencies for your production and test code
|
// In this section you declare the dependencies for your production and test code
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ apply plugin: 'java'
|
|||||||
|
|
||||||
// In this section you declare where to find the dependencies of your project
|
// In this section you declare where to find the dependencies of your project
|
||||||
repositories {
|
repositories {
|
||||||
// Use 'jcenter' for resolving your dependencies.
|
maven {
|
||||||
// You can declare any Maven/Ivy/file repository here.
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
jcenter()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// In this section you declare the dependencies for your production and test code
|
// In this section you declare the dependencies for your production and test code
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<settings>
|
||||||
|
<mirrors>
|
||||||
|
<mirror>
|
||||||
|
<id>google-maven-central</id>
|
||||||
|
<name>GCS Maven Central mirror</name>
|
||||||
|
<url>https://maven-central.storage-download.googleapis.com/maven2/</url>
|
||||||
|
<mirrorOf>central</mirrorOf>
|
||||||
|
</mirror>
|
||||||
|
</mirrors>
|
||||||
|
</settings>
|
||||||
@@ -26,4 +26,5 @@ maven-project-2/src/main/resources/my-app.properties
|
|||||||
maven-project-2/src/main/resources/page.xml
|
maven-project-2/src/main/resources/page.xml
|
||||||
maven-project-2/src/main/resources/struts.xml
|
maven-project-2/src/main/resources/struts.xml
|
||||||
maven-project-2/src/test/java/com/example/AppTest4.java
|
maven-project-2/src/test/java/com/example/AppTest4.java
|
||||||
|
settings.xml
|
||||||
test-db/working/settings.xml
|
test-db/working/settings.xml
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
def test(codeql, use_java_11, java, actions_toolchains_file, check_diagnostics_java):
|
def test(codeql, use_java_11, java, actions_toolchains_file, check_diagnostics_java):
|
||||||
# The version of gradle used doesn't work on java 17
|
# The version of gradle used doesn't work on java 17
|
||||||
codeql.database.create(
|
codeql.database.create(
|
||||||
@@ -5,5 +7,6 @@ def test(codeql, use_java_11, java, actions_toolchains_file, check_diagnostics_j
|
|||||||
"CODEQL_EXTRACTOR_JAVA_OPTION_BUILDLESS": "true",
|
"CODEQL_EXTRACTOR_JAVA_OPTION_BUILDLESS": "true",
|
||||||
"CODEQL_EXTRACTOR_JAVA_OPTION_BUILDLESS_CLASSPATH_FROM_BUILD_FILES": "true",
|
"CODEQL_EXTRACTOR_JAVA_OPTION_BUILDLESS_CLASSPATH_FROM_BUILD_FILES": "true",
|
||||||
"LGTM_INDEX_MAVEN_TOOLCHAINS_FILE": str(actions_toolchains_file),
|
"LGTM_INDEX_MAVEN_TOOLCHAINS_FILE": str(actions_toolchains_file),
|
||||||
|
"LGTM_INDEX_MAVEN_SETTINGS_FILE": os.path.join(os.path.dirname(os.path.realpath(__file__)), "settings.xml"),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -14,7 +14,9 @@ pluginManagement {
|
|||||||
repositories {
|
repositories {
|
||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencyResolutionManagement {
|
dependencyResolutionManagement {
|
||||||
@@ -33,7 +35,9 @@ dependencyResolutionManagement {
|
|||||||
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rootProject.name = "Android Sample"
|
rootProject.name = "Android Sample"
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ apply plugin: 'java'
|
|||||||
|
|
||||||
// In this section you declare where to find the dependencies of your project
|
// In this section you declare where to find the dependencies of your project
|
||||||
repositories {
|
repositories {
|
||||||
// Use 'jcenter' for resolving your dependencies.
|
maven {
|
||||||
// You can declare any Maven/Ivy/file repository here.
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
jcenter()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// In this section you declare the dependencies for your production and test code
|
// In this section you declare the dependencies for your production and test code
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ apply plugin: 'java'
|
|||||||
|
|
||||||
// In this section you declare where to find the dependencies of your project
|
// In this section you declare where to find the dependencies of your project
|
||||||
repositories {
|
repositories {
|
||||||
// Use 'jcenter' for resolving your dependencies.
|
maven {
|
||||||
// You can declare any Maven/Ivy/file repository here.
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
jcenter()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// In this section you declare the dependencies for your production and test code
|
// In this section you declare the dependencies for your production and test code
|
||||||
|
|||||||
@@ -12,8 +12,9 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
// Use Maven Central for resolving dependencies.
|
maven {
|
||||||
mavenCentral()
|
url = uri("https://maven-central.storage-download.googleapis.com/maven2/")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ apply plugin: 'java'
|
|||||||
|
|
||||||
// In this section you declare where to find the dependencies of your project
|
// In this section you declare where to find the dependencies of your project
|
||||||
repositories {
|
repositories {
|
||||||
// Use 'jcenter' for resolving your dependencies.
|
maven {
|
||||||
// You can declare any Maven/Ivy/file repository here.
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
jcenter()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// In this section you declare the dependencies for your production and test code
|
// In this section you declare the dependencies for your production and test code
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ apply plugin: 'java'
|
|||||||
|
|
||||||
// In this section you declare where to find the dependencies of your project
|
// In this section you declare where to find the dependencies of your project
|
||||||
repositories {
|
repositories {
|
||||||
// Use 'jcenter' for resolving your dependencies.
|
maven {
|
||||||
// You can declare any Maven/Ivy/file repository here.
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
jcenter()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// In this section you declare the dependencies for your production and test code
|
// In this section you declare the dependencies for your production and test code
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ apply plugin: 'java'
|
|||||||
|
|
||||||
// In this section you declare where to find the dependencies of your project
|
// In this section you declare where to find the dependencies of your project
|
||||||
repositories {
|
repositories {
|
||||||
// Use 'jcenter' for resolving your dependencies.
|
maven {
|
||||||
// You can declare any Maven/Ivy/file repository here.
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
jcenter()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// In this section you declare the dependencies for your production and test code
|
// In this section you declare the dependencies for your production and test code
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ apply plugin: 'java'
|
|||||||
|
|
||||||
// In this section you declare where to find the dependencies of your project
|
// In this section you declare where to find the dependencies of your project
|
||||||
repositories {
|
repositories {
|
||||||
// Use 'jcenter' for resolving your dependencies.
|
maven {
|
||||||
// You can declare any Maven/Ivy/file repository here.
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
jcenter()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// In this section you declare the dependencies for your production and test code
|
// In this section you declare the dependencies for your production and test code
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ version = '0.0.1-SNAPSHOT'
|
|||||||
// but I omit it to test we recognise the Spring Boot plugin version.
|
// but I omit it to test we recognise the Spring Boot plugin version.
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@@ -15,8 +15,9 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
// Use Maven Central for resolving dependencies.
|
maven {
|
||||||
mavenCentral()
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
application {
|
application {
|
||||||
|
|||||||
@@ -15,8 +15,9 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
// Use Maven Central for resolving dependencies.
|
maven {
|
||||||
mavenCentral()
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
application {
|
application {
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
maven {
|
||||||
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@@ -15,8 +15,9 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
// Use Maven Central for resolving dependencies.
|
maven {
|
||||||
mavenCentral()
|
url = 'https://maven-central.storage-download.googleapis.com/maven2/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
application {
|
application {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/java-all
|
name: codeql/java-all
|
||||||
version: 9.2.0
|
version: 9.2.1-dev
|
||||||
groups: java
|
groups: java
|
||||||
dbscheme: config/semmlecode.dbscheme
|
dbscheme: config/semmlecode.dbscheme
|
||||||
extractor: java
|
extractor: java
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/java-queries
|
name: codeql/java-queries
|
||||||
version: 1.11.5
|
version: 1.11.6-dev
|
||||||
groups:
|
groups:
|
||||||
- java
|
- java
|
||||||
- queries
|
- queries
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
category: minorAnalysis
|
||||||
|
---
|
||||||
|
* Added support for Angular's `@HostListener('window:message', ...)` and `@HostListener('document:message', ...)` decorators as `postMessage` event handlers. The decorated method's event parameter is now recognized as a client-side remote flow source, and is considered by the `js/missing-origin-check` query.
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/javascript-all
|
name: codeql/javascript-all
|
||||||
version: 2.8.0
|
version: 2.8.1-dev
|
||||||
groups: javascript
|
groups: javascript
|
||||||
dbscheme: semmlecode.javascript.dbscheme
|
dbscheme: semmlecode.javascript.dbscheme
|
||||||
extractor: javascript
|
extractor: javascript
|
||||||
|
|||||||
@@ -195,6 +195,18 @@ class PostMessageEventHandler extends Function {
|
|||||||
rhs = DataFlow::globalObjectRef().getAPropertyWrite("onmessage").getRhs() and
|
rhs = DataFlow::globalObjectRef().getAPropertyWrite("onmessage").getRhs() and
|
||||||
rhs.getABoundFunctionValue(paramIndex).getFunction() = this
|
rhs.getABoundFunctionValue(paramIndex).getFunction() = this
|
||||||
)
|
)
|
||||||
|
or
|
||||||
|
// Angular's `@HostListener('window:message', ['$event'])` decorator registers
|
||||||
|
// a method as a `message` event handler on the global `window` or `document`
|
||||||
|
// target. The decorated method receives the `MessageEvent` as its first
|
||||||
|
// parameter, so it is equivalent to `window.addEventListener('message', ...)`.
|
||||||
|
exists(MethodDefinition method, DataFlow::CallNode decorator |
|
||||||
|
decorator = DataFlow::moduleMember("@angular/core", "HostListener").getACall() and
|
||||||
|
decorator = method.getADecorator().getExpression().flow() and
|
||||||
|
decorator.getArgument(0).mayHaveStringValue(["window:message", "document:message"]) and
|
||||||
|
method.getBody() = this and
|
||||||
|
paramIndex = 0
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/javascript-queries
|
name: codeql/javascript-queries
|
||||||
version: 2.4.0
|
version: 2.4.1-dev
|
||||||
groups:
|
groups:
|
||||||
- javascript
|
- javascript
|
||||||
- queries
|
- queries
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import { Component, HostListener } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({ selector: 'app-root' })
|
||||||
|
class AngularComponent {
|
||||||
|
// Angular registers this as a `window` message handler via the decorator,
|
||||||
|
// equivalent to `window.addEventListener('message', ...)`.
|
||||||
|
@HostListener('window:message', ['$event'])
|
||||||
|
onWindowMessage(event: MessageEvent): void { // $ Alert - no origin check
|
||||||
|
eval(event.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@HostListener('document:message', ['$event'])
|
||||||
|
onDocumentMessage(event: MessageEvent): void { // $ Alert - no origin check
|
||||||
|
eval(event.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@HostListener('window:message', ['$event'])
|
||||||
|
onCheckedMessage(event: MessageEvent): void { // OK - has an origin check
|
||||||
|
if (event.origin === 'https://www.example.com') {
|
||||||
|
eval(event.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not a message event, so it is not a postMessage handler.
|
||||||
|
@HostListener('window:resize', ['$event'])
|
||||||
|
onResize(event: MessageEvent): void { // OK - not a message handler
|
||||||
|
eval(event.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
| Angular.ts:8:19:8:23 | event | Postmessage handler has no origin check. |
|
||||||
|
| Angular.ts:13:21:13:25 | event | Postmessage handler has no origin check. |
|
||||||
| tst.js:11:20:11:24 | event | Postmessage handler has no origin check. |
|
| tst.js:11:20:11:24 | event | Postmessage handler has no origin check. |
|
||||||
| tst.js:24:27:24:27 | e | Postmessage handler has no origin check. |
|
| tst.js:24:27:24:27 | e | Postmessage handler has no origin check. |
|
||||||
| tst.js:40:27:40:27 | e | Postmessage handler has no origin check. |
|
| tst.js:40:27:40:27 | e | Postmessage handler has no origin check. |
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
name: codeql/suite-helpers
|
name: codeql/suite-helpers
|
||||||
version: 1.0.52
|
version: 1.0.53-dev
|
||||||
groups: shared
|
groups: shared
|
||||||
warnOnImplicitThis: true
|
warnOnImplicitThis: true
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
category: minorAnalysis
|
||||||
|
---
|
||||||
|
* `Flask::FlaskApp::instance()` will now also return instances of subclasses defined in the source tree. Previously, these were filtered out. `Flask::FlaskApp::classRef()` has been deprecated in favor of `Flask::FlaskApp::subclassRef()` since it already returned some subclasses.
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/python-all
|
name: codeql/python-all
|
||||||
version: 7.2.0
|
version: 7.2.1-dev
|
||||||
groups: python
|
groups: python
|
||||||
dbscheme: semmlecode.python.dbscheme
|
dbscheme: semmlecode.python.dbscheme
|
||||||
extractor: python
|
extractor: python
|
||||||
|
|||||||
@@ -71,14 +71,21 @@ module Flask {
|
|||||||
* See https://flask.palletsprojects.com/en/1.1.x/api/#flask.Flask.
|
* See https://flask.palletsprojects.com/en/1.1.x/api/#flask.Flask.
|
||||||
*/
|
*/
|
||||||
module FlaskApp {
|
module FlaskApp {
|
||||||
/** Gets a reference to the `flask.Flask` class. */
|
/**
|
||||||
API::Node classRef() {
|
* Gets a reference to the `flask.Flask` class or any subclass.
|
||||||
result = API::moduleImport("flask").getMember("Flask") or
|
*
|
||||||
|
* Deprecated: Use `subclassRef()` instead, this predicate always returned some subclasses.
|
||||||
|
*/
|
||||||
|
deprecated API::Node classRef() { result = subclassRef() }
|
||||||
|
|
||||||
|
/** Gets a reference to the `flask.Flask` class or any subclass. */
|
||||||
|
API::Node subclassRef() {
|
||||||
|
result = API::moduleImport("flask").getMember("Flask").getASubclass*() or
|
||||||
result = ModelOutput::getATypeNode("flask.Flask~Subclass").getASubclass*()
|
result = ModelOutput::getATypeNode("flask.Flask~Subclass").getASubclass*()
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Gets a reference to an instance of `flask.Flask` (a flask application). */
|
/** Gets a reference to an instance of `flask.Flask` (a flask application). */
|
||||||
API::Node instance() { result = classRef().getReturn() }
|
API::Node instance() { result = subclassRef().getReturn() }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -132,7 +139,7 @@ module Flask {
|
|||||||
API::Node classRef() {
|
API::Node classRef() {
|
||||||
result = API::moduleImport("flask").getMember("Response")
|
result = API::moduleImport("flask").getMember("Response")
|
||||||
or
|
or
|
||||||
result = [FlaskApp::classRef(), FlaskApp::instance()].getMember("response_class")
|
result = [FlaskApp::subclassRef(), FlaskApp::instance()].getMember("response_class")
|
||||||
or
|
or
|
||||||
result = ModelOutput::getATypeNode("flask.Response~Subclass").getASubclass*()
|
result = ModelOutput::getATypeNode("flask.Response~Subclass").getASubclass*()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -351,7 +351,7 @@ class DjangoHttpRequest extends FindSubclassesSpec {
|
|||||||
class FlaskClass extends FindSubclassesSpec {
|
class FlaskClass extends FindSubclassesSpec {
|
||||||
FlaskClass() { this = "flask.Flask~Subclass" }
|
FlaskClass() { this = "flask.Flask~Subclass" }
|
||||||
|
|
||||||
override API::Node getAlreadyModeledClass() { result = Flask::FlaskApp::classRef() }
|
override API::Node getAlreadyModeledClass() { result = Flask::FlaskApp::subclassRef() }
|
||||||
}
|
}
|
||||||
|
|
||||||
class FlaskBlueprint extends FindSubclassesSpec {
|
class FlaskBlueprint extends FindSubclassesSpec {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/python-queries
|
name: codeql/python-queries
|
||||||
version: 1.8.5
|
version: 1.8.6-dev
|
||||||
groups:
|
groups:
|
||||||
- python
|
- python
|
||||||
- queries
|
- queries
|
||||||
|
|||||||
29
python/ql/test/experimental/meta/InlineInstanceTest.qll
Normal file
29
python/ql/test/experimental/meta/InlineInstanceTest.qll
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* Defines an InlineExpectationsTest for class instances, that is,
|
||||||
|
* for any API::Node that is an instance of a class (e.g. `Flask`).
|
||||||
|
*/
|
||||||
|
|
||||||
|
import python
|
||||||
|
import semmle.python.ApiGraphs
|
||||||
|
import utils.test.InlineExpectationsTest
|
||||||
|
private import semmle.python.dataflow.new.internal.PrintNode
|
||||||
|
|
||||||
|
signature API::Node getInstanceSig();
|
||||||
|
|
||||||
|
module MakeInlineInstanceTest<getInstanceSig/0 getInstance> {
|
||||||
|
private module InlineInstanceTest implements TestSig {
|
||||||
|
string getARelevantTag() { result = "instance" }
|
||||||
|
|
||||||
|
predicate hasActualResult(Location location, string element, string tag, string value) {
|
||||||
|
exists(location.getFile().getRelativePath()) and
|
||||||
|
exists(API::Node instance | instance = getInstance() |
|
||||||
|
location = instance.getLocation() and
|
||||||
|
element = prettyNode(instance.asSource()) and
|
||||||
|
value = "" and
|
||||||
|
tag = "instance"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
import MakeTest<InlineInstanceTest>
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import python
|
||||||
|
import semmle.python.frameworks.Flask
|
||||||
|
import semmle.python.ApiGraphs
|
||||||
|
import experimental.meta.InlineInstanceTest
|
||||||
|
|
||||||
|
API::Node getInstance() { result = Flask::FlaskApp::instance() }
|
||||||
|
|
||||||
|
import MakeInlineInstanceTest<getInstance/0>
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
from flask import Flask
|
||||||
|
|
||||||
|
|
||||||
|
class Sub(Flask):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
Flask.__init__(self, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
app = Sub(__name__) # $ instance
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/") # $ routeSetup="/"
|
||||||
|
def hello(): # $ requestHandler
|
||||||
|
return "world" # $ HttpResponse
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import flask
|
import flask
|
||||||
|
|
||||||
from flask import Flask, request, make_response
|
from flask import Flask, request, make_response
|
||||||
app = Flask(__name__)
|
app = Flask(__name__) # $ instance
|
||||||
|
|
||||||
@app.route("/") # $ routeSetup="/"
|
@app.route("/") # $ routeSetup="/"
|
||||||
def hello_world(): # $ requestHandler
|
def hello_world(): # $ requestHandler
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import json
|
|||||||
from flask import Flask, make_response, jsonify, Response, request, redirect
|
from flask import Flask, make_response, jsonify, Response, request, redirect
|
||||||
from werkzeug.datastructures import Headers
|
from werkzeug.datastructures import Headers
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__) # $ instance
|
||||||
|
|
||||||
|
|
||||||
@app.route("/html1") # $ routeSetup="/html1"
|
@app.route("/html1") # $ routeSetup="/html1"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import flask
|
import flask
|
||||||
|
|
||||||
from flask import Flask, make_response
|
from flask import Flask, make_response
|
||||||
app = Flask(__name__)
|
app = Flask(__name__) # $ instance
|
||||||
|
|
||||||
|
|
||||||
SOME_ROUTE = "/some/route"
|
SOME_ROUTE = "/some/route"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from flask import Flask, request
|
from flask import Flask, request
|
||||||
app = Flask(__name__)
|
app = Flask(__name__) # $ instance
|
||||||
|
|
||||||
@app.route("/save-uploaded-file") # $ routeSetup="/save-uploaded-file"
|
@app.route("/save-uploaded-file") # $ routeSetup="/save-uploaded-file"
|
||||||
def test_taint(): # $ requestHandler
|
def test_taint(): # $ requestHandler
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from flask import Flask, request, render_template_string, stream_template_string
|
from flask import Flask, request, render_template_string, stream_template_string
|
||||||
app = Flask(__name__)
|
app = Flask(__name__) # $ instance
|
||||||
|
|
||||||
@app.route("/test_taint/<name>/<int:number>") # $ routeSetup="/test_taint/<name>/<int:number>"
|
@app.route("/test_taint/<name>/<int:number>") # $ routeSetup="/test_taint/<name>/<int:number>"
|
||||||
def test_taint(name = "World!", number="0", foo="foo"): # $ requestHandler routedParameter=name routedParameter=number
|
def test_taint(name = "World!", number="0", foo="foo"): # $ requestHandler routedParameter=name routedParameter=number
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from flask import Flask, Response, stream_with_context, render_template_string, stream_template_string
|
from flask import Flask, Response, stream_with_context, render_template_string, stream_template_string
|
||||||
app = Flask(__name__)
|
app = Flask(__name__) # $ instance
|
||||||
|
|
||||||
@app.route("/a") # $ routeSetup="/a"
|
@app.route("/a") # $ routeSetup="/a"
|
||||||
def a(): # $ requestHandler
|
def a(): # $ requestHandler
|
||||||
|
|||||||
@@ -1312,6 +1312,244 @@ module QL {
|
|||||||
/** Gets a field or child node of this node. */
|
/** Gets a field or child node of this node. */
|
||||||
final override AstNode getAFieldOrChild() { ql_variable_def(this, result) }
|
final override AstNode getAFieldOrChild() { ql_variable_def(this, result) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Provides predicates for mapping AST nodes to their named children. */
|
||||||
|
module PrintAst {
|
||||||
|
/** Gets a child of `node` returned by the member predicate with the given `name`. If the predicate takes an index argument, `i` is bound to that index, otherwise `i` is `-1` (which is never a valid index). */
|
||||||
|
AstNode getChild(AstNode node, string name, int i) {
|
||||||
|
result = node.(AddExpr).getLeft() and i = -1 and name = "getLeft"
|
||||||
|
or
|
||||||
|
result = node.(AddExpr).getRight() and i = -1 and name = "getRight"
|
||||||
|
or
|
||||||
|
result = node.(AddExpr).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Aggregate).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(AnnotArg).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Annotation).getArgs(i) and name = "getArgs"
|
||||||
|
or
|
||||||
|
result = node.(Annotation).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(AritylessPredicateExpr).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(AritylessPredicateExpr).getQualifier() and i = -1 and name = "getQualifier"
|
||||||
|
or
|
||||||
|
result = node.(AsExpr).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(AsExprs).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Body).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Bool).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(CallBody).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(CallOrUnqualAggExpr).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Charpred).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(Charpred).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ClassMember).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ClasslessPredicate).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(ClasslessPredicate).getReturnType() and i = -1 and name = "getReturnType"
|
||||||
|
or
|
||||||
|
result = node.(ClasslessPredicate).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(CompTerm).getLeft() and i = -1 and name = "getLeft"
|
||||||
|
or
|
||||||
|
result = node.(CompTerm).getRight() and i = -1 and name = "getRight"
|
||||||
|
or
|
||||||
|
result = node.(CompTerm).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Conjunction).getLeft() and i = -1 and name = "getLeft"
|
||||||
|
or
|
||||||
|
result = node.(Conjunction).getRight() and i = -1 and name = "getRight"
|
||||||
|
or
|
||||||
|
result = node.(Dataclass).getExtends(i) and name = "getExtends"
|
||||||
|
or
|
||||||
|
result = node.(Dataclass).getInstanceof(i) and name = "getInstanceof"
|
||||||
|
or
|
||||||
|
result = node.(Dataclass).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(Dataclass).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Datatype).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(Datatype).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(DatatypeBranch).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(DatatypeBranch).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(DatatypeBranches).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Disjunction).getLeft() and i = -1 and name = "getLeft"
|
||||||
|
or
|
||||||
|
result = node.(Disjunction).getRight() and i = -1 and name = "getRight"
|
||||||
|
or
|
||||||
|
result = node.(ExprAggregateBody).getAsExprs() and i = -1 and name = "getAsExprs"
|
||||||
|
or
|
||||||
|
result = node.(ExprAggregateBody).getOrderBys() and i = -1 and name = "getOrderBys"
|
||||||
|
or
|
||||||
|
result = node.(ExprAnnotation).getAnnotArg() and i = -1 and name = "getAnnotArg"
|
||||||
|
or
|
||||||
|
result = node.(ExprAnnotation).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(ExprAnnotation).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Field).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(FullAggregateBody).getAsExprs() and i = -1 and name = "getAsExprs"
|
||||||
|
or
|
||||||
|
result = node.(FullAggregateBody).getGuard() and i = -1 and name = "getGuard"
|
||||||
|
or
|
||||||
|
result = node.(FullAggregateBody).getOrderBys() and i = -1 and name = "getOrderBys"
|
||||||
|
or
|
||||||
|
result = node.(FullAggregateBody).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(HigherOrderTerm).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(HigherOrderTerm).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(IfTerm).getCond() and i = -1 and name = "getCond"
|
||||||
|
or
|
||||||
|
result = node.(IfTerm).getFirst() and i = -1 and name = "getFirst"
|
||||||
|
or
|
||||||
|
result = node.(IfTerm).getSecond() and i = -1 and name = "getSecond"
|
||||||
|
or
|
||||||
|
result = node.(Implication).getLeft() and i = -1 and name = "getLeft"
|
||||||
|
or
|
||||||
|
result = node.(Implication).getRight() and i = -1 and name = "getRight"
|
||||||
|
or
|
||||||
|
result = node.(ImportDirective).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ImportModuleExpr).getQualName(i) and name = "getQualName"
|
||||||
|
or
|
||||||
|
result = node.(ImportModuleExpr).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(InExpr).getLeft() and i = -1 and name = "getLeft"
|
||||||
|
or
|
||||||
|
result = node.(InExpr).getRight() and i = -1 and name = "getRight"
|
||||||
|
or
|
||||||
|
result = node.(InstanceOf).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Literal).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(MemberPredicate).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(MemberPredicate).getReturnType() and i = -1 and name = "getReturnType"
|
||||||
|
or
|
||||||
|
result = node.(MemberPredicate).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Module).getImplements(i) and name = "getImplements"
|
||||||
|
or
|
||||||
|
result = node.(Module).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(Module).getParameter(i) and name = "getParameter"
|
||||||
|
or
|
||||||
|
result = node.(Module).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ModuleAliasBody).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ModuleExpr).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(ModuleExpr).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ModuleInstantiation).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(ModuleInstantiation).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ModuleMember).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ModuleName).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ModuleParam).getParameter() and i = -1 and name = "getParameter"
|
||||||
|
or
|
||||||
|
result = node.(ModuleParam).getSignature() and i = -1 and name = "getSignature"
|
||||||
|
or
|
||||||
|
result = node.(MulExpr).getLeft() and i = -1 and name = "getLeft"
|
||||||
|
or
|
||||||
|
result = node.(MulExpr).getRight() and i = -1 and name = "getRight"
|
||||||
|
or
|
||||||
|
result = node.(MulExpr).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Negation).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(OrderBy).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(OrderBys).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ParExpr).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(PredicateAliasBody).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(PredicateExpr).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(PrefixCast).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Ql).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(QualifiedRhs).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(QualifiedRhs).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(QualifiedExpr).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Quantified).getExpr() and i = -1 and name = "getExpr"
|
||||||
|
or
|
||||||
|
result = node.(Quantified).getFormula() and i = -1 and name = "getFormula"
|
||||||
|
or
|
||||||
|
result = node.(Quantified).getRange() and i = -1 and name = "getRange"
|
||||||
|
or
|
||||||
|
result = node.(Quantified).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Range).getLower() and i = -1 and name = "getLower"
|
||||||
|
or
|
||||||
|
result = node.(Range).getUpper() and i = -1 and name = "getUpper"
|
||||||
|
or
|
||||||
|
result = node.(Select).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(SetLiteral).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(SignatureExpr).getModExpr() and i = -1 and name = "getModExpr"
|
||||||
|
or
|
||||||
|
result = node.(SignatureExpr).getPredicate() and i = -1 and name = "getPredicate"
|
||||||
|
or
|
||||||
|
result = node.(SignatureExpr).getTypeExpr() and i = -1 and name = "getTypeExpr"
|
||||||
|
or
|
||||||
|
result = node.(SpecialCall).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(SuperRef).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(TypeAliasBody).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(TypeExpr).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(TypeExpr).getQualifier() and i = -1 and name = "getQualifier"
|
||||||
|
or
|
||||||
|
result = node.(TypeExpr).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(TypeUnionBody).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(UnaryExpr).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(UnqualAggBody).getAsExprs(i) and name = "getAsExprs"
|
||||||
|
or
|
||||||
|
result = node.(UnqualAggBody).getGuard() and i = -1 and name = "getGuard"
|
||||||
|
or
|
||||||
|
result = node.(UnqualAggBody).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(VarDecl).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(VarName).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Variable).getChild() and i = -1 and name = "getChild"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
overlay[local]
|
overlay[local]
|
||||||
@@ -1669,6 +1907,60 @@ module Dbscheme {
|
|||||||
/** Gets the name of the primary QL class for this element. */
|
/** Gets the name of the primary QL class for this element. */
|
||||||
final override string getAPrimaryQlClass() { result = "Varchar" }
|
final override string getAPrimaryQlClass() { result = "Varchar" }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Provides predicates for mapping AST nodes to their named children. */
|
||||||
|
module PrintAst {
|
||||||
|
/** Gets a child of `node` returned by the member predicate with the given `name`. If the predicate takes an index argument, `i` is bound to that index, otherwise `i` is `-1` (which is never a valid index). */
|
||||||
|
AstNode getChild(AstNode node, string name, int i) {
|
||||||
|
result = node.(Annotation).getArgsAnnotation() and i = -1 and name = "getArgsAnnotation"
|
||||||
|
or
|
||||||
|
result = node.(Annotation).getSimpleAnnotation() and i = -1 and name = "getSimpleAnnotation"
|
||||||
|
or
|
||||||
|
result = node.(ArgsAnnotation).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(ArgsAnnotation).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Branch).getQldoc() and i = -1 and name = "getQldoc"
|
||||||
|
or
|
||||||
|
result = node.(Branch).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(CaseDecl).getBase() and i = -1 and name = "getBase"
|
||||||
|
or
|
||||||
|
result = node.(CaseDecl).getDiscriminator() and i = -1 and name = "getDiscriminator"
|
||||||
|
or
|
||||||
|
result = node.(CaseDecl).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ColType).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Column).getColName() and i = -1 and name = "getColName"
|
||||||
|
or
|
||||||
|
result = node.(Column).getColType() and i = -1 and name = "getColType"
|
||||||
|
or
|
||||||
|
result = node.(Column).getIsRef() and i = -1 and name = "getIsRef"
|
||||||
|
or
|
||||||
|
result = node.(Column).getIsUnique() and i = -1 and name = "getIsUnique"
|
||||||
|
or
|
||||||
|
result = node.(Column).getQldoc() and i = -1 and name = "getQldoc"
|
||||||
|
or
|
||||||
|
result = node.(Column).getReprType() and i = -1 and name = "getReprType"
|
||||||
|
or
|
||||||
|
result = node.(Dbscheme).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Entry).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ReprType).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Table).getTableName() and i = -1 and name = "getTableName"
|
||||||
|
or
|
||||||
|
result = node.(Table).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(TableName).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(UnionDecl).getBase() and i = -1 and name = "getBase"
|
||||||
|
or
|
||||||
|
result = node.(UnionDecl).getChild(i) and name = "getChild"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
overlay[local]
|
overlay[local]
|
||||||
@@ -1803,6 +2095,24 @@ module Blame {
|
|||||||
/** Gets the name of the primary QL class for this element. */
|
/** Gets the name of the primary QL class for this element. */
|
||||||
final override string getAPrimaryQlClass() { result = "Number" }
|
final override string getAPrimaryQlClass() { result = "Number" }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Provides predicates for mapping AST nodes to their named children. */
|
||||||
|
module PrintAst {
|
||||||
|
/** Gets a child of `node` returned by the member predicate with the given `name`. If the predicate takes an index argument, `i` is bound to that index, otherwise `i` is `-1` (which is never a valid index). */
|
||||||
|
AstNode getChild(AstNode node, string name, int i) {
|
||||||
|
result = node.(BlameEntry).getDate() and i = -1 and name = "getDate"
|
||||||
|
or
|
||||||
|
result = node.(BlameEntry).getLine(i) and name = "getLine"
|
||||||
|
or
|
||||||
|
result = node.(BlameInfo).getFileEntry(i) and name = "getFileEntry"
|
||||||
|
or
|
||||||
|
result = node.(BlameInfo).getToday() and i = -1 and name = "getToday"
|
||||||
|
or
|
||||||
|
result = node.(FileEntry).getBlameEntry(i) and name = "getBlameEntry"
|
||||||
|
or
|
||||||
|
result = node.(FileEntry).getFileName() and i = -1 and name = "getFileName"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
overlay[local]
|
overlay[local]
|
||||||
@@ -1977,4 +2287,22 @@ module JSON {
|
|||||||
/** Gets the name of the primary QL class for this element. */
|
/** Gets the name of the primary QL class for this element. */
|
||||||
final override string getAPrimaryQlClass() { result = "True" }
|
final override string getAPrimaryQlClass() { result = "True" }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Provides predicates for mapping AST nodes to their named children. */
|
||||||
|
module PrintAst {
|
||||||
|
/** Gets a child of `node` returned by the member predicate with the given `name`. If the predicate takes an index argument, `i` is bound to that index, otherwise `i` is `-1` (which is never a valid index). */
|
||||||
|
AstNode getChild(AstNode node, string name, int i) {
|
||||||
|
result = node.(Array).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Document).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Object).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Pair).getKey() and i = -1 and name = "getKey"
|
||||||
|
or
|
||||||
|
result = node.(Pair).getValue() and i = -1 and name = "getValue"
|
||||||
|
or
|
||||||
|
result = node.(String).getChild(i) and name = "getChild"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1964,6 +1964,340 @@ module Ruby {
|
|||||||
/** Gets a field or child node of this node. */
|
/** Gets a field or child node of this node. */
|
||||||
final override AstNode getAFieldOrChild() { ruby_yield_child(this, result) }
|
final override AstNode getAFieldOrChild() { ruby_yield_child(this, result) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Provides predicates for mapping AST nodes to their named children. */
|
||||||
|
module PrintAst {
|
||||||
|
/** Gets a child of `node` returned by the member predicate with the given `name`. If the predicate takes an index argument, `i` is bound to that index, otherwise `i` is `-1` (which is never a valid index). */
|
||||||
|
AstNode getChild(AstNode node, string name, int i) {
|
||||||
|
result = node.(Alias).getAlias() and i = -1 and name = "getAlias"
|
||||||
|
or
|
||||||
|
result = node.(Alias).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(AlternativePattern).getAlternatives(i) and name = "getAlternatives"
|
||||||
|
or
|
||||||
|
result = node.(ArgumentList).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Array).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ArrayPattern).getClass() and i = -1 and name = "getClass"
|
||||||
|
or
|
||||||
|
result = node.(ArrayPattern).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(AsPattern).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(AsPattern).getValue() and i = -1 and name = "getValue"
|
||||||
|
or
|
||||||
|
result = node.(Assignment).getLeft() and i = -1 and name = "getLeft"
|
||||||
|
or
|
||||||
|
result = node.(Assignment).getRight() and i = -1 and name = "getRight"
|
||||||
|
or
|
||||||
|
result = node.(BareString).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(BareSymbol).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Begin).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(BeginBlock).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Binary).getLeft() and i = -1 and name = "getLeft"
|
||||||
|
or
|
||||||
|
result = node.(Binary).getRight() and i = -1 and name = "getRight"
|
||||||
|
or
|
||||||
|
result = node.(Block).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(Block).getParameters() and i = -1 and name = "getParameters"
|
||||||
|
or
|
||||||
|
result = node.(BlockArgument).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(BlockBody).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(BlockParameter).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(BlockParameters).getLocals(i) and name = "getLocals"
|
||||||
|
or
|
||||||
|
result = node.(BlockParameters).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(BodyStatement).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Break).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Call).getArguments() and i = -1 and name = "getArguments"
|
||||||
|
or
|
||||||
|
result = node.(Call).getBlock() and i = -1 and name = "getBlock"
|
||||||
|
or
|
||||||
|
result = node.(Call).getMethod() and i = -1 and name = "getMethod"
|
||||||
|
or
|
||||||
|
result = node.(Call).getOperator() and i = -1 and name = "getOperator"
|
||||||
|
or
|
||||||
|
result = node.(Call).getReceiver() and i = -1 and name = "getReceiver"
|
||||||
|
or
|
||||||
|
result = node.(Case).getValue() and i = -1 and name = "getValue"
|
||||||
|
or
|
||||||
|
result = node.(Case).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(CaseMatch).getClauses(i) and name = "getClauses"
|
||||||
|
or
|
||||||
|
result = node.(CaseMatch).getElse() and i = -1 and name = "getElse"
|
||||||
|
or
|
||||||
|
result = node.(CaseMatch).getValue() and i = -1 and name = "getValue"
|
||||||
|
or
|
||||||
|
result = node.(ChainedString).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Class).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(Class).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(Class).getSuperclass() and i = -1 and name = "getSuperclass"
|
||||||
|
or
|
||||||
|
result = node.(Complex).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Conditional).getAlternative() and i = -1 and name = "getAlternative"
|
||||||
|
or
|
||||||
|
result = node.(Conditional).getCondition() and i = -1 and name = "getCondition"
|
||||||
|
or
|
||||||
|
result = node.(Conditional).getConsequence() and i = -1 and name = "getConsequence"
|
||||||
|
or
|
||||||
|
result = node.(DelimitedSymbol).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(DestructuredLeftAssignment).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(DestructuredParameter).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Do).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(DoBlock).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(DoBlock).getParameters() and i = -1 and name = "getParameters"
|
||||||
|
or
|
||||||
|
result = node.(ElementReference).getBlock() and i = -1 and name = "getBlock"
|
||||||
|
or
|
||||||
|
result = node.(ElementReference).getObject() and i = -1 and name = "getObject"
|
||||||
|
or
|
||||||
|
result = node.(ElementReference).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Else).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Elsif).getAlternative() and i = -1 and name = "getAlternative"
|
||||||
|
or
|
||||||
|
result = node.(Elsif).getCondition() and i = -1 and name = "getCondition"
|
||||||
|
or
|
||||||
|
result = node.(Elsif).getConsequence() and i = -1 and name = "getConsequence"
|
||||||
|
or
|
||||||
|
result = node.(EndBlock).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Ensure).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ExceptionVariable).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Exceptions).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ExpressionReferencePattern).getValue() and i = -1 and name = "getValue"
|
||||||
|
or
|
||||||
|
result = node.(FindPattern).getClass() and i = -1 and name = "getClass"
|
||||||
|
or
|
||||||
|
result = node.(FindPattern).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(For).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(For).getPattern() and i = -1 and name = "getPattern"
|
||||||
|
or
|
||||||
|
result = node.(For).getValue() and i = -1 and name = "getValue"
|
||||||
|
or
|
||||||
|
result = node.(Hash).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(HashPattern).getClass() and i = -1 and name = "getClass"
|
||||||
|
or
|
||||||
|
result = node.(HashPattern).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(HashSplatArgument).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(HashSplatParameter).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(HeredocBody).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(If).getAlternative() and i = -1 and name = "getAlternative"
|
||||||
|
or
|
||||||
|
result = node.(If).getCondition() and i = -1 and name = "getCondition"
|
||||||
|
or
|
||||||
|
result = node.(If).getConsequence() and i = -1 and name = "getConsequence"
|
||||||
|
or
|
||||||
|
result = node.(IfGuard).getCondition() and i = -1 and name = "getCondition"
|
||||||
|
or
|
||||||
|
result = node.(IfModifier).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(IfModifier).getCondition() and i = -1 and name = "getCondition"
|
||||||
|
or
|
||||||
|
result = node.(In).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(InClause).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(InClause).getGuard() and i = -1 and name = "getGuard"
|
||||||
|
or
|
||||||
|
result = node.(InClause).getPattern() and i = -1 and name = "getPattern"
|
||||||
|
or
|
||||||
|
result = node.(Interpolation).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(KeywordParameter).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(KeywordParameter).getValue() and i = -1 and name = "getValue"
|
||||||
|
or
|
||||||
|
result = node.(KeywordPattern).getKey() and i = -1 and name = "getKey"
|
||||||
|
or
|
||||||
|
result = node.(KeywordPattern).getValue() and i = -1 and name = "getValue"
|
||||||
|
or
|
||||||
|
result = node.(Lambda).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(Lambda).getParameters() and i = -1 and name = "getParameters"
|
||||||
|
or
|
||||||
|
result = node.(LambdaParameters).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(LeftAssignmentList).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(MatchPattern).getPattern() and i = -1 and name = "getPattern"
|
||||||
|
or
|
||||||
|
result = node.(MatchPattern).getValue() and i = -1 and name = "getValue"
|
||||||
|
or
|
||||||
|
result = node.(Method).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(Method).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(Method).getParameters() and i = -1 and name = "getParameters"
|
||||||
|
or
|
||||||
|
result = node.(MethodParameters).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Module).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(Module).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(Next).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(OperatorAssignment).getLeft() and i = -1 and name = "getLeft"
|
||||||
|
or
|
||||||
|
result = node.(OperatorAssignment).getRight() and i = -1 and name = "getRight"
|
||||||
|
or
|
||||||
|
result = node.(OptionalParameter).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(OptionalParameter).getValue() and i = -1 and name = "getValue"
|
||||||
|
or
|
||||||
|
result = node.(Pair).getKey() and i = -1 and name = "getKey"
|
||||||
|
or
|
||||||
|
result = node.(Pair).getValue() and i = -1 and name = "getValue"
|
||||||
|
or
|
||||||
|
result = node.(ParenthesizedPattern).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ParenthesizedStatements).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Pattern).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Program).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Range).getBegin() and i = -1 and name = "getBegin"
|
||||||
|
or
|
||||||
|
result = node.(Range).getEnd() and i = -1 and name = "getEnd"
|
||||||
|
or
|
||||||
|
result = node.(Rational).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Redo).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Regex).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Rescue).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(Rescue).getExceptions() and i = -1 and name = "getExceptions"
|
||||||
|
or
|
||||||
|
result = node.(Rescue).getVariable() and i = -1 and name = "getVariable"
|
||||||
|
or
|
||||||
|
result = node.(RescueModifier).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(RescueModifier).getHandler() and i = -1 and name = "getHandler"
|
||||||
|
or
|
||||||
|
result = node.(RestAssignment).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Retry).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Return).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(RightAssignmentList).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(ScopeResolution).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(ScopeResolution).getScope() and i = -1 and name = "getScope"
|
||||||
|
or
|
||||||
|
result = node.(Setter).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(SingletonClass).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(SingletonClass).getValue() and i = -1 and name = "getValue"
|
||||||
|
or
|
||||||
|
result = node.(SingletonMethod).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(SingletonMethod).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(SingletonMethod).getObject() and i = -1 and name = "getObject"
|
||||||
|
or
|
||||||
|
result = node.(SingletonMethod).getParameters() and i = -1 and name = "getParameters"
|
||||||
|
or
|
||||||
|
result = node.(SplatArgument).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(SplatParameter).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(String).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(StringArray).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Subshell).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Superclass).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(SymbolArray).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(TestPattern).getPattern() and i = -1 and name = "getPattern"
|
||||||
|
or
|
||||||
|
result = node.(TestPattern).getValue() and i = -1 and name = "getValue"
|
||||||
|
or
|
||||||
|
result = node.(Then).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Unary).getOperand() and i = -1 and name = "getOperand"
|
||||||
|
or
|
||||||
|
result = node.(Undef).getChild(i) and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Unless).getAlternative() and i = -1 and name = "getAlternative"
|
||||||
|
or
|
||||||
|
result = node.(Unless).getCondition() and i = -1 and name = "getCondition"
|
||||||
|
or
|
||||||
|
result = node.(Unless).getConsequence() and i = -1 and name = "getConsequence"
|
||||||
|
or
|
||||||
|
result = node.(UnlessGuard).getCondition() and i = -1 and name = "getCondition"
|
||||||
|
or
|
||||||
|
result = node.(UnlessModifier).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(UnlessModifier).getCondition() and i = -1 and name = "getCondition"
|
||||||
|
or
|
||||||
|
result = node.(Until).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(Until).getCondition() and i = -1 and name = "getCondition"
|
||||||
|
or
|
||||||
|
result = node.(UntilModifier).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(UntilModifier).getCondition() and i = -1 and name = "getCondition"
|
||||||
|
or
|
||||||
|
result = node.(VariableReferencePattern).getName() and i = -1 and name = "getName"
|
||||||
|
or
|
||||||
|
result = node.(When).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(When).getPattern(i) and name = "getPattern"
|
||||||
|
or
|
||||||
|
result = node.(While).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(While).getCondition() and i = -1 and name = "getCondition"
|
||||||
|
or
|
||||||
|
result = node.(WhileModifier).getBody() and i = -1 and name = "getBody"
|
||||||
|
or
|
||||||
|
result = node.(WhileModifier).getCondition() and i = -1 and name = "getCondition"
|
||||||
|
or
|
||||||
|
result = node.(Yield).getChild() and i = -1 and name = "getChild"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
overlay[local]
|
overlay[local]
|
||||||
@@ -2107,4 +2441,20 @@ module Erb {
|
|||||||
/** Gets a field or child node of this node. */
|
/** Gets a field or child node of this node. */
|
||||||
final override AstNode getAFieldOrChild() { erb_template_child(this, _, result) }
|
final override AstNode getAFieldOrChild() { erb_template_child(this, _, result) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Provides predicates for mapping AST nodes to their named children. */
|
||||||
|
module PrintAst {
|
||||||
|
/** Gets a child of `node` returned by the member predicate with the given `name`. If the predicate takes an index argument, `i` is bound to that index, otherwise `i` is `-1` (which is never a valid index). */
|
||||||
|
AstNode getChild(AstNode node, string name, int i) {
|
||||||
|
result = node.(CommentDirective).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Directive).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(GraphqlDirective).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(OutputDirective).getChild() and i = -1 and name = "getChild"
|
||||||
|
or
|
||||||
|
result = node.(Template).getChild(i) and name = "getChild"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/ruby-all
|
name: codeql/ruby-all
|
||||||
version: 6.0.0
|
version: 6.0.1-dev
|
||||||
groups: ruby
|
groups: ruby
|
||||||
extractor: ruby
|
extractor: ruby
|
||||||
dbscheme: ruby.dbscheme
|
dbscheme: ruby.dbscheme
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/ruby-queries
|
name: codeql/ruby-queries
|
||||||
version: 1.6.5
|
version: 1.6.6-dev
|
||||||
groups:
|
groups:
|
||||||
- ruby
|
- ruby
|
||||||
- queries
|
- queries
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/rust-all
|
name: codeql/rust-all
|
||||||
version: 0.2.16
|
version: 0.2.17-dev
|
||||||
groups: rust
|
groups: rust
|
||||||
extractor: rust
|
extractor: rust
|
||||||
dbscheme: rust.dbscheme
|
dbscheme: rust.dbscheme
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/rust-queries
|
name: codeql/rust-queries
|
||||||
version: 0.1.37
|
version: 0.1.38-dev
|
||||||
groups:
|
groups:
|
||||||
- rust
|
- rust
|
||||||
- queries
|
- queries
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/concepts
|
name: codeql/concepts
|
||||||
version: 0.0.26
|
version: 0.0.27-dev
|
||||||
groups: shared
|
groups: shared
|
||||||
library: true
|
library: true
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/controlflow
|
name: codeql/controlflow
|
||||||
version: 2.0.36
|
version: 2.0.37-dev
|
||||||
groups: shared
|
groups: shared
|
||||||
library: true
|
library: true
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/dataflow
|
name: codeql/dataflow
|
||||||
version: 2.1.8
|
version: 2.1.9-dev
|
||||||
groups: shared
|
groups: shared
|
||||||
library: true
|
library: true
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/mad
|
name: codeql/mad
|
||||||
version: 1.0.52
|
version: 1.0.53-dev
|
||||||
groups: shared
|
groups: shared
|
||||||
library: true
|
library: true
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/namebinding
|
name: codeql/namebinding
|
||||||
version: 0.0.1
|
version: 0.0.2-dev
|
||||||
groups: shared
|
groups: shared
|
||||||
library: true
|
library: true
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/quantum
|
name: codeql/quantum
|
||||||
version: 0.0.30
|
version: 0.0.31-dev
|
||||||
groups: shared
|
groups: shared
|
||||||
library: true
|
library: true
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/rangeanalysis
|
name: codeql/rangeanalysis
|
||||||
version: 1.0.52
|
version: 1.0.53-dev
|
||||||
groups: shared
|
groups: shared
|
||||||
library: true
|
library: true
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/regex
|
name: codeql/regex
|
||||||
version: 1.0.52
|
version: 1.0.53-dev
|
||||||
groups: shared
|
groups: shared
|
||||||
library: true
|
library: true
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/ssa
|
name: codeql/ssa
|
||||||
version: 2.0.28
|
version: 2.0.29-dev
|
||||||
groups: shared
|
groups: shared
|
||||||
library: true
|
library: true
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/threat-models
|
name: codeql/threat-models
|
||||||
version: 1.0.52
|
version: 1.0.53-dev
|
||||||
library: true
|
library: true
|
||||||
groups: shared
|
groups: shared
|
||||||
dataExtensions:
|
dataExtensions:
|
||||||
|
|||||||
@@ -280,10 +280,11 @@ pub fn location_label(writer: &mut trap::Writer, location: trap::Location) -> tr
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Extracts the source file at `path`, which is assumed to be canonicalized.
|
/// Extracts the source file at `path`, which is assumed to be canonicalized.
|
||||||
/// When `yeast_runner` is `Some`, the parsed tree is first transformed
|
/// When `desugarer` is `Some`, the parsed tree is first transformed
|
||||||
/// through the supplied yeast `Runner` before TRAP extraction. Building the
|
/// through the supplied yeast desugarer before TRAP extraction. Building
|
||||||
/// `Runner` (which parses YAML and constructs the schema) is the caller's
|
/// the desugarer (which parses YAML and constructs the schema) is the
|
||||||
/// responsibility, allowing it to be done once and shared across files.
|
/// caller's responsibility, allowing it to be done once and shared across
|
||||||
|
/// files.
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
pub fn extract(
|
pub fn extract(
|
||||||
language: &Language,
|
language: &Language,
|
||||||
@@ -295,7 +296,7 @@ pub fn extract(
|
|||||||
path: &Path,
|
path: &Path,
|
||||||
source: &[u8],
|
source: &[u8],
|
||||||
ranges: &[Range],
|
ranges: &[Range],
|
||||||
yeast_runner: Option<&yeast::Runner<'_>>,
|
desugarer: Option<&dyn yeast::Desugarer>,
|
||||||
) {
|
) {
|
||||||
let path_str = file_paths::normalize_and_transform_path(path, transformer);
|
let path_str = file_paths::normalize_and_transform_path(path, transformer);
|
||||||
let source_root = std::env::current_dir()
|
let source_root = std::env::current_dir()
|
||||||
@@ -328,8 +329,8 @@ pub fn extract(
|
|||||||
schema,
|
schema,
|
||||||
);
|
);
|
||||||
|
|
||||||
if let Some(yeast_runner) = yeast_runner {
|
if let Some(desugarer) = desugarer {
|
||||||
let ast = yeast_runner
|
let ast = desugarer
|
||||||
.run_from_tree(&tree, source)
|
.run_from_tree(&tree, source)
|
||||||
.unwrap_or_else(|e| panic!("Desugaring failed for {path_str}: {e}"));
|
.unwrap_or_else(|e| panic!("Desugaring failed for {path_str}: {e}"));
|
||||||
traverse_yeast(&ast, &mut visitor);
|
traverse_yeast(&ast, &mut visitor);
|
||||||
|
|||||||
@@ -13,11 +13,14 @@ pub struct LanguageSpec {
|
|||||||
pub prefix: &'static str,
|
pub prefix: &'static str,
|
||||||
pub ts_language: tree_sitter::Language,
|
pub ts_language: tree_sitter::Language,
|
||||||
pub node_types: &'static str,
|
pub node_types: &'static str,
|
||||||
/// Optional yeast desugaring configuration. When set, the parsed
|
/// Optional desugarer. When set, the parsed tree is rewritten through
|
||||||
/// tree is rewritten through yeast before TRAP extraction. The
|
/// the desugarer before TRAP extraction. The desugarer's
|
||||||
/// config's `output_node_types_yaml` (if set) provides the schema
|
/// `output_node_types_yaml()` (if set) provides the schema used both
|
||||||
/// used both at runtime (for the rewriter) and for TRAP validation.
|
/// at runtime (for the rewriter) and for TRAP validation.
|
||||||
pub desugar: Option<yeast::DesugaringConfig>,
|
///
|
||||||
|
/// `Box<dyn yeast::Desugarer>` so the shared extractor is agnostic to
|
||||||
|
/// the user-defined context type the desugarer uses internally.
|
||||||
|
pub desugar: Option<Box<dyn yeast::Desugarer>>,
|
||||||
pub file_globs: Vec<String>,
|
pub file_globs: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,35 +94,22 @@ impl Extractor {
|
|||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let mut schemas = vec![];
|
let mut schemas = vec![];
|
||||||
let mut yeast_runners = Vec::new();
|
|
||||||
for lang in &self.languages {
|
for lang in &self.languages {
|
||||||
let effective_node_types: String =
|
let effective_node_types: String = match lang
|
||||||
match lang.desugar.as_ref().and_then(|c| c.output_node_types_yaml) {
|
|
||||||
Some(yaml) => yeast::node_types_yaml::convert(yaml).map_err(|e| {
|
|
||||||
std::io::Error::other(format!(
|
|
||||||
"Failed to convert YAML node-types to JSON for {}: {e}",
|
|
||||||
lang.prefix
|
|
||||||
))
|
|
||||||
})?,
|
|
||||||
None => lang.node_types.to_string(),
|
|
||||||
};
|
|
||||||
let schema = node_types::read_node_types_str(lang.prefix, &effective_node_types)?;
|
|
||||||
schemas.push(schema);
|
|
||||||
|
|
||||||
// Build the yeast runner once per language so the YAML schema
|
|
||||||
// isn't re-parsed for every file.
|
|
||||||
let yeast_runner = lang
|
|
||||||
.desugar
|
.desugar
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|config| yeast::Runner::from_config(lang.ts_language.clone(), config))
|
.and_then(|d| d.output_node_types_yaml())
|
||||||
.transpose()
|
{
|
||||||
.map_err(|e| {
|
Some(yaml) => yeast::node_types_yaml::convert(yaml).map_err(|e| {
|
||||||
std::io::Error::other(format!(
|
std::io::Error::other(format!(
|
||||||
"Failed to build desugaring runner for {}: {e}",
|
"Failed to convert YAML node-types to JSON for {}: {e}",
|
||||||
lang.prefix
|
lang.prefix
|
||||||
))
|
))
|
||||||
})?;
|
})?,
|
||||||
yeast_runners.push(yeast_runner);
|
None => lang.node_types.to_string(),
|
||||||
|
};
|
||||||
|
let schema = node_types::read_node_types_str(lang.prefix, &effective_node_types)?;
|
||||||
|
schemas.push(schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Construct a single globset containing all language globs,
|
// Construct a single globset containing all language globs,
|
||||||
@@ -194,7 +184,7 @@ impl Extractor {
|
|||||||
&path,
|
&path,
|
||||||
&source,
|
&source,
|
||||||
&[],
|
&[],
|
||||||
yeast_runners[i].as_ref(),
|
lang.desugar.as_deref(),
|
||||||
);
|
);
|
||||||
std::fs::create_dir_all(src_archive_file.parent().unwrap())?;
|
std::fs::create_dir_all(src_archive_file.parent().unwrap())?;
|
||||||
std::fs::copy(&path, &src_archive_file)?;
|
std::fs::copy(&path, &src_archive_file)?;
|
||||||
|
|||||||
@@ -159,6 +159,7 @@ pub fn generate(
|
|||||||
));
|
));
|
||||||
|
|
||||||
body.append(&mut ql_gen::convert_nodes(&nodes));
|
body.append(&mut ql_gen::convert_nodes(&nodes));
|
||||||
|
body.push(ql_gen::create_print_ast_module(&nodes));
|
||||||
ql::write(
|
ql::write(
|
||||||
&mut ql_writer,
|
&mut ql_writer,
|
||||||
&[ql::TopLevel::Module(ql::Module {
|
&[ql::TopLevel::Module(ql::Module {
|
||||||
|
|||||||
@@ -150,12 +150,14 @@ impl fmt::Display for Type<'_> {
|
|||||||
pub enum Expression<'a> {
|
pub enum Expression<'a> {
|
||||||
Var(&'a str),
|
Var(&'a str),
|
||||||
String(&'a str),
|
String(&'a str),
|
||||||
Integer(usize),
|
Integer(i64),
|
||||||
Pred(&'a str, Vec<Expression<'a>>),
|
Pred(&'a str, Vec<Expression<'a>>),
|
||||||
And(Vec<Expression<'a>>),
|
And(Vec<Expression<'a>>),
|
||||||
Or(Vec<Expression<'a>>),
|
Or(Vec<Expression<'a>>),
|
||||||
Equals(Box<Expression<'a>>, Box<Expression<'a>>),
|
Equals(Box<Expression<'a>>, Box<Expression<'a>>),
|
||||||
Dot(Box<Expression<'a>>, &'a str, Vec<Expression<'a>>),
|
Dot(Box<Expression<'a>>, &'a str, Vec<Expression<'a>>),
|
||||||
|
/// A type cast, rendered as `x.(Type)`.
|
||||||
|
Cast(Box<Expression<'a>>, &'a str),
|
||||||
Aggregate {
|
Aggregate {
|
||||||
name: &'a str,
|
name: &'a str,
|
||||||
vars: Vec<FormalParameter<'a>>,
|
vars: Vec<FormalParameter<'a>>,
|
||||||
@@ -219,6 +221,7 @@ impl fmt::Display for Expression<'_> {
|
|||||||
}
|
}
|
||||||
write!(f, ")")
|
write!(f, ")")
|
||||||
}
|
}
|
||||||
|
Expression::Cast(x, type_name) => write!(f, "{x}.({type_name})"),
|
||||||
Expression::Aggregate {
|
Expression::Aggregate {
|
||||||
name,
|
name,
|
||||||
vars,
|
vars,
|
||||||
|
|||||||
@@ -705,7 +705,7 @@ fn create_field_getters<'a>(
|
|||||||
),
|
),
|
||||||
ql::Expression::Equals(
|
ql::Expression::Equals(
|
||||||
Box::new(ql::Expression::Var("value")),
|
Box::new(ql::Expression::Var("value")),
|
||||||
Box::new(ql::Expression::Integer(*value)),
|
Box::new(ql::Expression::Integer(*value as i64)),
|
||||||
),
|
),
|
||||||
])
|
])
|
||||||
})
|
})
|
||||||
@@ -874,3 +874,99 @@ pub fn convert_nodes(nodes: &node_types::NodeTypeMap) -> Vec<ql::TopLevel<'_>> {
|
|||||||
|
|
||||||
classes
|
classes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates a `PrintAst` module containing a `getChild` predicate that maps each
|
||||||
|
/// AST node to its children together with the name of the member predicate that
|
||||||
|
/// produced them (and, for indexed fields, the index). This mirrors the
|
||||||
|
/// information exposed by `getAFieldOrChild`, but keeps the member predicate
|
||||||
|
/// name and index so that an AST printer can render labelled edges.
|
||||||
|
pub fn create_print_ast_module(nodes: &node_types::NodeTypeMap) -> ql::TopLevel<'_> {
|
||||||
|
let mut disjuncts: Vec<ql::Expression> = Vec::new();
|
||||||
|
for node in nodes.values() {
|
||||||
|
if let node_types::EntryKind::Table { name: _, fields } = &node.kind {
|
||||||
|
for field in fields {
|
||||||
|
// `ReservedWordInt` fields have string-valued getters, so they
|
||||||
|
// are not children and are excluded (just as they are from
|
||||||
|
// `getAFieldOrChild`).
|
||||||
|
if matches!(
|
||||||
|
field.type_info,
|
||||||
|
node_types::FieldTypeInfo::ReservedWordInt(_)
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let has_index = matches!(
|
||||||
|
field.storage,
|
||||||
|
node_types::Storage::Table {
|
||||||
|
has_index: true,
|
||||||
|
..
|
||||||
|
}
|
||||||
|
);
|
||||||
|
let getter_call = ql::Expression::Dot(
|
||||||
|
Box::new(ql::Expression::Cast(
|
||||||
|
Box::new(ql::Expression::Var("node")),
|
||||||
|
&node.ql_class_name,
|
||||||
|
)),
|
||||||
|
&field.getter_name,
|
||||||
|
if has_index {
|
||||||
|
vec![ql::Expression::Var("i")]
|
||||||
|
} else {
|
||||||
|
vec![]
|
||||||
|
},
|
||||||
|
);
|
||||||
|
let mut conjuncts = vec![ql::Expression::Equals(
|
||||||
|
Box::new(ql::Expression::Var("result")),
|
||||||
|
Box::new(getter_call),
|
||||||
|
)];
|
||||||
|
if !has_index {
|
||||||
|
conjuncts.push(ql::Expression::Equals(
|
||||||
|
Box::new(ql::Expression::Var("i")),
|
||||||
|
Box::new(ql::Expression::Integer(-1)),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
conjuncts.push(ql::Expression::Equals(
|
||||||
|
Box::new(ql::Expression::Var("name")),
|
||||||
|
Box::new(ql::Expression::String(&field.getter_name)),
|
||||||
|
));
|
||||||
|
disjuncts.push(ql::Expression::And(conjuncts));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let get_child = ql::Predicate {
|
||||||
|
qldoc: Some(String::from(
|
||||||
|
"Gets a child of `node` returned by the member predicate with the given `name`. \
|
||||||
|
If the predicate takes an index argument, `i` is bound to that index, otherwise \
|
||||||
|
`i` is `-1` (which is never a valid index).",
|
||||||
|
)),
|
||||||
|
name: "getChild",
|
||||||
|
overridden: false,
|
||||||
|
is_private: false,
|
||||||
|
is_final: false,
|
||||||
|
return_type: Some(ql::Type::Normal("AstNode")),
|
||||||
|
formal_parameters: vec![
|
||||||
|
ql::FormalParameter {
|
||||||
|
name: "node",
|
||||||
|
param_type: ql::Type::Normal("AstNode"),
|
||||||
|
},
|
||||||
|
ql::FormalParameter {
|
||||||
|
name: "name",
|
||||||
|
param_type: ql::Type::String,
|
||||||
|
},
|
||||||
|
ql::FormalParameter {
|
||||||
|
name: "i",
|
||||||
|
param_type: ql::Type::Int,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
body: ql::Expression::Or(disjuncts),
|
||||||
|
overlay: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
ql::TopLevel::Module(ql::Module {
|
||||||
|
qldoc: Some(String::from(
|
||||||
|
"Provides predicates for mapping AST nodes to their named children.",
|
||||||
|
)),
|
||||||
|
name: "PrintAst",
|
||||||
|
body: vec![ql::TopLevel::Predicate(get_child)],
|
||||||
|
overlay: None,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
name: codeql/tutorial
|
name: codeql/tutorial
|
||||||
description: Library for the CodeQL detective tutorials, helping new users learn to
|
description: Library for the CodeQL detective tutorials, helping new users learn to
|
||||||
write CodeQL queries.
|
write CodeQL queries.
|
||||||
version: 1.0.52
|
version: 1.0.53-dev
|
||||||
groups: shared
|
groups: shared
|
||||||
library: true
|
library: true
|
||||||
warnOnImplicitThis: true
|
warnOnImplicitThis: true
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user