Skip to content

Commit 7d5dd38

Browse files
committed
Swift: extract UnresolvedPatternExpr
1 parent 7c3cadc commit 7d5dd38

File tree

7 files changed

+26
-2
lines changed

7 files changed

+26
-2
lines changed

swift/codegen/schema.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,8 @@ UnresolvedMemberExpr:
561561
UnresolvedPatternExpr:
562562
_extends: Expr
563563
_pragma: qltest_skip # we should really never extract these
564+
_children:
565+
sub_pattern: Pattern
564566

565567
UnresolvedSpecializeExpr:
566568
_extends: Expr

swift/extractor/visitors/ExprVisitor.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,5 +667,11 @@ void ExprVisitor::emitLookupExpr(const swift::LookupExpr* expr, TrapLabel<Lookup
667667
dispatcher_.emit(LookupExprMembersTrap{label, declLabel});
668668
}
669669
}
670+
codeql::UnresolvedPatternExpr ExprVisitor::translateUnresolvedPatternExpr(
671+
swift::UnresolvedPatternExpr& expr) {
672+
auto entry = dispatcher_.createEntry(expr);
673+
entry.sub_pattern = dispatcher_.fetchLabel(expr.getSubPattern());
674+
return entry;
675+
}
670676

671677
} // namespace codeql

swift/extractor/visitors/ExprVisitor.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ class ExprVisitor : public AstVisitorBase<ExprVisitor> {
8484
codeql::BridgeFromObjCExpr translateBridgeFromObjCExpr(const swift::BridgeFromObjCExpr& expr);
8585
codeql::DotSelfExpr translateDotSelfExpr(const swift::DotSelfExpr& expr);
8686
codeql::ErrorExpr translateErrorExpr(const swift::ErrorExpr& expr);
87+
// following requires non-const because:
88+
// * `swift::UnresolvedPatternExpr::getSubPattern` gives `const swift::Pattern*` on const refs
89+
// * `swift::ASTVisitor` only visits non-const pointers
90+
// either we accept this, or we fix constness by providing our own const visiting in VisitorBase
91+
codeql::UnresolvedPatternExpr translateUnresolvedPatternExpr(swift::UnresolvedPatternExpr& expr);
8792

8893
private:
8994
void fillAbstractClosureExpr(const swift::AbstractClosureExpr& expr,

swift/extractor/visitors/VisitorBase.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class VisitorBase {
2929
public: \
3030
void visit##CLASS##KIND(swift::CLASS##KIND* e) { \
3131
using TranslateResult = std::invoke_result_t<decltype(&CrtpSubclass::translate##CLASS##KIND), \
32-
CrtpSubclass, swift::CLASS##KIND>; \
32+
CrtpSubclass, swift::CLASS##KIND&>; \
3333
constexpr bool hasTranslateImplementation = !std::is_same_v<TranslateResult, void>; \
3434
if constexpr (hasTranslateImplementation) { \
3535
dispatcher_.emit(static_cast<CrtpSubclass*>(this)->translate##CLASS##KIND(*e)); \

swift/ql/lib/codeql/swift/generated/GetImmediateParent.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ Element getAnImmediateChild(Element e) {
144144
or
145145
unresolved_dot_exprs(e, x, _)
146146
or
147+
unresolved_pattern_exprs(e, x)
148+
or
147149
vararg_expansion_exprs(e, x)
148150
or
149151
binding_patterns(e, x)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
// generated by codegen/codegen.py
22
import codeql.swift.elements.expr.Expr
3+
import codeql.swift.elements.pattern.Pattern
34

45
class UnresolvedPatternExprBase extends @unresolved_pattern_expr, Expr {
56
override string getAPrimaryQlClass() { result = "UnresolvedPatternExpr" }
7+
8+
Pattern getSubPattern() {
9+
exists(Pattern x |
10+
unresolved_pattern_exprs(this, x) and
11+
result = x.resolve()
12+
)
13+
}
614
}

swift/ql/lib/swift.dbscheme

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1141,7 +1141,8 @@ unresolved_member_exprs( //dir=expr
11411141
);
11421142

11431143
unresolved_pattern_exprs( //dir=expr
1144-
unique int id: @unresolved_pattern_expr
1144+
unique int id: @unresolved_pattern_expr,
1145+
int sub_pattern: @pattern ref
11451146
);
11461147

11471148
unresolved_specialize_exprs( //dir=expr

0 commit comments

Comments
 (0)