Skip to content

Commit feb8243

Browse files
committed
Swift: move BindingPattern to the hidden AST
1 parent 9e8867a commit feb8243

File tree

6 files changed

+50
-59
lines changed

6 files changed

+50
-59
lines changed

swift/ql/lib/codeql/swift/controlflow/internal/Completion.qll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ predicate catchMatchingPattern(DoCatchStmt s, CaseStmt c, Pattern pattern) {
222222

223223
/** Holds if `sub` is a subpattern of `p`. */
224224
private predicate isSubPattern(Pattern p, Pattern sub) {
225-
sub = p.(BindingPattern).getSubPattern().getFullyUnresolved()
225+
sub = p.(BindingPattern).getResolveStep()
226226
or
227227
sub = p.(EnumElementPattern).getSubPattern().getFullyUnresolved()
228228
or
@@ -260,8 +260,6 @@ private string getPatternValue(Pattern p) {
260260
private predicate isIrrefutableMatch(Pattern p) {
261261
(p instanceof NamedPattern or p instanceof AnyPattern)
262262
or
263-
isIrrefutableMatch(p.(BindingPattern).getSubPattern().getFullyUnresolved())
264-
or
265263
isIrrefutableMatch(p.(TypedPattern).getSubPattern().getFullyUnresolved())
266264
or
267265
// A pattern hidden underneath a conversion is also an irrefutable pattern.

swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -897,21 +897,12 @@ module Patterns {
897897
}
898898
}
899899

900-
private class BindingTree extends AstPostOrderTree {
900+
private class BindingTree extends AstStandardPostOrderTree {
901901
override BindingPattern ast;
902902

903-
final override predicate propagatesAbnormal(ControlFlowElement n) {
904-
n.asAstNode() = ast.getSubPattern().getFullyUnresolved()
905-
}
906-
907-
final override predicate first(ControlFlowElement n) {
908-
astFirst(ast.getSubPattern().getFullyUnresolved(), n)
909-
}
910-
911-
override predicate succ(ControlFlowElement pred, ControlFlowElement succ, Completion c) {
912-
astLast(ast.getSubPattern().getFullyUnresolved(), pred, c) and
913-
c.(MatchingCompletion).isMatch() and
914-
succ.asAstNode() = ast
903+
final override ControlFlowElement getChildElement(int i) {
904+
i = 0 and
905+
result.asAstNode() = ast.getResolveStep()
915906
}
916907
}
917908

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
private import codeql.swift.generated.pattern.BindingPattern
22

33
class BindingPattern extends Generated::BindingPattern {
4+
final override Pattern getResolveStep() { result = getImmediateSubPattern() }
5+
46
override string toString() { result = "let ..." }
57
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
| statements.swift:3:8:3:13 | ... .==(_:_:) ... | statements.swift:3:8:3:13 | ... .==(_:_:) ... |
22
| statements.swift:10:17:10:24 | ... .<(_:_:) ... | statements.swift:10:18:10:22 | ... .<(_:_:) ... |
33
| statements.swift:39:9:39:14 | ... .!=(_:_:) ... | statements.swift:39:9:39:14 | ... .!=(_:_:) ... |
4-
| statements.swift:65:4:65:19 | let ... = ... | statements.swift:65:9:65:15 | let ... |
5-
| statements.swift:65:4:65:19 | let ... = ... | statements.swift:65:19:65:19 | x |
4+
| statements.swift:65:4:65:19 | let ...? = ... | statements.swift:65:13:65:15 | let ...? |
5+
| statements.swift:65:4:65:19 | let ...? = ... | statements.swift:65:19:65:19 | x |
66
| statements.swift:67:4:67:20 | .some(...) = ... | statements.swift:67:9:67:16 | .some(...) |
77
| statements.swift:67:4:67:20 | .some(...) = ... | statements.swift:67:20:67:20 | x |

swift/ql/test/library-tests/ast/PrintAst.expected

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,8 @@ cfg.swift:
180180
# 35| getPattern(): [IsPattern] ... is ...
181181
# 35| getSubPattern(): [EnumElementPattern] .error3(...)
182182
# 35| getSubPattern(): [TuplePattern] (...)
183-
# 35| getElement(0): [BindingPattern] let ...
184-
# 35| getSubPattern(): [NamedPattern] withParam
183+
# 35| getElement(0): [NamedPattern] withParam
184+
# 35| getElement(0).getFullyUnresolved(): [BindingPattern] let ...
185185
# 37| getCatch(2): [CaseStmt] case ...
186186
# 37| getBody(): [BraceStmt] { ... }
187187
# 38| getElement(0): [CallExpr] call to print(_:separator:terminator:)
@@ -239,9 +239,9 @@ cfg.swift:
239239
# 40| getExpr(): [DefaultArgumentExpr] default separator
240240
# 40| getArgument(2): [Argument] terminator: default terminator
241241
# 40| getExpr(): [DefaultArgumentExpr] default terminator
242-
# 39| getLabel(0): [CaseLabelItem] let ...
243-
# 39| getPattern(): [BindingPattern] let ...
244-
# 39| getSubPattern(): [NamedPattern] error
242+
# 39| getLabel(0): [CaseLabelItem] error
243+
# 39| getPattern(): [NamedPattern] error
244+
# 39| getPattern().getFullyUnresolved(): [BindingPattern] let ...
245245
# 42| getElement(1): [ReturnStmt] return ...
246246
# 42| getResult(): [IntegerLiteralExpr] 0
247247
# 35| [ConcreteVarDecl] withParam
@@ -803,9 +803,9 @@ cfg.swift:
803803
# 156| getCondition(): [StmtCondition] StmtCondition
804804
# 156| getElement(0): [ConditionElement] .some(...) = ...
805805
# 156| getPattern(): [EnumElementPattern] .some(...)
806-
# 156| getSubPattern(): [BindingPattern] let ...
807-
# 156| getSubPattern(): [NamedPattern] x
806+
# 156| getSubPattern(): [NamedPattern] x
808807
# 156| getSubPattern().getFullyUnresolved(): [ParenPattern] (...)
808+
# 156| getImmediateSubPattern(): [BindingPattern] let ...
809809
# 156| getInitializer(): [DeclRefExpr] xOptional
810810
# 156| getThen(): [BraceStmt] { ... }
811811
# 157| getElement(0): [ReturnStmt] return ...
@@ -5375,11 +5375,11 @@ patterns.swift:
53755375
# 12| getCase(0): [CaseStmt] case ...
53765376
# 12| getBody(): [BraceStmt] { ... }
53775377
# 12| getElement(0): [StringLiteralExpr] binding
5378-
# 12| getLabel(0): [CaseLabelItem] let ...
5379-
# 12| getPattern(): [BindingPattern] let ...
5380-
# 12| getSubPattern(): [TuplePattern] (...)
5381-
# 12| getElement(0): [NamedPattern] xx
5382-
# 12| getElement(1): [NamedPattern] yy
5378+
# 12| getLabel(0): [CaseLabelItem] (...)
5379+
# 12| getPattern(): [TuplePattern] (...)
5380+
# 12| getElement(0): [NamedPattern] xx
5381+
# 12| getElement(1): [NamedPattern] yy
5382+
# 12| getPattern().getFullyUnresolved(): [BindingPattern] let ...
53835383
# 15| getElement(3): [SwitchStmt] switch 3 { ... }
53845384
# 15| getExpr(): [IntegerLiteralExpr] 3
53855385
# 16| getCase(0): [CaseStmt] case ...
@@ -5424,12 +5424,12 @@ patterns.swift:
54245424
# 28| getCase(1): [CaseStmt] case ...
54255425
# 28| getBody(): [BraceStmt] { ... }
54265426
# 28| getElement(0): [DeclRefExpr] i
5427-
# 28| getLabel(0): [CaseLabelItem] let ...
5428-
# 28| getPattern(): [BindingPattern] let ...
5429-
# 28| getSubPattern(): [EnumElementPattern] .baz(...)
5430-
# 28| getSubPattern(): [TuplePattern] (...)
5431-
# 28| getElement(0): [NamedPattern] i
5432-
# 28| getElement(1): [NamedPattern] s
5427+
# 28| getLabel(0): [CaseLabelItem] .baz(...)
5428+
# 28| getPattern(): [EnumElementPattern] .baz(...)
5429+
# 28| getSubPattern(): [TuplePattern] (...)
5430+
# 28| getElement(0): [NamedPattern] i
5431+
# 28| getElement(1): [NamedPattern] s
5432+
# 28| getPattern().getFullyUnresolved(): [BindingPattern] let ...
54335433
# 31| getElement(8): [PatternBindingDecl] var ... = ...
54345434
# 31| getInit(0): [NilLiteralExpr] nil
54355435
# 31| getPattern(0): [TypedPattern] ... as ...
@@ -5442,10 +5442,10 @@ patterns.swift:
54425442
# 34| getCase(0): [CaseStmt] case ...
54435443
# 34| getBody(): [BraceStmt] { ... }
54445444
# 34| getElement(0): [DeclRefExpr] n
5445-
# 34| getLabel(0): [CaseLabelItem] let ...
5446-
# 34| getPattern(): [BindingPattern] let ...
5447-
# 34| getSubPattern(): [OptionalSomePattern] let ...?
5448-
# 34| getSubPattern(): [NamedPattern] n
5445+
# 34| getLabel(0): [CaseLabelItem] let ...?
5446+
# 34| getPattern(): [OptionalSomePattern] let ...?
5447+
# 34| getSubPattern(): [NamedPattern] n
5448+
# 34| getPattern().getFullyUnresolved(): [BindingPattern] let ...
54495449
# 35| getCase(1): [CaseStmt] case ...
54505450
# 35| getBody(): [BraceStmt] { ... }
54515451
# 35| getElement(0): [StringLiteralExpr] none
@@ -5470,11 +5470,11 @@ patterns.swift:
54705470
# 42| getCase(1): [CaseStmt] case ...
54715471
# 42| getBody(): [BraceStmt] { ... }
54725472
# 42| getElement(0): [StringLiteralExpr] as pattern
5473-
# 42| getLabel(0): [CaseLabelItem] let ...
5474-
# 42| getPattern(): [BindingPattern] let ...
5475-
# 42| getSubPattern(): [IsPattern] ... is ...
5476-
# 42| getCastTypeRepr(): [TypeRepr] String
5477-
# 42| getSubPattern(): [NamedPattern] x
5473+
# 42| getLabel(0): [CaseLabelItem] ... is ...
5474+
# 42| getPattern(): [IsPattern] ... is ...
5475+
# 42| getCastTypeRepr(): [TypeRepr] String
5476+
# 42| getSubPattern(): [NamedPattern] x
5477+
# 42| getPattern().getFullyUnresolved(): [BindingPattern] let ...
54785478
# 43| getCase(2): [CaseStmt] case ...
54795479
# 43| getBody(): [BraceStmt] { ... }
54805480
# 43| getElement(0): [StringLiteralExpr] other
@@ -5621,9 +5621,9 @@ statements.swift:
56215621
# 22| getExpr(): [DefaultArgumentExpr] default separator
56225622
# 22| getArgument(2): [Argument] terminator: default terminator
56235623
# 22| getExpr(): [DefaultArgumentExpr] default terminator
5624-
# 21| getLabel(0): [CaseLabelItem] let ...
5625-
# 21| getPattern(): [BindingPattern] let ...
5626-
# 21| getSubPattern(): [NamedPattern] error
5624+
# 21| getLabel(0): [CaseLabelItem] error
5625+
# 21| getPattern(): [NamedPattern] error
5626+
# 21| getPattern().getFullyUnresolved(): [BindingPattern] let ...
56275627
# 25| getElement(7): [DoCatchStmt] do { ... } catch { ... }
56285628
# 25| getBody(): [BraceStmt] { ... }
56295629
# 26| getElement(0): [TryExpr] try ...
@@ -5660,9 +5660,9 @@ statements.swift:
56605660
# 30| getExpr(): [DefaultArgumentExpr] default separator
56615661
# 30| getArgument(2): [Argument] terminator: default terminator
56625662
# 30| getExpr(): [DefaultArgumentExpr] default terminator
5663-
# 29| getLabel(0): [CaseLabelItem] let ...
5664-
# 29| getPattern(): [BindingPattern] let ...
5665-
# 29| getSubPattern(): [NamedPattern] error
5663+
# 29| getLabel(0): [CaseLabelItem] error
5664+
# 29| getPattern(): [NamedPattern] error
5665+
# 29| getPattern().getFullyUnresolved(): [BindingPattern] let ...
56665666
# 2| [ConcreteVarDecl] i
56675667
# 2| Type = Int
56685668
# 21| [ConcreteVarDecl] error
@@ -5884,10 +5884,10 @@ statements.swift:
58845884
# 65| getBody(): [BraceStmt] { ... }
58855885
# 65| getElement(0): [IfStmt] if ... then { ... }
58865886
# 65| getCondition(): [StmtCondition] StmtCondition
5887-
# 65| getElement(0): [ConditionElement] let ... = ...
5888-
# 65| getPattern(): [BindingPattern] let ...
5889-
# 65| getSubPattern(): [OptionalSomePattern] let ...?
5890-
# 65| getSubPattern(): [NamedPattern] xx
5887+
# 65| getElement(0): [ConditionElement] let ...? = ...
5888+
# 65| getPattern(): [OptionalSomePattern] let ...?
5889+
# 65| getSubPattern(): [NamedPattern] xx
5890+
# 65| getPattern().getFullyUnresolved(): [BindingPattern] let ...
58915891
# 65| getInitializer(): [DeclRefExpr] x
58925892
# 65| getThen(): [BraceStmt] { ... }
58935893
# 67| [TopLevelCodeDecl] { ... }

swift/ql/test/library-tests/controlflow/graph/Cfg.expected

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -334,17 +334,17 @@ cfg.swift:
334334
#-----| -> default separator
335335

336336
# 39| case ...
337-
#-----| -> let ...
337+
#-----| -> error
338+
339+
# 39| error
340+
#-----| -> error
338341

339342
# 39| error
340343
#-----| match -> let ...
341344

342345
# 39| let ...
343346
#-----| match -> print(_:separator:terminator:)
344347

345-
# 39| let ...
346-
#-----| -> error
347-
348348
# 40| print(_:separator:terminator:)
349349

350350
# 40| call to print(_:separator:terminator:)

0 commit comments

Comments
 (0)