diff --git a/ql/src/codeql_ql/ast/Ast.qll b/ql/src/codeql_ql/ast/Ast.qll index 920bc757cfa..dad0dec9ae9 100644 --- a/ql/src/codeql_ql/ast/Ast.qll +++ b/ql/src/codeql_ql/ast/Ast.qll @@ -16,15 +16,6 @@ private string stringIndexedMember(string name, string index) { result = name + "(_)" and exists(index) } -/** - * Holds if `node` has an annotation with `name`. - */ -private predicate hasAnnotation(AstNode node, string name) { - exists(Generated::Annotation annotation | annotation.getName().getValue() = name | - toGenerated(node).getParent() = annotation.getParent() - ) -} - /** An AST node of a QL program */ class AstNode extends TAstNode { string toString() { result = getAPrimaryQlClass() } @@ -60,6 +51,12 @@ class AstNode extends TAstNode { /** Gets the QLDoc comment for this AST node, if any. */ QLDoc getQLDoc() { none() } + /** Holds if `node` has an annotation with `name`. */ + predicate hasAnnotation(string name) { this.getAnAnnotation().getName() = name } + + /** Gets an annotation of this AST node. */ + Annotation getAnAnnotation() { toGenerated(this).getParent() = toGenerated(result).getParent() } + /** * Gets the predicate that contains this AST node. */ @@ -400,12 +397,12 @@ class ClassPredicate extends TClassPredicate, Predicate { /** * Holds if this predicate is private. */ - predicate isPrivate() { hasAnnotation(this, "private") } + predicate isPrivate() { hasAnnotation("private") } /** * Holds if this predicate is annotated as overriding another predicate. */ - predicate isOverride() { hasAnnotation(this, "override") } + predicate isOverride() { hasAnnotation("override") } override VarDecl getParameter(int i) { toGenerated(result) = @@ -618,7 +615,7 @@ class Module extends TModule, ModuleDeclaration { */ class ModuleMember extends TModuleMember, AstNode { /** Holds if this member is declared as `private`. */ - predicate isPrivate() { hasAnnotation(this, "private") } + predicate isPrivate() { hasAnnotation("private") } } /** A declaration. E.g. a class, type, predicate, newtype... */ @@ -2090,6 +2087,112 @@ class ModuleExpr extends TModuleExpr, ModuleRef { } } +/** An argument to an annotation. */ +private class AnnotationArg extends TAnnotationArg, AstNode { + Generated::AnnotArg arg; + + AnnotationArg() { this = TAnnotationArg(arg) } + + /** Gets the name of this argument. */ + string getValue() { + result = + [ + arg.getChild().(Generated::SimpleId).getValue(), + arg.getChild().(Generated::Result).getValue(), arg.getChild().(Generated::This).getValue() + ] + } + + override string toString() { result = this.getValue() } +} + +private class NoInlineArg extends AnnotationArg { + NoInlineArg() { this.getValue() = "noinline" } +} + +private class NoMagicArg extends AnnotationArg { + NoMagicArg() { this.getValue() = "nomagic" } +} + +private class InlineArg extends AnnotationArg { + InlineArg() { this.getValue() = "inline" } +} + +private class NoOptArg extends AnnotationArg { + NoOptArg() { this.getValue() = "noopt" } +} + +private class MonotonicAggregatesArg extends AnnotationArg { + MonotonicAggregatesArg() { this.getValue() = "monotonicAggregates" } +} + +/** An annotation on an element. */ +class Annotation extends TAnnotation, AstNode { + Generated::Annotation annot; + + Annotation() { this = TAnnotation(annot) } + + override string toString() { result = "annotation" } + + override string getAPrimaryQlClass() { result = "Annotation" } + + override Location getLocation() { result = annot.getLocation() } + + /** Gets the node corresponding to the field `args`. */ + AnnotationArg getArgs(int i) { toGenerated(result) = annot.getArgs(i) } + + /** Gets the node corresponding to the field `name`. */ + string getName() { result = annot.getName().getValue() } +} + +/** A `pragma[noinline]` annotation. */ +class NoInline extends Annotation { + NoInline() { this.getArgs(0) instanceof NoInlineArg } + + override string toString() { result = "noinline" } +} + +/** A `pragma[inline]` annotation. */ +class Inline extends Annotation { + Inline() { this.getArgs(0) instanceof InlineArg } + + override string toString() { result = "inline" } +} + +/** A `pragma[nomagic]` annotation. */ +class NoMagic extends Annotation { + NoMagic() { this.getArgs(0) instanceof NoMagicArg } + + override string toString() { result = "nomagic" } +} + +/** A `pragma[noopt]` annotation. */ +class NoOpt extends Annotation { + NoOpt() { this.getArgs(0) instanceof NoOptArg } + + override string toString() { result = "noopt" } +} + +/** A `language[monotonicAggregates]` annotation. */ +class MonotonicAggregates extends Annotation { + MonotonicAggregates() { this.getArgs(0) instanceof MonotonicAggregatesArg } + + override string toString() { result = "monotonicaggregates" } +} + +/** A `bindingset` annotation. */ +class BindingSet extends Annotation { + BindingSet() { this.getName() = "bindingset" } + + /** Gets the `index`'th bound name in this bindingset. */ + string getBoundName(int index) { result = this.getArgs(index).getValue() } + + /** Gets a name bound by this bindingset, if any. */ + string getABoundName() { result = getBoundName(_) } + + /** Gets the number of names bound by this bindingset. */ + int getNumberOfBoundNames() { result = count(getABoundName()) } +} + /** * Classes modelling YAML AST nodes. */ diff --git a/ql/src/codeql_ql/ast/internal/AstNodes.qll b/ql/src/codeql_ql/ast/internal/AstNodes.qll index baddce8b8e0..5aeffd620ad 100644 --- a/ql/src/codeql_ql/ast/internal/AstNodes.qll +++ b/ql/src/codeql_ql/ast/internal/AstNodes.qll @@ -59,6 +59,8 @@ newtype TAstNode = TDontCare(Generated::Underscore dontcare) or TModuleExpr(Generated::ModuleExpr me) or TPredicateExpr(Generated::PredicateExpr pe) or + TAnnotation(Generated::Annotation annot) or + TAnnotationArg(Generated::AnnotArg arg) or TYamlCommemt(Generated::YamlComment yc) or TYamlEntry(Generated::YamlEntry ye) or TYamlKey(Generated::YamlKey yk) or @@ -184,6 +186,10 @@ Generated::AstNode toGenerated(AST::AstNode n) { n = TAnyCall(result) or n = TSuper(result) + or + n = TAnnotation(result) + or + n = TAnnotationArg(result) } class TPredicate = TCharPred or TClasslessPredicate or TClassPredicate or TDBRelation; diff --git a/ql/src/queries/performance/MissingNoinline.ql b/ql/src/queries/performance/MissingNoinline.ql new file mode 100644 index 00000000000..bd20ee9e459 --- /dev/null +++ b/ql/src/queries/performance/MissingNoinline.ql @@ -0,0 +1,23 @@ +/** + * @name Missing `noinline` or `nomagic` annotation + * @description When a predicate is factored out to improve join-ordering, it should be marked as `noinline` or `nomagic`. + * @kind problem + * @problem.severity error + * @id ql/missing-noinline + * @tags performance + * @precision high + */ + +import ql + +from QLDoc doc, Predicate decl +where + doc.getContents().matches(["%join order%", "%join-order%"]) and + decl.getQLDoc() = doc and + not decl.getAnAnnotation() instanceof NoInline and + not decl.getAnAnnotation() instanceof NoMagic and + not decl.getAnAnnotation() instanceof NoOpt and + // If it's marked as inline it's probably because the QLDoc says something like + // "this predicate is inlined because it gives a better join-order". + not decl.getAnAnnotation() instanceof Inline +select decl, "This predicate might be inlined." diff --git a/ql/test/printAst/printAst.expected b/ql/test/printAst/printAst.expected index 5b484e1008d..bdb784cb67d 100644 --- a/ql/test/printAst/printAst.expected +++ b/ql/test/printAst/printAst.expected @@ -29,159 +29,161 @@ 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:1:9:5 | annotation | semmle.label | [Annotation] annotation | +| Foo.qll:9:1:9:5 | annotation | 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:7:11:1 | ClasslessPredicate foo | semmle.order | 17 | | 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:23 | TypeExpr | semmle.order | 18 | | Foo.qll:9:21:9:25 | f | semmle.label | [VarDecl] f | -| Foo.qll:9:21:9:25 | f | semmle.order | 17 | +| Foo.qll:9:21:9:25 | f | semmle.order | 18 | | Foo.qll:10:3:10:3 | f | semmle.label | [VarAccess] f | -| Foo.qll:10:3:10:3 | f | semmle.order | 19 | +| Foo.qll:10:3:10:3 | f | semmle.order | 20 | | Foo.qll:10:3:10:85 | ComparisonFormula | semmle.label | [ComparisonFormula] ComparisonFormula | -| Foo.qll:10:3:10:85 | ComparisonFormula | semmle.order | 19 | +| Foo.qll:10:3:10:85 | ComparisonFormula | semmle.order | 20 | | Foo.qll:10:5:10:5 | ComparisonOp | semmle.label | [ComparisonOp] ComparisonOp | -| Foo.qll:10:5:10:5 | ComparisonOp | semmle.order | 21 | +| Foo.qll:10:5:10:5 | ComparisonOp | semmle.order | 22 | | Foo.qll:10:7:10:85 | Rank | semmle.label | [Rank] Rank | -| Foo.qll:10:7:10:85 | Rank | semmle.order | 22 | +| Foo.qll:10:7:10:85 | Rank | semmle.order | 23 | | Foo.qll:10:12:10:12 | Integer | semmle.label | [Integer] Integer | -| Foo.qll:10:12:10:12 | Integer | semmle.order | 23 | +| Foo.qll:10:12:10:12 | Integer | semmle.order | 24 | | Foo.qll:10:15:10:17 | TypeExpr | semmle.label | [TypeExpr] TypeExpr | -| Foo.qll:10:15:10:17 | TypeExpr | semmle.order | 24 | +| Foo.qll:10:15:10:17 | TypeExpr | semmle.order | 25 | | Foo.qll:10:15:10:23 | inner | semmle.label | [VarDecl] inner | -| Foo.qll:10:15:10:23 | inner | semmle.order | 24 | +| Foo.qll:10:15:10:23 | inner | semmle.order | 25 | | Foo.qll:10:27:10:31 | inner | semmle.label | [VarAccess] inner | -| Foo.qll:10:27:10:31 | inner | semmle.order | 26 | +| Foo.qll:10:27:10:31 | inner | semmle.order | 27 | | Foo.qll:10:27:10:42 | MemberCall | semmle.label | [MemberCall] MemberCall | -| Foo.qll:10:27:10:42 | MemberCall | semmle.order | 26 | +| Foo.qll:10:27:10:42 | MemberCall | semmle.order | 27 | | Foo.qll:10:27:10:50 | ComparisonFormula | semmle.label | [ComparisonFormula] ComparisonFormula | -| Foo.qll:10:27:10:50 | ComparisonFormula | semmle.order | 26 | +| Foo.qll:10:27:10:50 | ComparisonFormula | semmle.order | 27 | | Foo.qll:10:44:10:44 | ComparisonOp | semmle.label | [ComparisonOp] ComparisonOp | -| Foo.qll:10:44:10:44 | ComparisonOp | semmle.order | 29 | +| Foo.qll:10:44:10:44 | ComparisonOp | semmle.order | 30 | | Foo.qll:10:46:10:50 | String | semmle.label | [String] String | -| Foo.qll:10:46:10:50 | String | semmle.order | 30 | +| Foo.qll:10:46:10:50 | String | semmle.order | 31 | | Foo.qll:10:54:10:58 | inner | semmle.label | [VarAccess] inner | -| Foo.qll:10:54:10:58 | inner | semmle.order | 31 | +| Foo.qll:10:54:10:58 | inner | semmle.order | 32 | | Foo.qll:10:69:10:73 | inner | semmle.label | [VarAccess] inner | -| Foo.qll:10:69:10:73 | inner | semmle.order | 32 | +| Foo.qll:10:69:10:73 | inner | semmle.order | 33 | | Foo.qll:10:69:10:84 | MemberCall | semmle.label | [MemberCall] MemberCall | -| Foo.qll:10:69:10:84 | MemberCall | semmle.order | 32 | +| Foo.qll:10:69:10:84 | MemberCall | semmle.order | 33 | | 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:1:27:1 | ClasslessPredicate calls | semmle.order | 35 | | 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:19 | TypeExpr | semmle.order | 36 | | Foo.qll:13:17:13:21 | f | semmle.label | [VarDecl] f | -| Foo.qll:13:17:13:21 | f | semmle.order | 35 | +| Foo.qll:13:17:13:21 | f | semmle.order | 36 | | Foo.qll:14:3:14:10 | PredicateCall | semmle.label | [PredicateCall] PredicateCall | -| Foo.qll:14:3:14:10 | PredicateCall | semmle.order | 37 | +| Foo.qll:14:3:14:10 | PredicateCall | semmle.order | 38 | | Foo.qll:14:3:16:29 | Disjunction | semmle.label | [Disjunction] Disjunction | -| Foo.qll:14:3:16:29 | Disjunction | semmle.order | 37 | +| Foo.qll:14:3:16:29 | Disjunction | semmle.order | 38 | | Foo.qll:14:3:18:28 | Disjunction | semmle.label | [Disjunction] Disjunction | -| Foo.qll:14:3:18:28 | Disjunction | semmle.order | 37 | +| Foo.qll:14:3:18:28 | Disjunction | semmle.order | 38 | | Foo.qll:14:3:20:13 | Disjunction | semmle.label | [Disjunction] Disjunction | -| Foo.qll:14:3:20:13 | Disjunction | semmle.order | 37 | +| Foo.qll:14:3:20:13 | Disjunction | semmle.order | 38 | | Foo.qll:14:3:22:16 | Disjunction | semmle.label | [Disjunction] Disjunction | -| Foo.qll:14:3:22:16 | Disjunction | semmle.order | 37 | +| Foo.qll:14:3:22:16 | Disjunction | semmle.order | 38 | | Foo.qll:14:3:24:23 | Disjunction | semmle.label | [Disjunction] Disjunction | -| Foo.qll:14:3:24:23 | Disjunction | semmle.order | 37 | +| Foo.qll:14:3:24:23 | Disjunction | semmle.order | 38 | | Foo.qll:14:3:26:14 | Disjunction | semmle.label | [Disjunction] Disjunction | -| Foo.qll:14:3:26:14 | Disjunction | semmle.order | 37 | +| Foo.qll:14:3:26:14 | Disjunction | semmle.order | 38 | | Foo.qll:14:9:14:9 | f | semmle.label | [VarAccess] f | -| Foo.qll:14:9:14:9 | f | semmle.order | 44 | +| Foo.qll:14:9:14:9 | f | semmle.order | 45 | | Foo.qll:16:3:16:7 | String | semmle.label | [String] String | -| Foo.qll:16:3:16:7 | String | semmle.order | 45 | +| Foo.qll:16:3:16:7 | String | semmle.order | 46 | | Foo.qll:16:3:16:29 | ComparisonFormula | semmle.label | [ComparisonFormula] ComparisonFormula | -| Foo.qll:16:3:16:29 | ComparisonFormula | semmle.order | 45 | +| Foo.qll:16:3:16:29 | ComparisonFormula | semmle.order | 46 | | Foo.qll:16:9:16:9 | ComparisonOp | semmle.label | [ComparisonOp] ComparisonOp | -| Foo.qll:16:9:16:9 | ComparisonOp | semmle.order | 47 | +| Foo.qll:16:9:16:9 | ComparisonOp | semmle.order | 48 | | Foo.qll:16:11:16:11 | f | semmle.label | [VarAccess] f | -| Foo.qll:16:11:16:11 | f | semmle.order | 48 | +| Foo.qll:16:11:16:11 | f | semmle.order | 49 | | Foo.qll:16:11:16:29 | MemberCall | semmle.label | [MemberCall] MemberCall | -| Foo.qll:16:11:16:29 | MemberCall | semmle.order | 48 | +| Foo.qll:16:11:16:29 | MemberCall | semmle.order | 49 | | Foo.qll:16:22:16:22 | Integer | semmle.label | [Integer] Integer | -| Foo.qll:16:22:16:22 | Integer | semmle.order | 50 | +| Foo.qll:16:22:16:22 | Integer | semmle.order | 51 | | Foo.qll:16:25:16:25 | Integer | semmle.label | [Integer] Integer | -| Foo.qll:16:25:16:25 | Integer | semmle.order | 51 | +| Foo.qll:16:25:16:25 | Integer | semmle.order | 52 | | Foo.qll:16:28:16:28 | Integer | semmle.label | [Integer] Integer | -| Foo.qll:16:28:16:28 | Integer | semmle.order | 52 | +| Foo.qll:16:28:16:28 | Integer | semmle.order | 53 | | Foo.qll:18:3:18:3 | f | semmle.label | [VarAccess] f | -| Foo.qll:18:3:18:3 | f | semmle.order | 53 | +| Foo.qll:18:3:18:3 | f | semmle.order | 54 | | Foo.qll:18:3:18:9 | InlineCast | semmle.label | [InlineCast] InlineCast | -| Foo.qll:18:3:18:9 | InlineCast | semmle.order | 53 | +| Foo.qll:18:3:18:9 | InlineCast | semmle.order | 54 | | Foo.qll:18:3:18:20 | MemberCall | semmle.label | [MemberCall] MemberCall | -| Foo.qll:18:3:18:20 | MemberCall | semmle.order | 53 | +| Foo.qll:18:3:18:20 | MemberCall | semmle.order | 54 | | Foo.qll:18:3:18:28 | ComparisonFormula | semmle.label | [ComparisonFormula] ComparisonFormula | -| Foo.qll:18:3:18:28 | ComparisonFormula | semmle.order | 53 | +| Foo.qll:18:3:18:28 | ComparisonFormula | semmle.order | 54 | | Foo.qll:18:6:18:8 | TypeExpr | semmle.label | [TypeExpr] TypeExpr | -| Foo.qll:18:6:18:8 | TypeExpr | semmle.order | 57 | +| Foo.qll:18:6:18:8 | TypeExpr | semmle.order | 58 | | Foo.qll:18:22:18:22 | ComparisonOp | semmle.label | [ComparisonOp] ComparisonOp | -| Foo.qll:18:22:18:22 | ComparisonOp | semmle.order | 58 | +| Foo.qll:18:22:18:22 | ComparisonOp | semmle.order | 59 | | Foo.qll:18:24:18:28 | String | semmle.label | [String] String | -| Foo.qll:18:24:18:28 | String | semmle.order | 59 | +| Foo.qll:18:24:18:28 | String | semmle.order | 60 | | Foo.qll:20:3:20:3 | f | semmle.label | [VarAccess] f | -| Foo.qll:20:3:20:3 | f | semmle.order | 60 | +| Foo.qll:20:3:20:3 | f | semmle.order | 61 | | Foo.qll:20:3:20:9 | InlineCast | semmle.label | [InlineCast] InlineCast | -| Foo.qll:20:3:20:9 | InlineCast | semmle.order | 60 | +| Foo.qll:20:3:20:9 | InlineCast | semmle.order | 61 | | Foo.qll:20:3:20:13 | ComparisonFormula | semmle.label | [ComparisonFormula] ComparisonFormula | -| Foo.qll:20:3:20:13 | ComparisonFormula | semmle.order | 60 | +| Foo.qll:20:3:20:13 | ComparisonFormula | semmle.order | 61 | | Foo.qll:20:6:20:8 | TypeExpr | semmle.label | [TypeExpr] TypeExpr | -| Foo.qll:20:6:20:8 | TypeExpr | semmle.order | 63 | +| Foo.qll:20:6:20:8 | TypeExpr | semmle.order | 64 | | Foo.qll:20:11:20:11 | ComparisonOp | semmle.label | [ComparisonOp] ComparisonOp | -| Foo.qll:20:11:20:11 | ComparisonOp | semmle.order | 64 | +| Foo.qll:20:11:20:11 | ComparisonOp | semmle.order | 65 | | Foo.qll:20:13:20:13 | f | semmle.label | [VarAccess] f | -| Foo.qll:20:13:20:13 | f | semmle.order | 65 | +| Foo.qll:20:13:20:13 | f | semmle.order | 66 | | Foo.qll:22:3:22:3 | f | semmle.label | [VarAccess] f | -| Foo.qll:22:3:22:3 | f | semmle.order | 66 | +| Foo.qll:22:3:22:3 | f | semmle.order | 67 | | Foo.qll:22:3:22:16 | ComparisonFormula | semmle.label | [ComparisonFormula] ComparisonFormula | -| Foo.qll:22:3:22:16 | ComparisonFormula | semmle.order | 66 | +| Foo.qll:22:3:22:16 | ComparisonFormula | semmle.order | 67 | | Foo.qll:22:5:22:5 | ComparisonOp | semmle.label | [ComparisonOp] ComparisonOp | -| Foo.qll:22:5:22:5 | ComparisonOp | semmle.order | 68 | +| Foo.qll:22:5:22:5 | ComparisonOp | semmle.order | 69 | | Foo.qll:22:7:22:16 | FullAggregate[any] | semmle.label | [FullAggregate[any]] FullAggregate[any] | -| Foo.qll:22:7:22:16 | FullAggregate[any] | semmle.order | 69 | +| Foo.qll:22:7:22:16 | FullAggregate[any] | semmle.order | 70 | | Foo.qll:22:11:22:13 | TypeExpr | semmle.label | [TypeExpr] TypeExpr | -| Foo.qll:22:11:22:13 | TypeExpr | semmle.order | 70 | +| Foo.qll:22:11:22:13 | TypeExpr | semmle.order | 71 | | Foo.qll:22:11:22:15 | f | semmle.label | [VarDecl] f | -| Foo.qll:22:11:22:15 | f | semmle.order | 70 | +| Foo.qll:22:11:22:15 | f | semmle.order | 71 | | Foo.qll:24:3:24:3 | Integer | semmle.label | [Integer] Integer | -| Foo.qll:24:3:24:3 | Integer | semmle.order | 72 | +| Foo.qll:24:3:24:3 | Integer | semmle.order | 73 | | Foo.qll:24:3:24:23 | ComparisonFormula | semmle.label | [ComparisonFormula] ComparisonFormula | -| Foo.qll:24:3:24:23 | ComparisonFormula | semmle.order | 72 | +| Foo.qll:24:3:24:23 | ComparisonFormula | semmle.order | 73 | | Foo.qll:24:5:24:5 | ComparisonOp | semmle.label | [ComparisonOp] ComparisonOp | -| Foo.qll:24:5:24:5 | ComparisonOp | semmle.order | 74 | +| Foo.qll:24:5:24:5 | ComparisonOp | semmle.order | 75 | | Foo.qll:24:7:24:7 | Integer | semmle.label | [Integer] Integer | -| Foo.qll:24:7:24:7 | Integer | semmle.order | 75 | +| Foo.qll:24:7:24:7 | Integer | semmle.order | 76 | | Foo.qll:24:7:24:23 | AddExpr | semmle.label | [AddExpr] AddExpr | -| Foo.qll:24:7:24:23 | AddExpr | semmle.order | 75 | +| Foo.qll:24:7:24:23 | AddExpr | semmle.order | 76 | | Foo.qll:24:12:24:12 | Integer | semmle.label | [Integer] Integer | -| Foo.qll:24:12:24:12 | Integer | semmle.order | 77 | +| Foo.qll:24:12:24:12 | Integer | semmle.order | 78 | | Foo.qll:24:12:24:22 | AddExpr | semmle.label | [AddExpr] AddExpr | -| Foo.qll:24:12:24:22 | AddExpr | semmle.order | 77 | +| Foo.qll:24:12:24:22 | AddExpr | semmle.order | 78 | | Foo.qll:24:17:24:17 | Integer | semmle.label | [Integer] Integer | -| Foo.qll:24:17:24:17 | Integer | semmle.order | 79 | +| Foo.qll:24:17:24:17 | Integer | semmle.order | 80 | | Foo.qll:24:17:24:21 | AddExpr | semmle.label | [AddExpr] AddExpr | -| Foo.qll:24:17:24:21 | AddExpr | semmle.order | 79 | +| Foo.qll:24:17:24:21 | AddExpr | semmle.order | 80 | | Foo.qll:24:21:24:21 | Integer | semmle.label | [Integer] Integer | -| Foo.qll:24:21:24:21 | Integer | semmle.order | 81 | +| Foo.qll:24:21:24:21 | Integer | semmle.order | 82 | | Foo.qll:26:3:26:6 | Boolean | semmle.label | [Boolean] Boolean | -| Foo.qll:26:3:26:6 | Boolean | semmle.order | 82 | +| Foo.qll:26:3:26:6 | Boolean | semmle.order | 83 | | Foo.qll:26:3:26:14 | ComparisonFormula | semmle.label | [ComparisonFormula] ComparisonFormula | -| Foo.qll:26:3:26:14 | ComparisonFormula | semmle.order | 82 | +| Foo.qll:26:3:26:14 | ComparisonFormula | semmle.order | 83 | | Foo.qll:26:8:26:8 | ComparisonOp | semmle.label | [ComparisonOp] ComparisonOp | -| Foo.qll:26:8:26:8 | ComparisonOp | semmle.order | 84 | +| Foo.qll:26:8:26:8 | ComparisonOp | semmle.order | 85 | | Foo.qll:26:10:26:14 | Boolean | semmle.label | [Boolean] Boolean | -| Foo.qll:26:10:26:14 | Boolean | semmle.order | 85 | +| Foo.qll:26:10:26:14 | Boolean | semmle.order | 86 | | printAst.ql:1:1:1:28 | Import | semmle.label | [Import] Import | -| printAst.ql:1:1:1:28 | Import | semmle.order | 86 | +| printAst.ql:1:1:1:28 | Import | semmle.order | 87 | | printAst.ql:1:1:1:29 | TopLevel | semmle.label | [TopLevel] TopLevel | -| printAst.ql:1:1:1:29 | TopLevel | semmle.order | 86 | +| printAst.ql:1:1:1:29 | TopLevel | semmle.order | 87 | edges | 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 | 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:9:7:11:1 | ClasslessPredicate foo | semmle.order | 17 | | 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:1:1:27:2 | TopLevel | Foo.qll:13:1:27:1 | ClasslessPredicate calls | semmle.order | 35 | | 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() | @@ -207,142 +209,142 @@ edges | 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 | 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:9:21:9:25 | f | semmle.order | 18 | | 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:7:11:1 | ClasslessPredicate foo | Foo.qll:10:3:10:85 | ComparisonFormula | semmle.order | 20 | | 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:9:21:9:25 | f | Foo.qll:9:21:9:23 | TypeExpr | semmle.order | 18 | | Foo.qll:10:3:10:85 | ComparisonFormula | Foo.qll:10:3:10:3 | f | semmle.label | getLeftOperand() | -| Foo.qll:10:3:10:85 | ComparisonFormula | Foo.qll:10:3:10:3 | f | semmle.order | 19 | +| Foo.qll:10:3:10:85 | ComparisonFormula | Foo.qll:10:3:10:3 | f | semmle.order | 20 | | Foo.qll:10:3:10:85 | ComparisonFormula | Foo.qll:10:5:10:5 | ComparisonOp | semmle.label | getOperator() | -| Foo.qll:10:3:10:85 | ComparisonFormula | Foo.qll:10:5:10:5 | ComparisonOp | semmle.order | 21 | +| Foo.qll:10:3:10:85 | ComparisonFormula | Foo.qll:10:5:10:5 | ComparisonOp | semmle.order | 22 | | Foo.qll:10:3:10:85 | ComparisonFormula | Foo.qll:10:7:10:85 | Rank | semmle.label | getRightOperand() | -| Foo.qll:10:3:10:85 | ComparisonFormula | Foo.qll:10:7:10:85 | Rank | semmle.order | 22 | +| Foo.qll:10:3:10:85 | ComparisonFormula | Foo.qll:10:7:10:85 | Rank | semmle.order | 23 | | Foo.qll:10:7:10:85 | Rank | Foo.qll:10:12:10:12 | Integer | semmle.label | getRankExpr() | -| Foo.qll:10:7:10:85 | Rank | Foo.qll:10:12:10:12 | Integer | semmle.order | 23 | +| Foo.qll:10:7:10:85 | Rank | Foo.qll:10:12:10:12 | Integer | semmle.order | 24 | | Foo.qll:10:7:10:85 | Rank | Foo.qll:10:15:10:23 | inner | semmle.label | getArgument(_) | -| Foo.qll:10:7:10:85 | Rank | Foo.qll:10:15:10:23 | inner | semmle.order | 24 | +| Foo.qll:10:7:10:85 | Rank | Foo.qll:10:15:10:23 | inner | semmle.order | 25 | | Foo.qll:10:7:10:85 | Rank | Foo.qll:10:27:10:50 | ComparisonFormula | semmle.label | getRange() | -| Foo.qll:10:7:10:85 | Rank | Foo.qll:10:27:10:50 | ComparisonFormula | semmle.order | 26 | +| Foo.qll:10:7:10:85 | Rank | Foo.qll:10:27:10:50 | ComparisonFormula | semmle.order | 27 | | Foo.qll:10:7:10:85 | Rank | Foo.qll:10:54:10:58 | inner | semmle.label | getExpr(_) | -| Foo.qll:10:7:10:85 | Rank | Foo.qll:10:54:10:58 | inner | semmle.order | 31 | +| Foo.qll:10:7:10:85 | Rank | Foo.qll:10:54:10:58 | inner | semmle.order | 32 | | Foo.qll:10:7:10:85 | Rank | Foo.qll:10:69:10:84 | MemberCall | semmle.label | getOrderBy(_) | -| Foo.qll:10:7:10:85 | Rank | Foo.qll:10:69:10:84 | MemberCall | semmle.order | 32 | +| Foo.qll:10:7:10:85 | Rank | Foo.qll:10:69:10:84 | MemberCall | semmle.order | 33 | | Foo.qll:10:15:10:23 | inner | Foo.qll:10:15:10:17 | TypeExpr | semmle.label | getTypeExpr() | -| Foo.qll:10:15:10:23 | inner | Foo.qll:10:15:10:17 | TypeExpr | semmle.order | 24 | +| Foo.qll:10:15:10:23 | inner | Foo.qll:10:15:10:17 | TypeExpr | semmle.order | 25 | | Foo.qll:10:27:10:42 | MemberCall | Foo.qll:10:27:10:31 | inner | semmle.label | getBase() | -| Foo.qll:10:27:10:42 | MemberCall | Foo.qll:10:27:10:31 | inner | semmle.order | 26 | +| Foo.qll:10:27:10:42 | MemberCall | Foo.qll:10:27:10:31 | inner | semmle.order | 27 | | Foo.qll:10:27:10:50 | ComparisonFormula | Foo.qll:10:27:10:42 | MemberCall | semmle.label | getLeftOperand() | -| Foo.qll:10:27:10:50 | ComparisonFormula | Foo.qll:10:27:10:42 | MemberCall | semmle.order | 26 | +| Foo.qll:10:27:10:50 | ComparisonFormula | Foo.qll:10:27:10:42 | MemberCall | semmle.order | 27 | | Foo.qll:10:27:10:50 | ComparisonFormula | Foo.qll:10:44:10:44 | ComparisonOp | semmle.label | getOperator() | -| Foo.qll:10:27:10:50 | ComparisonFormula | Foo.qll:10:44:10:44 | ComparisonOp | semmle.order | 29 | +| Foo.qll:10:27:10:50 | ComparisonFormula | Foo.qll:10:44:10:44 | ComparisonOp | semmle.order | 30 | | Foo.qll:10:27:10:50 | ComparisonFormula | Foo.qll:10:46:10:50 | String | semmle.label | getRightOperand() | -| Foo.qll:10:27:10:50 | ComparisonFormula | Foo.qll:10:46:10:50 | String | semmle.order | 30 | +| Foo.qll:10:27:10:50 | ComparisonFormula | Foo.qll:10:46:10:50 | String | semmle.order | 31 | | 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:10:69:10:84 | MemberCall | Foo.qll:10:69:10:73 | inner | semmle.order | 33 | | 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:13:17:13:21 | f | semmle.order | 36 | | 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:1:27:1 | ClasslessPredicate calls | Foo.qll:14:3:26:14 | Disjunction | semmle.order | 38 | | 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:13:17:13:21 | f | Foo.qll:13:17:13:19 | TypeExpr | semmle.order | 36 | | Foo.qll:14:3:14:10 | PredicateCall | Foo.qll:14:9:14:9 | f | semmle.label | getArgument(_) | -| Foo.qll:14:3:14:10 | PredicateCall | Foo.qll:14:9:14:9 | f | semmle.order | 44 | +| Foo.qll:14:3:14:10 | PredicateCall | Foo.qll:14:9:14:9 | f | semmle.order | 45 | | Foo.qll:14:3:16:29 | Disjunction | Foo.qll:14:3:14:10 | PredicateCall | semmle.label | getAnOperand() | -| Foo.qll:14:3:16:29 | Disjunction | Foo.qll:14:3:14:10 | PredicateCall | semmle.order | 37 | +| Foo.qll:14:3:16:29 | Disjunction | Foo.qll:14:3:14:10 | PredicateCall | semmle.order | 38 | | Foo.qll:14:3:16:29 | Disjunction | Foo.qll:16:3:16:29 | ComparisonFormula | semmle.label | getAnOperand() | -| Foo.qll:14:3:16:29 | Disjunction | Foo.qll:16:3:16:29 | ComparisonFormula | semmle.order | 45 | +| Foo.qll:14:3:16:29 | Disjunction | Foo.qll:16:3:16:29 | ComparisonFormula | semmle.order | 46 | | Foo.qll:14:3:18:28 | Disjunction | Foo.qll:14:3:16:29 | Disjunction | semmle.label | getAnOperand() | -| Foo.qll:14:3:18:28 | Disjunction | Foo.qll:14:3:16:29 | Disjunction | semmle.order | 37 | +| Foo.qll:14:3:18:28 | Disjunction | Foo.qll:14:3:16:29 | Disjunction | semmle.order | 38 | | Foo.qll:14:3:18:28 | Disjunction | Foo.qll:18:3:18:28 | ComparisonFormula | semmle.label | getAnOperand() | -| Foo.qll:14:3:18:28 | Disjunction | Foo.qll:18:3:18:28 | ComparisonFormula | semmle.order | 53 | +| Foo.qll:14:3:18:28 | Disjunction | Foo.qll:18:3:18:28 | ComparisonFormula | semmle.order | 54 | | Foo.qll:14:3:20:13 | Disjunction | Foo.qll:14:3:18:28 | Disjunction | semmle.label | getAnOperand() | -| Foo.qll:14:3:20:13 | Disjunction | Foo.qll:14:3:18:28 | Disjunction | semmle.order | 37 | +| Foo.qll:14:3:20:13 | Disjunction | Foo.qll:14:3:18:28 | Disjunction | semmle.order | 38 | | Foo.qll:14:3:20:13 | Disjunction | Foo.qll:20:3:20:13 | ComparisonFormula | semmle.label | getAnOperand() | -| Foo.qll:14:3:20:13 | Disjunction | Foo.qll:20:3:20:13 | ComparisonFormula | semmle.order | 60 | +| Foo.qll:14:3:20:13 | Disjunction | Foo.qll:20:3:20:13 | ComparisonFormula | semmle.order | 61 | | Foo.qll:14:3:22:16 | Disjunction | Foo.qll:14:3:20:13 | Disjunction | semmle.label | getAnOperand() | -| Foo.qll:14:3:22:16 | Disjunction | Foo.qll:14:3:20:13 | Disjunction | semmle.order | 37 | +| Foo.qll:14:3:22:16 | Disjunction | Foo.qll:14:3:20:13 | Disjunction | semmle.order | 38 | | Foo.qll:14:3:22:16 | Disjunction | Foo.qll:22:3:22:16 | ComparisonFormula | semmle.label | getAnOperand() | -| Foo.qll:14:3:22:16 | Disjunction | Foo.qll:22:3:22:16 | ComparisonFormula | semmle.order | 66 | +| Foo.qll:14:3:22:16 | Disjunction | Foo.qll:22:3:22:16 | ComparisonFormula | semmle.order | 67 | | Foo.qll:14:3:24:23 | Disjunction | Foo.qll:14:3:22:16 | Disjunction | semmle.label | getAnOperand() | -| Foo.qll:14:3:24:23 | Disjunction | Foo.qll:14:3:22:16 | Disjunction | semmle.order | 37 | +| Foo.qll:14:3:24:23 | Disjunction | Foo.qll:14:3:22:16 | Disjunction | semmle.order | 38 | | Foo.qll:14:3:24:23 | Disjunction | Foo.qll:24:3:24:23 | ComparisonFormula | semmle.label | getAnOperand() | -| Foo.qll:14:3:24:23 | Disjunction | Foo.qll:24:3:24:23 | ComparisonFormula | semmle.order | 72 | +| Foo.qll:14:3:24:23 | Disjunction | Foo.qll:24:3:24:23 | ComparisonFormula | semmle.order | 73 | | Foo.qll:14:3:26:14 | Disjunction | Foo.qll:14:3:24:23 | Disjunction | semmle.label | getAnOperand() | -| Foo.qll:14:3:26:14 | Disjunction | Foo.qll:14:3:24:23 | Disjunction | semmle.order | 37 | +| Foo.qll:14:3:26:14 | Disjunction | Foo.qll:14:3:24:23 | Disjunction | semmle.order | 38 | | Foo.qll:14:3:26:14 | Disjunction | Foo.qll:26:3:26:14 | ComparisonFormula | semmle.label | getAnOperand() | -| Foo.qll:14:3:26:14 | Disjunction | Foo.qll:26:3:26:14 | ComparisonFormula | semmle.order | 82 | +| Foo.qll:14:3:26:14 | Disjunction | Foo.qll:26:3:26:14 | ComparisonFormula | semmle.order | 83 | | Foo.qll:16:3:16:29 | ComparisonFormula | Foo.qll:16:3:16:7 | String | semmle.label | getLeftOperand() | -| Foo.qll:16:3:16:29 | ComparisonFormula | Foo.qll:16:3:16:7 | String | semmle.order | 45 | +| Foo.qll:16:3:16:29 | ComparisonFormula | Foo.qll:16:3:16:7 | String | semmle.order | 46 | | Foo.qll:16:3:16:29 | ComparisonFormula | Foo.qll:16:9:16:9 | ComparisonOp | semmle.label | getOperator() | -| Foo.qll:16:3:16:29 | ComparisonFormula | Foo.qll:16:9:16:9 | ComparisonOp | semmle.order | 47 | +| Foo.qll:16:3:16:29 | ComparisonFormula | Foo.qll:16:9:16:9 | ComparisonOp | semmle.order | 48 | | Foo.qll:16:3:16:29 | ComparisonFormula | Foo.qll:16:11:16:29 | MemberCall | semmle.label | getRightOperand() | -| Foo.qll:16:3:16:29 | ComparisonFormula | Foo.qll:16:11:16:29 | MemberCall | semmle.order | 48 | +| Foo.qll:16:3:16:29 | ComparisonFormula | Foo.qll:16:11:16:29 | MemberCall | semmle.order | 49 | | Foo.qll:16:11:16:29 | MemberCall | Foo.qll:16:11:16:11 | f | semmle.label | getBase() | -| Foo.qll:16:11:16:29 | MemberCall | Foo.qll:16:11:16:11 | f | semmle.order | 48 | +| Foo.qll:16:11:16:29 | MemberCall | Foo.qll:16:11:16:11 | f | semmle.order | 49 | | Foo.qll:16:11:16:29 | MemberCall | Foo.qll:16:22:16:22 | Integer | semmle.label | getArgument(_) | -| Foo.qll:16:11:16:29 | MemberCall | Foo.qll:16:22:16:22 | Integer | semmle.order | 50 | +| Foo.qll:16:11:16:29 | MemberCall | Foo.qll:16:22:16:22 | Integer | semmle.order | 51 | | Foo.qll:16:11:16:29 | MemberCall | Foo.qll:16:25:16:25 | Integer | semmle.label | getArgument(_) | -| Foo.qll:16:11:16:29 | MemberCall | Foo.qll:16:25:16:25 | Integer | semmle.order | 51 | +| Foo.qll:16:11:16:29 | MemberCall | Foo.qll:16:25:16:25 | Integer | semmle.order | 52 | | Foo.qll:16:11:16:29 | MemberCall | Foo.qll:16:28:16:28 | Integer | semmle.label | getArgument(_) | -| Foo.qll:16:11:16:29 | MemberCall | Foo.qll:16:28:16:28 | Integer | semmle.order | 52 | +| Foo.qll:16:11:16:29 | MemberCall | Foo.qll:16:28:16:28 | Integer | semmle.order | 53 | | Foo.qll:18:3:18:9 | InlineCast | Foo.qll:18:3:18:3 | f | semmle.label | getBase() | -| Foo.qll:18:3:18:9 | InlineCast | Foo.qll:18:3:18:3 | f | semmle.order | 53 | +| Foo.qll:18:3:18:9 | InlineCast | Foo.qll:18:3:18:3 | f | semmle.order | 54 | | Foo.qll:18:3:18:9 | InlineCast | Foo.qll:18:6:18:8 | TypeExpr | semmle.label | getTypeExpr() | -| Foo.qll:18:3:18:9 | InlineCast | Foo.qll:18:6:18:8 | TypeExpr | semmle.order | 57 | +| Foo.qll:18:3:18:9 | InlineCast | Foo.qll:18:6:18:8 | TypeExpr | semmle.order | 58 | | Foo.qll:18:3:18:20 | MemberCall | Foo.qll:18:3:18:9 | InlineCast | semmle.label | getBase() | -| Foo.qll:18:3:18:20 | MemberCall | Foo.qll:18:3:18:9 | InlineCast | semmle.order | 53 | +| Foo.qll:18:3:18:20 | MemberCall | Foo.qll:18:3:18:9 | InlineCast | semmle.order | 54 | | Foo.qll:18:3:18:28 | ComparisonFormula | Foo.qll:18:3:18:20 | MemberCall | semmle.label | getLeftOperand() | -| Foo.qll:18:3:18:28 | ComparisonFormula | Foo.qll:18:3:18:20 | MemberCall | semmle.order | 53 | +| Foo.qll:18:3:18:28 | ComparisonFormula | Foo.qll:18:3:18:20 | MemberCall | semmle.order | 54 | | Foo.qll:18:3:18:28 | ComparisonFormula | Foo.qll:18:22:18:22 | ComparisonOp | semmle.label | getOperator() | -| Foo.qll:18:3:18:28 | ComparisonFormula | Foo.qll:18:22:18:22 | ComparisonOp | semmle.order | 58 | +| Foo.qll:18:3:18:28 | ComparisonFormula | Foo.qll:18:22:18:22 | ComparisonOp | semmle.order | 59 | | Foo.qll:18:3:18:28 | ComparisonFormula | Foo.qll:18:24:18:28 | String | semmle.label | getRightOperand() | -| Foo.qll:18:3:18:28 | ComparisonFormula | Foo.qll:18:24:18:28 | String | semmle.order | 59 | +| Foo.qll:18:3:18:28 | ComparisonFormula | Foo.qll:18:24:18:28 | String | semmle.order | 60 | | Foo.qll:20:3:20:9 | InlineCast | Foo.qll:20:3:20:3 | f | semmle.label | getBase() | -| Foo.qll:20:3:20:9 | InlineCast | Foo.qll:20:3:20:3 | f | semmle.order | 60 | +| Foo.qll:20:3:20:9 | InlineCast | Foo.qll:20:3:20:3 | f | semmle.order | 61 | | Foo.qll:20:3:20:9 | InlineCast | Foo.qll:20:6:20:8 | TypeExpr | semmle.label | getTypeExpr() | -| Foo.qll:20:3:20:9 | InlineCast | Foo.qll:20:6:20:8 | TypeExpr | semmle.order | 63 | +| Foo.qll:20:3:20:9 | InlineCast | Foo.qll:20:6:20:8 | TypeExpr | semmle.order | 64 | | Foo.qll:20:3:20:13 | ComparisonFormula | Foo.qll:20:3:20:9 | InlineCast | semmle.label | getLeftOperand() | -| Foo.qll:20:3:20:13 | ComparisonFormula | Foo.qll:20:3:20:9 | InlineCast | semmle.order | 60 | +| Foo.qll:20:3:20:13 | ComparisonFormula | Foo.qll:20:3:20:9 | InlineCast | semmle.order | 61 | | Foo.qll:20:3:20:13 | ComparisonFormula | Foo.qll:20:11:20:11 | ComparisonOp | semmle.label | getOperator() | -| Foo.qll:20:3:20:13 | ComparisonFormula | Foo.qll:20:11:20:11 | ComparisonOp | semmle.order | 64 | +| Foo.qll:20:3:20:13 | ComparisonFormula | Foo.qll:20:11:20:11 | ComparisonOp | semmle.order | 65 | | Foo.qll:20:3:20:13 | ComparisonFormula | Foo.qll:20:13:20:13 | f | semmle.label | getRightOperand() | -| Foo.qll:20:3:20:13 | ComparisonFormula | Foo.qll:20:13:20:13 | f | semmle.order | 65 | +| Foo.qll:20:3:20:13 | ComparisonFormula | Foo.qll:20:13:20:13 | f | semmle.order | 66 | | Foo.qll:22:3:22:16 | ComparisonFormula | Foo.qll:22:3:22:3 | f | semmle.label | getLeftOperand() | -| Foo.qll:22:3:22:16 | ComparisonFormula | Foo.qll:22:3:22:3 | f | semmle.order | 66 | +| Foo.qll:22:3:22:16 | ComparisonFormula | Foo.qll:22:3:22:3 | f | semmle.order | 67 | | Foo.qll:22:3:22:16 | ComparisonFormula | Foo.qll:22:5:22:5 | ComparisonOp | semmle.label | getOperator() | -| Foo.qll:22:3:22:16 | ComparisonFormula | Foo.qll:22:5:22:5 | ComparisonOp | semmle.order | 68 | +| Foo.qll:22:3:22:16 | ComparisonFormula | Foo.qll:22:5:22:5 | ComparisonOp | semmle.order | 69 | | Foo.qll:22:3:22:16 | ComparisonFormula | Foo.qll:22:7:22:16 | FullAggregate[any] | semmle.label | getRightOperand() | -| Foo.qll:22:3:22:16 | ComparisonFormula | Foo.qll:22:7:22:16 | FullAggregate[any] | semmle.order | 69 | +| Foo.qll:22:3:22:16 | ComparisonFormula | Foo.qll:22:7:22:16 | FullAggregate[any] | semmle.order | 70 | | Foo.qll:22:7:22:16 | FullAggregate[any] | Foo.qll:22:11:22:15 | f | semmle.label | getArgument(_) | -| Foo.qll:22:7:22:16 | FullAggregate[any] | Foo.qll:22:11:22:15 | f | semmle.order | 70 | +| Foo.qll:22:7:22:16 | FullAggregate[any] | Foo.qll:22:11:22:15 | f | semmle.order | 71 | | Foo.qll:22:11:22:15 | f | Foo.qll:22:11:22:13 | TypeExpr | semmle.label | getTypeExpr() | -| Foo.qll:22:11:22:15 | f | Foo.qll:22:11:22:13 | TypeExpr | semmle.order | 70 | +| Foo.qll:22:11:22:15 | f | Foo.qll:22:11:22:13 | TypeExpr | semmle.order | 71 | | Foo.qll:24:3:24:23 | ComparisonFormula | Foo.qll:24:3:24:3 | Integer | semmle.label | getLeftOperand() | -| Foo.qll:24:3:24:23 | ComparisonFormula | Foo.qll:24:3:24:3 | Integer | semmle.order | 72 | +| Foo.qll:24:3:24:23 | ComparisonFormula | Foo.qll:24:3:24:3 | Integer | semmle.order | 73 | | Foo.qll:24:3:24:23 | ComparisonFormula | Foo.qll:24:5:24:5 | ComparisonOp | semmle.label | getOperator() | -| Foo.qll:24:3:24:23 | ComparisonFormula | Foo.qll:24:5:24:5 | ComparisonOp | semmle.order | 74 | +| Foo.qll:24:3:24:23 | ComparisonFormula | Foo.qll:24:5:24:5 | ComparisonOp | semmle.order | 75 | | Foo.qll:24:3:24:23 | ComparisonFormula | Foo.qll:24:7:24:23 | AddExpr | semmle.label | getRightOperand() | -| Foo.qll:24:3:24:23 | ComparisonFormula | Foo.qll:24:7:24:23 | AddExpr | semmle.order | 75 | +| Foo.qll:24:3:24:23 | ComparisonFormula | Foo.qll:24:7:24:23 | AddExpr | semmle.order | 76 | | Foo.qll:24:7:24:23 | AddExpr | Foo.qll:24:7:24:7 | Integer | semmle.label | getLeftOperand() | -| Foo.qll:24:7:24:23 | AddExpr | Foo.qll:24:7:24:7 | Integer | semmle.order | 75 | +| Foo.qll:24:7:24:23 | AddExpr | Foo.qll:24:7:24:7 | Integer | semmle.order | 76 | | Foo.qll:24:7:24:23 | AddExpr | Foo.qll:24:12:24:22 | AddExpr | semmle.label | getRightOperand() | -| Foo.qll:24:7:24:23 | AddExpr | Foo.qll:24:12:24:22 | AddExpr | semmle.order | 77 | +| Foo.qll:24:7:24:23 | AddExpr | Foo.qll:24:12:24:22 | AddExpr | semmle.order | 78 | | Foo.qll:24:12:24:22 | AddExpr | Foo.qll:24:12:24:12 | Integer | semmle.label | getLeftOperand() | -| Foo.qll:24:12:24:22 | AddExpr | Foo.qll:24:12:24:12 | Integer | semmle.order | 77 | +| Foo.qll:24:12:24:22 | AddExpr | Foo.qll:24:12:24:12 | Integer | semmle.order | 78 | | Foo.qll:24:12:24:22 | AddExpr | Foo.qll:24:17:24:21 | AddExpr | semmle.label | getRightOperand() | -| Foo.qll:24:12:24:22 | AddExpr | Foo.qll:24:17:24:21 | AddExpr | semmle.order | 79 | +| Foo.qll:24:12:24:22 | AddExpr | Foo.qll:24:17:24:21 | AddExpr | semmle.order | 80 | | Foo.qll:24:17:24:21 | AddExpr | Foo.qll:24:17:24:17 | Integer | semmle.label | getLeftOperand() | -| Foo.qll:24:17:24:21 | AddExpr | Foo.qll:24:17:24:17 | Integer | semmle.order | 79 | +| Foo.qll:24:17:24:21 | AddExpr | Foo.qll:24:17:24:17 | Integer | semmle.order | 80 | | Foo.qll:24:17:24:21 | AddExpr | Foo.qll:24:21:24:21 | Integer | semmle.label | getRightOperand() | -| Foo.qll:24:17:24:21 | AddExpr | Foo.qll:24:21:24:21 | Integer | semmle.order | 81 | +| Foo.qll:24:17:24:21 | AddExpr | Foo.qll:24:21:24:21 | Integer | semmle.order | 82 | | Foo.qll:26:3:26:14 | ComparisonFormula | Foo.qll:26:3:26:6 | Boolean | semmle.label | getLeftOperand() | -| Foo.qll:26:3:26:14 | ComparisonFormula | Foo.qll:26:3:26:6 | Boolean | semmle.order | 82 | +| Foo.qll:26:3:26:14 | ComparisonFormula | Foo.qll:26:3:26:6 | Boolean | semmle.order | 83 | | Foo.qll:26:3:26:14 | ComparisonFormula | Foo.qll:26:8:26:8 | ComparisonOp | semmle.label | getOperator() | -| 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:8:26:8 | ComparisonOp | semmle.order | 85 | | 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 | +| Foo.qll:26:3:26:14 | ComparisonFormula | Foo.qll:26:10:26:14 | Boolean | semmle.order | 86 | | 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 | +| printAst.ql:1:1:1:29 | TopLevel | printAst.ql:1:1:1:28 | Import | semmle.order | 87 | graphProperties | semmle.graphKind | tree |