Merge pull request #69 from github/erik-krogh/perf

fix two bad join orders
This commit is contained in:
Mathias Vorreiter Pedersen
2021-10-13 12:53:12 +01:00
committed by GitHub
3 changed files with 22 additions and 19 deletions

View File

@@ -74,23 +74,6 @@ private class Folder_ extends ContainerOrModule, TFolder {
Folder getFolder() { result = f }
}
// TODO: Use `AstNode::getParent` once it is total
private Generated::AstNode parent(Generated::AstNode n) {
result = n.getParent() and
not n instanceof Generated::Module
}
private Module getEnclosingModule0(AstNode n) {
AstNodes::toGenerated(result) = parent*(AstNodes::toGenerated(n).getParent())
}
ContainerOrModule getEnclosingModule(AstNode n) {
result = TModule(getEnclosingModule0(n))
or
not exists(getEnclosingModule0(n)) and
result = TFile(n.getLocation().getFile())
}
class Module_ extends FileOrModule, TModule {
Module m;
@@ -163,6 +146,24 @@ private predicate resolveSelectionName(Import imp, ContainerOrModule m, int i) {
cached
private module Cached {
// TODO: Use `AstNode::getParent` once it is total
private Generated::AstNode parent(Generated::AstNode n) {
result = n.getParent() and
not n instanceof Generated::Module
}
private Module getEnclosingModule0(AstNode n) {
AstNodes::toGenerated(result) = parent*(AstNodes::toGenerated(n).getParent())
}
cached
ContainerOrModule getEnclosingModule(AstNode n) {
result = TModule(getEnclosingModule0(n))
or
not exists(getEnclosingModule0(n)) and
result = TFile(n.getLocation().getFile())
}
cached
module NewType {
cached

View File

@@ -76,7 +76,7 @@ class Type extends TType {
p2 = classPredCandidate(this, name, arity)
}
pragma[nomagic]
cached
PredicateOrBuiltin getClassPredicate(string name, int arity) {
result = classPredCandidate(this, name, arity) and
not getClassPredicate1(name, arity, _, result)

View File

@@ -72,7 +72,9 @@ private module Cached {
predicate resolveVariable(Identifier i, VarDef decl) { scopeOf(i).containsVar(decl, getName(i)) }
cached
predicate resolveField(Identifier i, VarDef decl) { scopeOf(i).containsField(decl, getName(i)) }
predicate resolveField(Identifier i, VarDef decl) {
scopeOf(i).containsField(decl, pragma[only_bind_into](getName(i)))
}
}
import Cached