Merge branch 'main' into dbscheme-and-qlpack-support

This commit is contained in:
Taus
2021-05-31 10:50:39 +02:00
committed by GitHub
5 changed files with 144 additions and 56 deletions

View File

@@ -57,6 +57,9 @@ class AstNode extends TAstNode {
*/
string getAPrimaryQlClass() { result = "???" }
/** Gets the QLDoc comment for this AST node, if any. */
QLDoc getQLDoc() { none() }
/**
* Gets the predicate that contains this AST node.
*/
@@ -77,15 +80,59 @@ class TopLevel extends TTopLevel, AstNode {
* Gets a member from contained in this top-level module.
* Includes private members.
*/
ModuleMember getAMember() {
toGenerated(result) = file.getChild(_).(Generated::ModuleMember).getChild(_)
ModuleMember getAMember() { result = getMember(_) }
/** Gets the `i`'th member of this top-level module. */
ModuleMember getMember(int i) {
toGenerated(result) = file.getChild(i).(Generated::ModuleMember).getChild(_)
}
/** Gets a top-level import in this module. */
Import getAnImport() { result = this.getAMember() }
/** Gets a top-level class in this module. */
Class getAClass() { result = this.getAMember() }
/** Gets a top-level predicate in this module. */
ClasslessPredicate getAPredicate() { result = this.getAMember() }
/** Gets a module defined at the top-level of this module. */
Module getAModule() { result = this.getAMember() }
/** Gets a `newtype` defined at the top-level of this module. */
NewType getANewType() { result = this.getAMember() }
override ModuleMember getAChild(string pred) {
pred = directMember("getAMember") and result = this.getAMember()
pred = directMember("getQLDoc") and result = this.getQLDoc()
or
pred = directMember("getAnImport") and result = this.getAnImport()
or
pred = directMember("getAClass") and result = this.getAClass()
or
pred = directMember("getAPredicate") and result = this.getAPredicate()
or
pred = directMember("getAModule") and result = this.getAModule()
or
pred = directMember("getANewType") and result = this.getANewType()
}
QLDoc getQLDocFor(ModuleMember m) {
exists(int i | i > 0 and result = this.getMember(i) and m = this.getMember(i + 1))
}
override string getAPrimaryQlClass() { result = "TopLevel" }
override QLDoc getQLDoc() { toGenerated(result) = file.getChild(0).getChild(0) }
}
class QLDoc extends TQLDoc, AstNode {
Generated::Qldoc qldoc;
QLDoc() { this = TQLDoc(qldoc) }
string getContents() { result = qldoc.getValue() }
override string getAPrimaryQlClass() { result = "QLDoc" }
}
/**
@@ -137,7 +184,7 @@ class Select extends TSelect, AstNode {
* A QL predicate.
* Either a classless predicate, a class predicate, or a characteristic predicate.
*/
class Predicate extends TPredicate, AstNode {
class Predicate extends TPredicate, AstNode, Declaration {
/**
* Gets the body of the predicate.
*/
@@ -146,7 +193,7 @@ class Predicate extends TPredicate, AstNode {
/**
* Gets the name of the predicate.
*/
string getName() { none() }
override string getName() { none() }
/**
* Gets the `i`th parameter of the predicate.
@@ -391,7 +438,7 @@ class VarDef extends TVarDef, AstNode {
/**
* A variable declaration, with a type and a name.
*/
class VarDecl extends TVarDecl, VarDef {
class VarDecl extends TVarDecl, VarDef, Declaration {
Generated::VarDecl var;
VarDecl() { this = TVarDecl(var) }
@@ -430,6 +477,8 @@ class VarDecl extends TVarDecl, VarDef {
or
pred = directMember("getTypeExpr") and result = this.getTypeExpr()
}
override string toString() { result = this.getName() }
}
/**
@@ -503,6 +552,14 @@ class Module extends TModule, ModuleDeclaration {
toGenerated(result) = mod.getChild(_).(Generated::ModuleMember).getChild(_)
}
AstNode getMember(int i) {
toGenerated(result) = mod.getChild(i).(Generated::ModuleMember).getChild(_)
}
QLDoc getQLDocFor(AstNode m) {
exists(int i | result = this.getMember(i) and m = this.getMember(i + 1))
}
/** Gets the module expression that this module is an alias for, if any. */
ModuleExpr getAlias() {
toGenerated(result) = mod.getAFieldOrChild().(Generated::ModuleAliasBody).getChild()
@@ -530,7 +587,21 @@ class Declaration extends TDeclaration, AstNode {
/** Gets the name of this declaration. */
string getName() { none() }
final override string toString() { result = this.getName() }
override string toString() { result = this.getAPrimaryQlClass() + " " + this.getName() }
override QLDoc getQLDoc() {
result = any(TopLevel m).getQLDocFor(this)
or
result = any(Module m).getQLDocFor(this)
or
result = any(Class c).getQLDocFor(this)
}
override AstNode getAChild(string pred) {
result = super.getAChild(pred)
or
pred = directMember("getQLDoc") and result = this.getQLDoc()
}
}
/** An entity that can be declared in a module. */
@@ -558,6 +629,16 @@ class Class extends TClass, TypeDeclaration, ModuleDeclaration {
toGenerated(result) = cls.getChild(_).(Generated::ClassMember).getChild(_)
}
AstNode getMember(int i) {
toGenerated(result) = cls.getChild(i).(Generated::ClassMember).getChild(_) or
toGenerated(result) =
cls.getChild(i).(Generated::ClassMember).getChild(_).(Generated::Field).getChild()
}
QLDoc getQLDocFor(AstNode m) {
exists(int i | result = this.getMember(i) and m = this.getMember(i + 1))
}
/**
* Gets a predicate in this class.
*/
@@ -669,6 +750,8 @@ class NewTypeBranch extends TNewTypeBranch, TypeDeclaration {
/** Gets the body of this branch. */
Formula getBody() { toGenerated(result) = branch.getChild(_).(Generated::Body).getChild() }
override QLDoc getQLDoc() { toGenerated(result) = branch.getChild(_) }
NewType getNewType() { result.getABranch() = this }
override AstNode getAChild(string pred) {
@@ -677,6 +760,8 @@ class NewTypeBranch extends TNewTypeBranch, TypeDeclaration {
pred = directMember("getBody") and result = this.getBody()
or
exists(int i | pred = indexedMember("getField", i) and result = this.getField(i))
or
pred = directMember("getQLDoc") and result = this.getQLDoc()
}
}

View File

@@ -4,6 +4,7 @@ import TreeSitter
cached
newtype TAstNode =
TTopLevel(Generated::Ql file) or
TQLDoc(Generated::Qldoc qldoc) or
TClasslessPredicate(Generated::ClasslessPredicate pred) or
TVarDecl(Generated::VarDecl decl) or
TClass(Generated::Dataclass dc) or
@@ -118,6 +119,8 @@ Generated::AstNode toGenerated(AST::AstNode n) {
or
n = TTopLevel(result)
or
n = TQLDoc(result)
or
n = TClasslessPredicate(result)
or
n = TVarDecl(result)
@@ -161,9 +164,9 @@ Generated::AstNode toGenerated(AST::AstNode n) {
class TPredicate = TCharPred or TClasslessPredicate or TClassPredicate;
class TModuleMember = TModuleDeclaration or TImport or TSelect;
class TModuleMember = TModuleDeclaration or TImport or TSelect or TQLDoc;
class TDeclaration = TTypeDeclaration or TModuleDeclaration;
class TDeclaration = TTypeDeclaration or TModuleDeclaration or TPredicate or TVarDecl;
class TTypeDeclaration = TClass or TNewType or TNewTypeBranch;

View File

@@ -1,8 +1,8 @@
| Foo.qll:5:26:5:30 | PredicateCall | Foo.qll:3:1:3:26 | foo |
| Foo.qll:10:21:10:25 | PredicateCall | Foo.qll:8:3:8:28 | ClassPredicate |
| Foo.qll:14:30:14:40 | MemberCall | Foo.qll:10:3:10:27 | ClassPredicate |
| Foo.qll:17:27:17:42 | MemberCall | Foo.qll:8:3:8:28 | ClassPredicate |
| Foo.qll:29:5:29:16 | PredicateCall | Foo.qll:20:3:20:54 | myThing2 |
| Foo.qll:29:5:29:16 | PredicateCall | Foo.qll:26:3:26:32 | alias2 |
| Foo.qll:31:5:31:12 | PredicateCall | Foo.qll:22:3:22:32 | myThing0 |
| Foo.qll:31:5:31:12 | PredicateCall | Foo.qll:24:3:24:32 | alias0 |
| Foo.qll:5:26:5:30 | PredicateCall | Foo.qll:3:1:3:26 | ClasslessPredicate foo |
| Foo.qll:10:21:10:25 | PredicateCall | Foo.qll:8:3:8:28 | ClassPredicate bar |
| Foo.qll:14:30:14:40 | MemberCall | Foo.qll:10:3:10:27 | ClassPredicate baz |
| Foo.qll:17:27:17:42 | MemberCall | Foo.qll:8:3:8:28 | ClassPredicate bar |
| Foo.qll:29:5:29:16 | PredicateCall | Foo.qll:20:3:20:54 | ClasslessPredicate myThing2 |
| Foo.qll:29:5:29:16 | PredicateCall | Foo.qll:26:3:26:32 | ClasslessPredicate alias2 |
| Foo.qll:31:5:31:12 | PredicateCall | Foo.qll:22:3:22:32 | ClasslessPredicate myThing0 |
| Foo.qll:31:5:31:12 | PredicateCall | Foo.qll:24:3:24:32 | ClasslessPredicate alias0 |

View File

@@ -3,12 +3,12 @@ nodes
| Foo.qll:1:1:1:17 | Import | semmle.order | 1 |
| Foo.qll:1:1:27:2 | TopLevel | semmle.label | [TopLevel] TopLevel |
| Foo.qll:1:1:27:2 | TopLevel | semmle.order | 1 |
| Foo.qll:3:1:7:1 | Foo | semmle.label | [Class] Foo |
| Foo.qll:3:1:7:1 | Foo | semmle.order | 3 |
| Foo.qll:3:1:7:1 | Class Foo | semmle.label | [Class] Class Foo |
| Foo.qll:3:1:7:1 | Class Foo | semmle.order | 3 |
| Foo.qll:3:19:3:22 | TypeExpr | semmle.label | [TypeExpr] TypeExpr |
| Foo.qll:3:19:3:22 | TypeExpr | semmle.order | 4 |
| Foo.qll:4:3:4:17 | CharPred | semmle.label | [CharPred] CharPred |
| Foo.qll:4:3:4:17 | CharPred | semmle.order | 5 |
| Foo.qll:4:3:4:17 | CharPred Foo | semmle.label | [CharPred] CharPred Foo |
| Foo.qll:4:3:4:17 | CharPred Foo | semmle.order | 5 |
| Foo.qll:4:11:4:11 | Integer | semmle.label | [Integer] Integer |
| Foo.qll:4:11:4:11 | Integer | semmle.order | 6 |
| Foo.qll:4:11:4:15 | ComparisonFormula | semmle.label | [ComparisonFormula] ComparisonFormula |
@@ -19,8 +19,8 @@ nodes
| Foo.qll:4:15:4:15 | Integer | semmle.order | 9 |
| Foo.qll:6:3:6:8 | TypeExpr | semmle.label | [TypeExpr] TypeExpr |
| Foo.qll:6:3:6:8 | TypeExpr | semmle.order | 10 |
| Foo.qll:6:3:6:38 | ClassPredicate | semmle.label | [ClassPredicate] ClassPredicate |
| Foo.qll:6:3:6:38 | ClassPredicate | semmle.order | 10 |
| Foo.qll:6:3:6:38 | ClassPredicate toString | semmle.label | [ClassPredicate] ClassPredicate toString |
| Foo.qll:6:3:6:38 | ClassPredicate toString | semmle.order | 10 |
| Foo.qll:6:23:6:28 | result | semmle.label | [ResultAccess] result |
| Foo.qll:6:23:6:28 | result | semmle.order | 12 |
| Foo.qll:6:23:6:36 | ComparisonFormula | semmle.label | [ComparisonFormula] ComparisonFormula |
@@ -29,8 +29,8 @@ nodes
| Foo.qll:6:30:6:30 | ComparisonOp | semmle.order | 14 |
| Foo.qll:6:32:6:36 | String | semmle.label | [String] String |
| Foo.qll:6:32:6:36 | String | semmle.order | 15 |
| Foo.qll:9:7:11:1 | foo | semmle.label | [ClasslessPredicate] foo |
| Foo.qll:9:7:11:1 | foo | semmle.order | 16 |
| Foo.qll:9:7:11:1 | ClasslessPredicate foo | semmle.label | [ClasslessPredicate] ClasslessPredicate foo |
| Foo.qll:9:7:11:1 | ClasslessPredicate foo | semmle.order | 16 |
| Foo.qll:9:21:9:23 | TypeExpr | semmle.label | [TypeExpr] TypeExpr |
| Foo.qll:9:21:9:23 | TypeExpr | semmle.order | 17 |
| Foo.qll:9:21:9:25 | f | semmle.label | [VarDecl] f |
@@ -65,8 +65,8 @@ nodes
| Foo.qll:10:69:10:73 | inner | semmle.order | 32 |
| Foo.qll:10:69:10:84 | MemberCall | semmle.label | [MemberCall] MemberCall |
| Foo.qll:10:69:10:84 | MemberCall | semmle.order | 32 |
| Foo.qll:13:1:27:1 | calls | semmle.label | [ClasslessPredicate] calls |
| Foo.qll:13:1:27:1 | calls | semmle.order | 34 |
| Foo.qll:13:1:27:1 | ClasslessPredicate calls | semmle.label | [ClasslessPredicate] ClasslessPredicate calls |
| Foo.qll:13:1:27:1 | ClasslessPredicate calls | semmle.order | 34 |
| Foo.qll:13:17:13:19 | TypeExpr | semmle.label | [TypeExpr] TypeExpr |
| Foo.qll:13:17:13:19 | TypeExpr | semmle.order | 35 |
| Foo.qll:13:17:13:21 | f | semmle.label | [VarDecl] f |
@@ -174,42 +174,42 @@ nodes
| printAst.ql:1:1:1:29 | TopLevel | semmle.label | [TopLevel] TopLevel |
| printAst.ql:1:1:1:29 | TopLevel | semmle.order | 86 |
edges
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:1:1:1:17 | Import | semmle.label | getAMember() |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:1:1:1:17 | Import | semmle.label | getAnImport() |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:1:1:1:17 | Import | semmle.order | 1 |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:3:1:7:1 | Foo | semmle.label | getAMember() |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:3:1:7:1 | Foo | semmle.order | 3 |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:9:7:11:1 | foo | semmle.label | getAMember() |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:9:7:11:1 | foo | semmle.order | 16 |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:13:1:27:1 | calls | semmle.label | getAMember() |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:13:1:27:1 | calls | semmle.order | 34 |
| Foo.qll:3:1:7:1 | Foo | Foo.qll:3:19:3:22 | TypeExpr | semmle.label | getASuperType() |
| Foo.qll:3:1:7:1 | Foo | Foo.qll:3:19:3:22 | TypeExpr | semmle.order | 4 |
| Foo.qll:3:1:7:1 | Foo | Foo.qll:4:3:4:17 | CharPred | semmle.label | getCharPred() |
| Foo.qll:3:1:7:1 | Foo | Foo.qll:4:3:4:17 | CharPred | semmle.order | 5 |
| Foo.qll:3:1:7:1 | Foo | Foo.qll:6:3:6:38 | ClassPredicate | semmle.label | getClassPredicate(_) |
| Foo.qll:3:1:7:1 | Foo | Foo.qll:6:3:6:38 | ClassPredicate | semmle.order | 10 |
| Foo.qll:4:3:4:17 | CharPred | Foo.qll:4:11:4:15 | ComparisonFormula | semmle.label | getBody() |
| Foo.qll:4:3:4:17 | CharPred | Foo.qll:4:11:4:15 | ComparisonFormula | semmle.order | 6 |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:3:1:7:1 | Class Foo | semmle.label | getAClass() |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:3:1:7:1 | Class Foo | semmle.order | 3 |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:9:7:11:1 | ClasslessPredicate foo | semmle.label | getAPredicate() |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:9:7:11:1 | ClasslessPredicate foo | semmle.order | 16 |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:13:1:27:1 | ClasslessPredicate calls | semmle.label | getAPredicate() |
| Foo.qll:1:1:27:2 | TopLevel | Foo.qll:13:1:27:1 | ClasslessPredicate calls | semmle.order | 34 |
| Foo.qll:3:1:7:1 | Class Foo | Foo.qll:3:19:3:22 | TypeExpr | semmle.label | getASuperType() |
| Foo.qll:3:1:7:1 | Class Foo | Foo.qll:3:19:3:22 | TypeExpr | semmle.order | 4 |
| Foo.qll:3:1:7:1 | Class Foo | Foo.qll:4:3:4:17 | CharPred Foo | semmle.label | getCharPred() |
| Foo.qll:3:1:7:1 | Class Foo | Foo.qll:4:3:4:17 | CharPred Foo | semmle.order | 5 |
| Foo.qll:3:1:7:1 | Class Foo | Foo.qll:6:3:6:38 | ClassPredicate toString | semmle.label | getClassPredicate(_) |
| Foo.qll:3:1:7:1 | Class Foo | Foo.qll:6:3:6:38 | ClassPredicate toString | semmle.order | 10 |
| Foo.qll:4:3:4:17 | CharPred Foo | Foo.qll:4:11:4:15 | ComparisonFormula | semmle.label | getBody() |
| Foo.qll:4:3:4:17 | CharPred Foo | Foo.qll:4:11:4:15 | ComparisonFormula | semmle.order | 6 |
| Foo.qll:4:11:4:15 | ComparisonFormula | Foo.qll:4:11:4:11 | Integer | semmle.label | getLeftOperand() |
| Foo.qll:4:11:4:15 | ComparisonFormula | Foo.qll:4:11:4:11 | Integer | semmle.order | 6 |
| Foo.qll:4:11:4:15 | ComparisonFormula | Foo.qll:4:13:4:13 | ComparisonOp | semmle.label | getOperator() |
| Foo.qll:4:11:4:15 | ComparisonFormula | Foo.qll:4:13:4:13 | ComparisonOp | semmle.order | 8 |
| Foo.qll:4:11:4:15 | ComparisonFormula | Foo.qll:4:15:4:15 | Integer | semmle.label | getRightOperand() |
| Foo.qll:4:11:4:15 | ComparisonFormula | Foo.qll:4:15:4:15 | Integer | semmle.order | 9 |
| Foo.qll:6:3:6:38 | ClassPredicate | Foo.qll:6:3:6:8 | TypeExpr | semmle.label | getReturnTypeExpr() |
| Foo.qll:6:3:6:38 | ClassPredicate | Foo.qll:6:3:6:8 | TypeExpr | semmle.order | 10 |
| Foo.qll:6:3:6:38 | ClassPredicate | Foo.qll:6:23:6:36 | ComparisonFormula | semmle.label | getBody() |
| Foo.qll:6:3:6:38 | ClassPredicate | Foo.qll:6:23:6:36 | ComparisonFormula | semmle.order | 12 |
| Foo.qll:6:3:6:38 | ClassPredicate toString | Foo.qll:6:3:6:8 | TypeExpr | semmle.label | getReturnTypeExpr() |
| Foo.qll:6:3:6:38 | ClassPredicate toString | Foo.qll:6:3:6:8 | TypeExpr | semmle.order | 10 |
| Foo.qll:6:3:6:38 | ClassPredicate toString | Foo.qll:6:23:6:36 | ComparisonFormula | semmle.label | getBody() |
| Foo.qll:6:3:6:38 | ClassPredicate toString | Foo.qll:6:23:6:36 | ComparisonFormula | semmle.order | 12 |
| Foo.qll:6:23:6:36 | ComparisonFormula | Foo.qll:6:23:6:28 | result | semmle.label | getLeftOperand() |
| Foo.qll:6:23:6:36 | ComparisonFormula | Foo.qll:6:23:6:28 | result | semmle.order | 12 |
| Foo.qll:6:23:6:36 | ComparisonFormula | Foo.qll:6:30:6:30 | ComparisonOp | semmle.label | getOperator() |
| Foo.qll:6:23:6:36 | ComparisonFormula | Foo.qll:6:30:6:30 | ComparisonOp | semmle.order | 14 |
| Foo.qll:6:23:6:36 | ComparisonFormula | Foo.qll:6:32:6:36 | String | semmle.label | getRightOperand() |
| Foo.qll:6:23:6:36 | ComparisonFormula | Foo.qll:6:32:6:36 | String | semmle.order | 15 |
| Foo.qll:9:7:11:1 | foo | Foo.qll:9:21:9:25 | f | semmle.label | getParameter(_) |
| Foo.qll:9:7:11:1 | foo | Foo.qll:9:21:9:25 | f | semmle.order | 17 |
| Foo.qll:9:7:11:1 | foo | Foo.qll:10:3:10:85 | ComparisonFormula | semmle.label | getBody() |
| Foo.qll:9:7:11:1 | foo | Foo.qll:10:3:10:85 | ComparisonFormula | semmle.order | 19 |
| Foo.qll:9:7:11:1 | ClasslessPredicate foo | Foo.qll:9:21:9:25 | f | semmle.label | getParameter(_) |
| Foo.qll:9:7:11:1 | ClasslessPredicate foo | Foo.qll:9:21:9:25 | f | semmle.order | 17 |
| Foo.qll:9:7:11:1 | ClasslessPredicate foo | Foo.qll:10:3:10:85 | ComparisonFormula | semmle.label | getBody() |
| Foo.qll:9:7:11:1 | ClasslessPredicate foo | Foo.qll:10:3:10:85 | ComparisonFormula | semmle.order | 19 |
| Foo.qll:9:21:9:25 | f | Foo.qll:9:21:9:23 | TypeExpr | semmle.label | getTypeExpr() |
| Foo.qll:9:21:9:25 | f | Foo.qll:9:21:9:23 | TypeExpr | semmle.order | 17 |
| Foo.qll:10:3:10:85 | ComparisonFormula | Foo.qll:10:3:10:3 | f | semmle.label | getLeftOperand() |
@@ -240,10 +240,10 @@ edges
| Foo.qll:10:27:10:50 | ComparisonFormula | Foo.qll:10:46:10:50 | String | semmle.order | 30 |
| Foo.qll:10:69:10:84 | MemberCall | Foo.qll:10:69:10:73 | inner | semmle.label | getBase() |
| Foo.qll:10:69:10:84 | MemberCall | Foo.qll:10:69:10:73 | inner | semmle.order | 32 |
| Foo.qll:13:1:27:1 | calls | Foo.qll:13:17:13:21 | f | semmle.label | getParameter(_) |
| Foo.qll:13:1:27:1 | calls | Foo.qll:13:17:13:21 | f | semmle.order | 35 |
| Foo.qll:13:1:27:1 | calls | Foo.qll:14:3:26:14 | Disjunction | semmle.label | getBody() |
| Foo.qll:13:1:27:1 | calls | Foo.qll:14:3:26:14 | Disjunction | semmle.order | 37 |
| Foo.qll:13:1:27:1 | ClasslessPredicate calls | Foo.qll:13:17:13:21 | f | semmle.label | getParameter(_) |
| Foo.qll:13:1:27:1 | ClasslessPredicate calls | Foo.qll:13:17:13:21 | f | semmle.order | 35 |
| Foo.qll:13:1:27:1 | ClasslessPredicate calls | Foo.qll:14:3:26:14 | Disjunction | semmle.label | getBody() |
| Foo.qll:13:1:27:1 | ClasslessPredicate calls | Foo.qll:14:3:26:14 | Disjunction | semmle.order | 37 |
| Foo.qll:13:17:13:21 | f | Foo.qll:13:17:13:19 | TypeExpr | semmle.label | getTypeExpr() |
| Foo.qll:13:17:13:21 | f | Foo.qll:13:17:13:19 | TypeExpr | semmle.order | 35 |
| Foo.qll:14:3:14:10 | PredicateCall | Foo.qll:14:9:14:9 | f | semmle.label | getArgument(_) |
@@ -342,7 +342,7 @@ edges
| Foo.qll:26:3:26:14 | ComparisonFormula | Foo.qll:26:8:26:8 | ComparisonOp | semmle.order | 84 |
| Foo.qll:26:3:26:14 | ComparisonFormula | Foo.qll:26:10:26:14 | Boolean | semmle.label | getRightOperand() |
| Foo.qll:26:3:26:14 | ComparisonFormula | Foo.qll:26:10:26:14 | Boolean | semmle.order | 85 |
| printAst.ql:1:1:1:29 | TopLevel | printAst.ql:1:1:1:28 | Import | semmle.label | getAMember() |
| printAst.ql:1:1:1:29 | TopLevel | printAst.ql:1:1:1:28 | Import | semmle.label | getAnImport() |
| printAst.ql:1:1:1:29 | TopLevel | printAst.ql:1:1:1:28 | Import | semmle.order | 86 |
graphProperties
| semmle.graphKind | tree |

View File

@@ -1 +1 @@
| Test.qll:12:3:12:33 | ClassPredicate | Wrong.test overrides $@ but does not have an override annotation. | Test.qll:4:3:4:40 | ClassPredicate | Super.test |
| Test.qll:12:3:12:33 | ClassPredicate test | Wrong.test overrides $@ but does not have an override annotation. | Test.qll:4:3:4:40 | ClassPredicate test | Super.test |