Swift: add Pattern.getEnclosingPattern()

This commit is contained in:
Nora Dimitrijević
2023-02-09 23:49:56 +01:00
parent c2e9ffab63
commit 5c795632db
3 changed files with 31 additions and 45 deletions

View File

@@ -185,7 +185,7 @@ private predicate switchMatching(SwitchStmt switch, CaseStmt c, AstNode ast) {
(
c.getALabel() = ast
or
isSubPattern+(c.getALabel().getPattern(), ast)
ast.(Pattern).getEnclosingPattern+() = c.getALabel().getPattern()
)
}
@@ -216,27 +216,10 @@ predicate catchMatchingPattern(DoCatchStmt s, CaseStmt c, Pattern pattern) {
exists(CaseLabelItem cli | catchMatching(s, c, cli) |
cli.getPattern() = pattern
or
isSubPattern+(cli.getPattern(), pattern)
pattern.getEnclosingPattern+() = cli.getPattern()
)
}
/** Holds if `sub` is a subpattern of `p`. */
private predicate isSubPattern(Pattern p, Pattern sub) {
sub = p.(BindingPattern).getImmediateSubPattern()
or
sub = p.(EnumElementPattern).getImmediateSubPattern()
or
sub = p.(IsPattern).getImmediateSubPattern()
or
sub = p.(OptionalSomePattern).getImmediateSubPattern()
or
sub = p.(ParenPattern).getImmediateSubPattern()
or
sub = p.(TuplePattern).getImmediateElement(_)
or
sub = p.(TypedPattern).getImmediateSubPattern()
}
/** Gets the value of `e` if it is a constant value, disregarding conversions. */
private string getExprValue(Expr e) {
result = e.(IntegerLiteralExpr).getStringValue()

View File

@@ -1,14 +1,5 @@
private import codeql.swift.generated.pattern.NamedPattern
private import codeql.swift.elements.pattern.BindingPattern
private import codeql.swift.elements.pattern.EnumElementPattern
private import codeql.swift.elements.pattern.IsPattern
private import codeql.swift.elements.pattern.OptionalSomePattern
private import codeql.swift.elements.pattern.ParenPattern
private import codeql.swift.elements.pattern.TuplePattern
private import codeql.swift.elements.pattern.TypedPattern
private import codeql.swift.elements.decl.VarDecl
private import codeql.swift.elements.stmt.LabeledConditionalStmt
private import codeql.swift.elements.stmt.ConditionElement
class NamedPattern extends Generated::NamedPattern {
/** Holds if this named pattern has a corresponding `VarDecl` */
@@ -16,25 +7,9 @@ class NamedPattern extends Generated::NamedPattern {
/** Gets the `VarDecl` bound by this named pattern, if any. */
VarDecl getVarDecl() {
isSubPattern*(result.getParentPattern().getFullyUnresolved(), this) and
this.getEnclosingPattern*() = result.getParentPattern().getFullyUnresolved() and
result.getName() = this.getName()
}
override string toString() { result = this.getName() }
}
private predicate isSubPattern(Pattern p, Pattern sub) {
sub = p.(BindingPattern).getImmediateSubPattern()
or
sub = p.(EnumElementPattern).getImmediateSubPattern()
or
sub = p.(IsPattern).getImmediateSubPattern()
or
sub = p.(OptionalSomePattern).getImmediateSubPattern()
or
sub = p.(ParenPattern).getImmediateSubPattern()
or
sub = p.(TuplePattern).getImmediateElement(_)
or
sub = p.(TypedPattern).getImmediateSubPattern()
}

View File

@@ -65,4 +65,32 @@ class Pattern extends Generated::Pattern {
/** Holds if this pattern is matched against an expression. */
predicate hasMatchingExpr() { exists(this.getMatchingExpr()) }
/**
* Holds if this occurs as a sub-pattern of the result.
*/
Pattern getEnclosingPattern() {
this = result.(EnumElementPattern).getImmediateSubPattern()
or
this = result.(OptionalSomePattern).getImmediateSubPattern()
or
this = result.(TuplePattern).getImmediateElement(_)
or
result = this.getIdentityPreservingEnclosingPattern()
}
/**
* Holds if this occurs as a sub-pattern of the result
* without any intervening destructurings of
* complex data structures.
*/
Pattern getIdentityPreservingEnclosingPattern() {
this = result.(BindingPattern).getImmediateSubPattern()
or
this = result.(IsPattern).getImmediateSubPattern()
or
this = result.(ParenPattern).getImmediateSubPattern()
or
this = result.(TypedPattern).getImmediateSubPattern()
}
}