Swift: move BindingPattern to the hidden AST

This commit is contained in:
Nora Dimitrijević
2023-02-08 19:00:47 +01:00
parent 9e8867aa96
commit feb8243d5f
6 changed files with 50 additions and 59 deletions

View File

@@ -222,7 +222,7 @@ predicate catchMatchingPattern(DoCatchStmt s, CaseStmt c, Pattern pattern) {
/** Holds if `sub` is a subpattern of `p`. */
private predicate isSubPattern(Pattern p, Pattern sub) {
sub = p.(BindingPattern).getSubPattern().getFullyUnresolved()
sub = p.(BindingPattern).getResolveStep()
or
sub = p.(EnumElementPattern).getSubPattern().getFullyUnresolved()
or
@@ -260,8 +260,6 @@ private string getPatternValue(Pattern p) {
private predicate isIrrefutableMatch(Pattern p) {
(p instanceof NamedPattern or p instanceof AnyPattern)
or
isIrrefutableMatch(p.(BindingPattern).getSubPattern().getFullyUnresolved())
or
isIrrefutableMatch(p.(TypedPattern).getSubPattern().getFullyUnresolved())
or
// A pattern hidden underneath a conversion is also an irrefutable pattern.

View File

@@ -897,21 +897,12 @@ module Patterns {
}
}
private class BindingTree extends AstPostOrderTree {
private class BindingTree extends AstStandardPostOrderTree {
override BindingPattern ast;
final override predicate propagatesAbnormal(ControlFlowElement n) {
n.asAstNode() = ast.getSubPattern().getFullyUnresolved()
}
final override predicate first(ControlFlowElement n) {
astFirst(ast.getSubPattern().getFullyUnresolved(), n)
}
override predicate succ(ControlFlowElement pred, ControlFlowElement succ, Completion c) {
astLast(ast.getSubPattern().getFullyUnresolved(), pred, c) and
c.(MatchingCompletion).isMatch() and
succ.asAstNode() = ast
final override ControlFlowElement getChildElement(int i) {
i = 0 and
result.asAstNode() = ast.getResolveStep()
}
}

View File

@@ -1,5 +1,7 @@
private import codeql.swift.generated.pattern.BindingPattern
class BindingPattern extends Generated::BindingPattern {
final override Pattern getResolveStep() { result = getImmediateSubPattern() }
override string toString() { result = "let ..." }
}

View File

@@ -1,7 +1,7 @@
| statements.swift:3:8:3:13 | ... .==(_:_:) ... | statements.swift:3:8:3:13 | ... .==(_:_:) ... |
| statements.swift:10:17:10:24 | ... .<(_:_:) ... | statements.swift:10:18:10:22 | ... .<(_:_:) ... |
| statements.swift:39:9:39:14 | ... .!=(_:_:) ... | statements.swift:39:9:39:14 | ... .!=(_:_:) ... |
| statements.swift:65:4:65:19 | let ... = ... | statements.swift:65:9:65:15 | let ... |
| statements.swift:65:4:65:19 | let ... = ... | statements.swift:65:19:65:19 | x |
| statements.swift:65:4:65:19 | let ...? = ... | statements.swift:65:13:65:15 | let ...? |
| statements.swift:65:4:65:19 | let ...? = ... | statements.swift:65:19:65:19 | x |
| statements.swift:67:4:67:20 | .some(...) = ... | statements.swift:67:9:67:16 | .some(...) |
| statements.swift:67:4:67:20 | .some(...) = ... | statements.swift:67:20:67:20 | x |

View File

@@ -180,8 +180,8 @@ cfg.swift:
# 35| getPattern(): [IsPattern] ... is ...
# 35| getSubPattern(): [EnumElementPattern] .error3(...)
# 35| getSubPattern(): [TuplePattern] (...)
# 35| getElement(0): [BindingPattern] let ...
# 35| getSubPattern(): [NamedPattern] withParam
# 35| getElement(0): [NamedPattern] withParam
# 35| getElement(0).getFullyUnresolved(): [BindingPattern] let ...
# 37| getCatch(2): [CaseStmt] case ...
# 37| getBody(): [BraceStmt] { ... }
# 38| getElement(0): [CallExpr] call to print(_:separator:terminator:)
@@ -239,9 +239,9 @@ cfg.swift:
# 40| getExpr(): [DefaultArgumentExpr] default separator
# 40| getArgument(2): [Argument] terminator: default terminator
# 40| getExpr(): [DefaultArgumentExpr] default terminator
# 39| getLabel(0): [CaseLabelItem] let ...
# 39| getPattern(): [BindingPattern] let ...
# 39| getSubPattern(): [NamedPattern] error
# 39| getLabel(0): [CaseLabelItem] error
# 39| getPattern(): [NamedPattern] error
# 39| getPattern().getFullyUnresolved(): [BindingPattern] let ...
# 42| getElement(1): [ReturnStmt] return ...
# 42| getResult(): [IntegerLiteralExpr] 0
# 35| [ConcreteVarDecl] withParam
@@ -803,9 +803,9 @@ cfg.swift:
# 156| getCondition(): [StmtCondition] StmtCondition
# 156| getElement(0): [ConditionElement] .some(...) = ...
# 156| getPattern(): [EnumElementPattern] .some(...)
# 156| getSubPattern(): [BindingPattern] let ...
# 156| getSubPattern(): [NamedPattern] x
# 156| getSubPattern(): [NamedPattern] x
# 156| getSubPattern().getFullyUnresolved(): [ParenPattern] (...)
# 156| getImmediateSubPattern(): [BindingPattern] let ...
# 156| getInitializer(): [DeclRefExpr] xOptional
# 156| getThen(): [BraceStmt] { ... }
# 157| getElement(0): [ReturnStmt] return ...
@@ -5375,11 +5375,11 @@ patterns.swift:
# 12| getCase(0): [CaseStmt] case ...
# 12| getBody(): [BraceStmt] { ... }
# 12| getElement(0): [StringLiteralExpr] binding
# 12| getLabel(0): [CaseLabelItem] let ...
# 12| getPattern(): [BindingPattern] let ...
# 12| getSubPattern(): [TuplePattern] (...)
# 12| getElement(0): [NamedPattern] xx
# 12| getElement(1): [NamedPattern] yy
# 12| getLabel(0): [CaseLabelItem] (...)
# 12| getPattern(): [TuplePattern] (...)
# 12| getElement(0): [NamedPattern] xx
# 12| getElement(1): [NamedPattern] yy
# 12| getPattern().getFullyUnresolved(): [BindingPattern] let ...
# 15| getElement(3): [SwitchStmt] switch 3 { ... }
# 15| getExpr(): [IntegerLiteralExpr] 3
# 16| getCase(0): [CaseStmt] case ...
@@ -5424,12 +5424,12 @@ patterns.swift:
# 28| getCase(1): [CaseStmt] case ...
# 28| getBody(): [BraceStmt] { ... }
# 28| getElement(0): [DeclRefExpr] i
# 28| getLabel(0): [CaseLabelItem] let ...
# 28| getPattern(): [BindingPattern] let ...
# 28| getSubPattern(): [EnumElementPattern] .baz(...)
# 28| getSubPattern(): [TuplePattern] (...)
# 28| getElement(0): [NamedPattern] i
# 28| getElement(1): [NamedPattern] s
# 28| getLabel(0): [CaseLabelItem] .baz(...)
# 28| getPattern(): [EnumElementPattern] .baz(...)
# 28| getSubPattern(): [TuplePattern] (...)
# 28| getElement(0): [NamedPattern] i
# 28| getElement(1): [NamedPattern] s
# 28| getPattern().getFullyUnresolved(): [BindingPattern] let ...
# 31| getElement(8): [PatternBindingDecl] var ... = ...
# 31| getInit(0): [NilLiteralExpr] nil
# 31| getPattern(0): [TypedPattern] ... as ...
@@ -5442,10 +5442,10 @@ patterns.swift:
# 34| getCase(0): [CaseStmt] case ...
# 34| getBody(): [BraceStmt] { ... }
# 34| getElement(0): [DeclRefExpr] n
# 34| getLabel(0): [CaseLabelItem] let ...
# 34| getPattern(): [BindingPattern] let ...
# 34| getSubPattern(): [OptionalSomePattern] let ...?
# 34| getSubPattern(): [NamedPattern] n
# 34| getLabel(0): [CaseLabelItem] let ...?
# 34| getPattern(): [OptionalSomePattern] let ...?
# 34| getSubPattern(): [NamedPattern] n
# 34| getPattern().getFullyUnresolved(): [BindingPattern] let ...
# 35| getCase(1): [CaseStmt] case ...
# 35| getBody(): [BraceStmt] { ... }
# 35| getElement(0): [StringLiteralExpr] none
@@ -5470,11 +5470,11 @@ patterns.swift:
# 42| getCase(1): [CaseStmt] case ...
# 42| getBody(): [BraceStmt] { ... }
# 42| getElement(0): [StringLiteralExpr] as pattern
# 42| getLabel(0): [CaseLabelItem] let ...
# 42| getPattern(): [BindingPattern] let ...
# 42| getSubPattern(): [IsPattern] ... is ...
# 42| getCastTypeRepr(): [TypeRepr] String
# 42| getSubPattern(): [NamedPattern] x
# 42| getLabel(0): [CaseLabelItem] ... is ...
# 42| getPattern(): [IsPattern] ... is ...
# 42| getCastTypeRepr(): [TypeRepr] String
# 42| getSubPattern(): [NamedPattern] x
# 42| getPattern().getFullyUnresolved(): [BindingPattern] let ...
# 43| getCase(2): [CaseStmt] case ...
# 43| getBody(): [BraceStmt] { ... }
# 43| getElement(0): [StringLiteralExpr] other
@@ -5621,9 +5621,9 @@ statements.swift:
# 22| getExpr(): [DefaultArgumentExpr] default separator
# 22| getArgument(2): [Argument] terminator: default terminator
# 22| getExpr(): [DefaultArgumentExpr] default terminator
# 21| getLabel(0): [CaseLabelItem] let ...
# 21| getPattern(): [BindingPattern] let ...
# 21| getSubPattern(): [NamedPattern] error
# 21| getLabel(0): [CaseLabelItem] error
# 21| getPattern(): [NamedPattern] error
# 21| getPattern().getFullyUnresolved(): [BindingPattern] let ...
# 25| getElement(7): [DoCatchStmt] do { ... } catch { ... }
# 25| getBody(): [BraceStmt] { ... }
# 26| getElement(0): [TryExpr] try ...
@@ -5660,9 +5660,9 @@ statements.swift:
# 30| getExpr(): [DefaultArgumentExpr] default separator
# 30| getArgument(2): [Argument] terminator: default terminator
# 30| getExpr(): [DefaultArgumentExpr] default terminator
# 29| getLabel(0): [CaseLabelItem] let ...
# 29| getPattern(): [BindingPattern] let ...
# 29| getSubPattern(): [NamedPattern] error
# 29| getLabel(0): [CaseLabelItem] error
# 29| getPattern(): [NamedPattern] error
# 29| getPattern().getFullyUnresolved(): [BindingPattern] let ...
# 2| [ConcreteVarDecl] i
# 2| Type = Int
# 21| [ConcreteVarDecl] error
@@ -5884,10 +5884,10 @@ statements.swift:
# 65| getBody(): [BraceStmt] { ... }
# 65| getElement(0): [IfStmt] if ... then { ... }
# 65| getCondition(): [StmtCondition] StmtCondition
# 65| getElement(0): [ConditionElement] let ... = ...
# 65| getPattern(): [BindingPattern] let ...
# 65| getSubPattern(): [OptionalSomePattern] let ...?
# 65| getSubPattern(): [NamedPattern] xx
# 65| getElement(0): [ConditionElement] let ...? = ...
# 65| getPattern(): [OptionalSomePattern] let ...?
# 65| getSubPattern(): [NamedPattern] xx
# 65| getPattern().getFullyUnresolved(): [BindingPattern] let ...
# 65| getInitializer(): [DeclRefExpr] x
# 65| getThen(): [BraceStmt] { ... }
# 67| [TopLevelCodeDecl] { ... }

View File

@@ -334,7 +334,10 @@ cfg.swift:
#-----| -> default separator
# 39| case ...
#-----| -> let ...
#-----| -> error
# 39| error
#-----| -> error
# 39| error
#-----| match -> let ...
@@ -342,9 +345,6 @@ cfg.swift:
# 39| let ...
#-----| match -> print(_:separator:terminator:)
# 39| let ...
#-----| -> error
# 40| print(_:separator:terminator:)
# 40| call to print(_:separator:terminator:)