Skip to content

Commit 22e4606

Browse files
authored
QL: Merge pull request #34 from github/dbscheme-and-qlpack-support
Add support for dbscheme and qlpack.yml
2 parents 17ef056 + cbd0caa commit 22e4606

13 files changed

Lines changed: 573 additions & 101 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

extractor/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ edition = "2018"
1010
flate2 = "1.0"
1111
node-types = { path = "../node-types" }
1212
tree-sitter = "0.19"
13-
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "ef46f6c4c076cc06bb206686794cec26b5c544a7" }
13+
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "e08901378e2fd5c33f1e88bbb59716fd36f094f7" }
1414
clap = "2.33"
1515
tracing = "0.1"
1616
tracing-subscriber = { version = "0.2", features = ["env-filter"] }

generator/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ edition = "2018"
1010
node-types = { path = "../node-types" }
1111
tracing = "0.1"
1212
tracing-subscriber = { version = "0.2", features = ["env-filter"] }
13-
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "ef46f6c4c076cc06bb206686794cec26b5c544a7" }
13+
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "e08901378e2fd5c33f1e88bbb59716fd36f094f7" }

ql/src/codeql_ql/ast/Ast.qll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ class TopLevel extends TTopLevel, AstNode {
8282
*/
8383
ModuleMember getAMember() { result = getMember(_) }
8484

85-
ModuleMember getMember(int i) { toGenerated(result) = file.getChild(i).getChild(_) }
85+
/** Gets the `i`'th member of this top-level module. */
86+
ModuleMember getMember(int i) {
87+
toGenerated(result) = file.getChild(i).(Generated::ModuleMember).getChild(_)
88+
}
8689

8790
/** Gets a top-level import in this module. */
8891
Import getAnImport() { result = this.getAMember() }
@@ -119,7 +122,7 @@ class TopLevel extends TTopLevel, AstNode {
119122

120123
override string getAPrimaryQlClass() { result = "TopLevel" }
121124

122-
override QLDoc getQLDoc() { toGenerated(result) = file.getChild(0).getChild(0) }
125+
override QLDoc getQLDoc() { result = this.getMember(0) }
123126
}
124127

125128
class QLDoc extends TQLDoc, AstNode {

ql/src/codeql_ql/ast/internal/Module.qll

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ private class File_ extends FileOrModule, TFile {
2828

2929
override ContainerOrModule getEnclosing() { result = TFolder(f.getParentContainer()) }
3030

31-
override string getName() { result = f.getStem() }
31+
override string getName() { result = f.getStem().replaceAll(" ", "_") }
3232

3333
override string toString() { result = f.toString() }
3434

@@ -48,9 +48,13 @@ private class Folder_ extends ContainerOrModule, TFolder {
4848

4949
Folder_() { this = TFolder(f) }
5050

51-
override ContainerOrModule getEnclosing() { result = TFolder(f.getParentContainer()) }
51+
override ContainerOrModule getEnclosing() {
52+
result = TFolder(f.getParentContainer()) and
53+
// if this the the root, then we stop.
54+
not exists(f.getFile("qlpack.yml"))
55+
}
5256

53-
override string getName() { result = f.getStem() }
57+
override string getName() { result = f.getStem().replaceAll(" ", "_") }
5458

5559
override string toString() { result = f.toString() }
5660

@@ -63,6 +67,11 @@ private class Folder_ extends ContainerOrModule, TFolder {
6367
endline = 0 and
6468
endcolumn = 0
6569
}
70+
71+
/**
72+
* Gets the folder that this IPA type represents.
73+
*/
74+
Folder getFolder() { result = f }
6675
}
6776

6877
// TODO: Use `AstNode::getParent` once it is total
@@ -108,6 +117,7 @@ private predicate resolveQualifiedName(Import imp, ContainerOrModule m, int i) {
108117
exists(Container c, Container parent |
109118
// should ideally look at `qlpack.yml` files
110119
parent = imp.getLocation().getFile().getParentContainer+() and
120+
exists(parent.getFile("qlpack.yml")) and
111121
c.getParentContainer() = parent and
112122
q = m.getName()
113123
|
@@ -116,7 +126,17 @@ private predicate resolveQualifiedName(Import imp, ContainerOrModule m, int i) {
116126
m = TFolder(c)
117127
)
118128
or
119-
definesModule(getEnclosingModule(imp).getEnclosing*(), q, m, _)
129+
q = imp.getQualifiedName(i) and
130+
exists(ContainerOrModule container | container = getEnclosingModule(imp).getEnclosing+() |
131+
definesModule(container, q, m, _) and
132+
(
133+
exists(container.(Folder_).getFolder().getFile("qlpack.yml")) or
134+
container.(Folder_).getFolder() = imp.getLocation().getFile().getParentContainer() or
135+
not container instanceof Folder_
136+
)
137+
)
138+
or
139+
definesModule(getEnclosingModule(imp), q, m, _)
120140
)
121141
or
122142
exists(Folder_ mid |
@@ -166,13 +186,21 @@ private module Cached {
166186
predicate resolveModuleExpr(ModuleExpr me, FileOrModule m) {
167187
not m = TFile(any(File f | f.getExtension() = "ql")) and
168188
not exists(me.getQualifier()) and
169-
definesModule(getEnclosingModule(me).getEnclosing*(), me.getName(), m, _)
189+
exists(ContainerOrModule enclosing, string name | resolveModuleExprHelper(me, enclosing, name) |
190+
definesModule(enclosing.getEnclosing*(), name, m, _)
191+
)
170192
or
171193
exists(FileOrModule mid |
172194
resolveModuleExpr(me.getQualifier(), mid) and
173195
definesModule(mid, me.getName(), m, true)
174196
)
175197
}
198+
199+
pragma[noinline]
200+
private predicate resolveModuleExprHelper(ModuleExpr me, ContainerOrModule enclosing, string name) {
201+
enclosing = getEnclosingModule(me) and
202+
name = me.getName()
203+
}
176204
}
177205

178206
import Cached

0 commit comments

Comments
 (0)