mirror of
https://github.com/github/codeql.git
synced 2026-04-24 16:25:15 +02:00
Swift: add Pattern.getEnclosingPattern()
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user