Skip to content

Commit db33630

Browse files
Add some commonly used QL snippets
1 parent 6830bdd commit db33630

3 files changed

Lines changed: 143 additions & 0 deletions

File tree

extensions/ql-vscode/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
- Better error messages when BQRS interpretation fails to produce SARIF. [#770](https://github.com/github/vscode-codeql/pull/770)
99
- Implement sorting of the query history view by name, date, and results count. [#777](https://github.com/github/vscode-codeql/pull/777)
1010
- Add a configuration option to pass additional arguments to the CLI when running tests. [#785](https://github.com/github/vscode-codeql/pull/785)
11+
- Add some snippets for commonly used QL statements. [#782](https://github.com/github/vscode-codeql/pull/782)
1112

1213
## 1.4.3 - 22 February 2021
1314

extensions/ql-vscode/package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@
106106
"path": "./out/syntaxes/dbscheme.tmLanguage.json"
107107
}
108108
],
109+
"snippets": [
110+
{
111+
"language": "ql",
112+
"path": "./snippets.json"
113+
}
114+
],
109115
"configuration": {
110116
"type": "object",
111117
"title": "CodeQL",

extensions/ql-vscode/snippets.json

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
{
2+
"Query Metadata": {
3+
"prefix": "querymetadata",
4+
"body": [
5+
"/**",
6+
" * @name ${1:$TM_FILENAME_BASE}",
7+
" * @description $2",
8+
" * @kind ${3|problem,path-problem|}",
9+
" * @id ${4:$TM_FILENAME_BASE}",
10+
" * @tags $5",
11+
" */"
12+
],
13+
"description": "Metadata for a query"
14+
},
15+
"Class": {
16+
"prefix": "class",
17+
"body": ["class ${1:ClassName} extends ${2:ParentClass} {", "\t$0", "}"],
18+
"description": "A class"
19+
},
20+
"From/Where/Select": {
21+
"prefix": "from",
22+
"body": ["from ${1:params}", "where ${2:clause}", "select ${3:args}"],
23+
"description": "A from/where/select statement"
24+
},
25+
"Predicate": {
26+
"prefix": "predicate",
27+
"body": ["predicate ${1:name}($2) {", "\t${3:none()}", "}"],
28+
"description": "A predicate"
29+
},
30+
"Dataflow Tracking Class": {
31+
"prefix": "dataflowtracking",
32+
"body": [
33+
"class ${1:ClassName} extends DataFlow::Configuration {",
34+
"\t$1() { this = \"$1\" }",
35+
"\t",
36+
"\toverride predicate isSource(DataFlow::Node node) {",
37+
"\t\t${2:none()}",
38+
"\t}",
39+
"\t",
40+
"\toverride predicate isSink(DataFlow::Node node) {",
41+
"\t\t${3:none()}",
42+
"\t}",
43+
"}"
44+
],
45+
"description": "Boilerplate for a dataflow tracking class"
46+
},
47+
"Taint Tracking Class": {
48+
"prefix": "tainttracking",
49+
"body": [
50+
"class ${1:ClassName} extends TaintTracking::Configuration {",
51+
"\t$1() { this = \"$1\" }",
52+
"\t",
53+
"\toverride predicate isSource(DataFlow::Node node) {",
54+
"\t\t${2:none()}",
55+
"\t}",
56+
"\t",
57+
"\toverride predicate isSink(DataFlow::Node node) {",
58+
"\t\t${3:none()}",
59+
"\t}",
60+
"}"
61+
],
62+
"description": "Boilerplate for a taint tracking class"
63+
},
64+
"Count": {
65+
"prefix": "count",
66+
"body": ["count(${1:variables} | ${2:formula} | ${3:expression})"],
67+
"description": "A count aggregate"
68+
},
69+
"Max": {
70+
"prefix": "max",
71+
"body": ["max(${1:variables} | ${2:formula} | ${3:expression})"],
72+
"description": "A max aggregate"
73+
},
74+
"Min": {
75+
"prefix": "min",
76+
"body": ["min(${1:variables} | ${2:formula} | ${3:expression})"],
77+
"description": "A min aggregate"
78+
},
79+
"Average": {
80+
"prefix": "avg",
81+
"body": ["avg(${1:variables} | ${2:formula} | ${3:expression})"],
82+
"description": "An average aggregate"
83+
},
84+
"Sum": {
85+
"prefix": "sum",
86+
"body": ["sum(${1:variables} | ${2:formula} | ${3:expression})"],
87+
"description": "A sum aggregate"
88+
},
89+
"Concatenation": {
90+
"prefix": "concat",
91+
"body": ["concat(${1:variables} | ${2:formula} | ${3:expression})"],
92+
"description": "A concatenation aggregate"
93+
},
94+
"Rank": {
95+
"prefix": "rank",
96+
"body": [
97+
"rank[${1:position}](${2:variables} | ${3:formula} | ${4:expression})"
98+
],
99+
"description": "A rank aggregate"
100+
},
101+
"Strict Sum": {
102+
"prefix": "strictsum",
103+
"body": ["strictsum(${1:variables} | ${2:formula} | ${3:expression})"],
104+
"description": "A strict sum aggregate"
105+
},
106+
"Strict Concatenation": {
107+
"prefix": "strictconcat",
108+
"body": ["strictconcat(${1:variables} | ${2:formula} | ${3:expression})"],
109+
"description": "A strict concatenation aggregate"
110+
},
111+
"Strict Count": {
112+
"prefix": "strictcount",
113+
"body": ["strictcount(${1:variables} | ${2:formula} | ${3:expression})"],
114+
"description": "A strict count aggregate"
115+
},
116+
"Unique": {
117+
"prefix": "unique",
118+
"body": ["unique(${1:variables} | ${2:formula} | ${3:expression})"],
119+
"description": "A unique aggregate"
120+
},
121+
"Exists": {
122+
"prefix": "exists",
123+
"body": ["exists(${1:variables} | ${2:formula} | ${3:expression})"],
124+
"description": "An exists quantifier"
125+
},
126+
"For All": {
127+
"prefix": "forall",
128+
"body": ["forall(${1:variables} | ${2:formula} | ${3:expression})"],
129+
"description": "A for all quantifier"
130+
},
131+
"For All and Exists": {
132+
"prefix": "forex",
133+
"body": ["forex(${1:variables} | ${2:formula} | ${3:expression})"],
134+
"description": "A for all and exists quantifier"
135+
}
136+
}

0 commit comments

Comments
 (0)