mirror of
https://github.com/github/codeql.git
synced 2026-04-29 18:55:14 +02:00
calls and inline casts
This commit is contained in:
committed by
GitHub
parent
d9a7f10cfe
commit
79789e28a1
@@ -220,7 +220,7 @@ class ModuleMember extends TModuleMember, AstNode {
|
||||
override AstNode getParent() { result.(Module).getAMember() = this }
|
||||
|
||||
/** Holds if this member is declared as `private`. */
|
||||
predicate isPrivate() { none() }
|
||||
predicate isPrivate() { none() } // TODO: Implement.
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -330,6 +330,81 @@ class NewTypeBranch extends TNewTypeBranch, AstNode {
|
||||
Formula getBody() { toGenerated(result) = branch.getChild(_).(Generated::Body).getChild() }
|
||||
}
|
||||
|
||||
class Call extends TCall, Expr {
|
||||
Expr getArgument(int i) {
|
||||
none() // overriden in sublcasses.
|
||||
}
|
||||
}
|
||||
|
||||
class PredicateCall extends TPredicateCall, Call {
|
||||
Generated::CallOrUnqualAggExpr expr;
|
||||
|
||||
PredicateCall() { this = TPredicateCall(expr) }
|
||||
|
||||
override Expr getArgument(int i) {
|
||||
exists(Generated::CallBody body | body.getParent() = expr |
|
||||
toGenerated(result) = body.getChild(i)
|
||||
)
|
||||
}
|
||||
|
||||
override string getAPrimaryQlClass() { result = "PredicateCall" }
|
||||
|
||||
string getPredicateName() {
|
||||
result = expr.getChild(0).(Generated::AritylessPredicateExpr).getName().getValue()
|
||||
}
|
||||
}
|
||||
|
||||
class MemberCall extends TMemberCall, Call {
|
||||
Generated::QualifiedExpr expr;
|
||||
|
||||
MemberCall() { this = TMemberCall(expr) }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "MemberCall" }
|
||||
|
||||
string getMemberName() {
|
||||
result = expr.getChild(_).(Generated::QualifiedRhs).getName().getValue()
|
||||
}
|
||||
|
||||
override Expr getArgument(int i) {
|
||||
result =
|
||||
rank[i + 1](Expr e, int index |
|
||||
toGenerated(e) = expr.getChild(_).(Generated::QualifiedRhs).getChild(index)
|
||||
|
|
||||
e order by index
|
||||
)
|
||||
}
|
||||
|
||||
Expr getBase() { toGenerated(result) = expr.getChild(0) }
|
||||
}
|
||||
|
||||
class NoneCall extends TNoneCall, Call {
|
||||
Generated::SpecialCall call;
|
||||
|
||||
NoneCall() { this = TNoneCall(call) }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "NoneCall" }
|
||||
}
|
||||
|
||||
class AnyCall extends TAnyCall, Call {
|
||||
Generated::Aggregate agg;
|
||||
|
||||
AnyCall() { this = TAnyCall(agg) }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "AnyCall" }
|
||||
}
|
||||
|
||||
class InlineCast extends TInlineCast, Expr {
|
||||
Generated::QualifiedExpr expr;
|
||||
|
||||
InlineCast() { this = TInlineCast(expr) }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "InlineCast" }
|
||||
|
||||
Type getType() { toGenerated(result) = expr.getChild(_).(Generated::QualifiedRhs).getChild(_) }
|
||||
|
||||
Expr getBase() { toGenerated(result) = expr.getChild(0) }
|
||||
}
|
||||
|
||||
/**
|
||||
* An import statement.
|
||||
*/
|
||||
@@ -588,6 +663,7 @@ class Rank extends Aggregate {
|
||||
Expr getRankExpr() { toGenerated(result) = agg.getChild(1) }
|
||||
}
|
||||
|
||||
// TODO: Range and Set.
|
||||
class AsExpr extends TAsExpr, AstNode {
|
||||
Generated::AsExpr asExpr;
|
||||
|
||||
|
||||
@@ -21,9 +21,21 @@ newtype TAstNode =
|
||||
TComparisonFormula(Generated::CompTerm comp) or
|
||||
TComparisonOp(Generated::Compop op) or
|
||||
TQuantifier(Generated::Quantified quant) or
|
||||
TAggregate(Generated::Aggregate agg) or
|
||||
TAggregate(Generated::Aggregate agg) { agg.getChild(_) instanceof Generated::FullAggregateBody } or
|
||||
TIdentifier(Generated::Variable var) or
|
||||
TAsExpr(Generated::AsExpr asExpr) or
|
||||
TPredicateCall(Generated::CallOrUnqualAggExpr call) or
|
||||
TMemberCall(Generated::QualifiedExpr expr) {
|
||||
not expr.getChild(_).(Generated::QualifiedRhs).getChild(_) instanceof Generated::TypeExpr
|
||||
} or
|
||||
TInlineCast(Generated::QualifiedExpr expr) {
|
||||
expr.getChild(_).(Generated::QualifiedRhs).getChild(_) instanceof Generated::TypeExpr
|
||||
} or
|
||||
TNoneCall(Generated::SpecialCall call) or
|
||||
TAnyCall(Generated::Aggregate agg) {
|
||||
"any" = agg.getChild(0).(Generated::AggId).getValue() and
|
||||
not agg.getChild(_) instanceof Generated::FullAggregateBody
|
||||
} or
|
||||
TNegation(Generated::Negation neg) or
|
||||
TAddExpr(Generated::AddExpr addexp) or
|
||||
TLiteral(Generated::Literal lit) or
|
||||
@@ -35,7 +47,11 @@ class TFormula = TDisjunction or TConjunction or TComparisonFormula or TQuantifi
|
||||
|
||||
class TBinOpExpr = TAddExpr;
|
||||
|
||||
class TExpr = TBinOpExpr or TLiteral or TAggregate or TIdentifier or TUnaryExpr or TDontCare;
|
||||
class TExpr =
|
||||
TBinOpExpr or TLiteral or TAggregate or TIdentifier or TInlineCast or TCall or TUnaryExpr or
|
||||
TDontCare;
|
||||
|
||||
class TCall = TPredicateCall or TMemberCall or TNoneCall or TAnyCall;
|
||||
|
||||
Generated::AstNode toGeneratedFormula(AST::AstNode n) {
|
||||
n = TConjunction(result) or
|
||||
@@ -88,6 +104,16 @@ Generated::AstNode toGenerated(AST::AstNode n) {
|
||||
n = TAsExpr(result)
|
||||
or
|
||||
n = TModuleExpr(result)
|
||||
or
|
||||
n = TPredicateCall(result)
|
||||
or
|
||||
n = TMemberCall(result)
|
||||
or
|
||||
n = TInlineCast(result)
|
||||
or
|
||||
n = TNoneCall(result)
|
||||
or
|
||||
n = TAnyCall(result)
|
||||
}
|
||||
|
||||
class TPredicate = TCharPred or TClasslessPredicate or TClassPredicate;
|
||||
|
||||
@@ -9,3 +9,17 @@ class Foo extends @bar {
|
||||
query predicate foo(Foo f) {
|
||||
f = rank[2](Foo inner | inner.toString() = "foo" | inner order by inner.toString())
|
||||
}
|
||||
|
||||
predicate calls(Foo f) {
|
||||
calls(f)
|
||||
or
|
||||
"foo" = f.toString(1, 2, 3)
|
||||
or
|
||||
f.(Foo).toString() = "bar"
|
||||
or
|
||||
f.(Foo) = f
|
||||
or
|
||||
f = any(Foo f)
|
||||
or
|
||||
any()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user