calls and inline casts

This commit is contained in:
Erik Krogh Kristensen
2021-05-27 10:03:40 +00:00
committed by GitHub
parent d9a7f10cfe
commit 79789e28a1
3 changed files with 119 additions and 3 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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()
}