File tree Expand file tree Collapse file tree 9 files changed +39
-2
lines changed
ql/lib/codeql/swift/elements/decl Expand file tree Collapse file tree 9 files changed +39
-2
lines changed Original file line number Diff line number Diff line change @@ -29,7 +29,8 @@ class SwiftDispatcher {
29
29
const swift::Expr*,
30
30
const swift::Pattern*,
31
31
const swift::TypeRepr*,
32
- const swift::TypeBase*>;
32
+ const swift::TypeBase*,
33
+ const swift::CapturedValue*>;
33
34
34
35
template <typename E>
35
36
static constexpr bool IsStorable = std::is_constructible_v<Store::Handle, const E&>;
@@ -218,6 +219,10 @@ class SwiftDispatcher {
218
219
attachLocation (locatable->getStartLoc (), locatable->getEndLoc (), locatableLabel);
219
220
}
220
221
222
+ void attachLocation (const swift::CapturedValue* capture, TrapLabel<LocatableTag> locatableLabel) {
223
+ attachLocation (capture->getLoc (), locatableLabel);
224
+ }
225
+
221
226
void attachLocation (const swift::IfConfigClause* clause, TrapLabel<LocatableTag> locatableLabel) {
222
227
attachLocation (clause->Loc , clause->Loc , locatableLabel);
223
228
}
@@ -364,6 +369,7 @@ class SwiftDispatcher {
364
369
virtual void visit (const swift::Pattern* pattern) = 0;
365
370
virtual void visit (const swift::TypeRepr* typeRepr, swift::Type type) = 0;
366
371
virtual void visit (const swift::TypeBase* type) = 0;
372
+ virtual void visit (const swift::CapturedValue* capture) = 0;
367
373
368
374
const swift::SourceManager& sourceManager;
369
375
TrapDomain& trap;
Original file line number Diff line number Diff line change @@ -32,6 +32,7 @@ MAP(std::filesystem::path, DbFileTag)
32
32
MAP (swift::StmtCondition, StmtConditionTag)
33
33
MAP (swift::StmtConditionElement, ConditionElementTag)
34
34
MAP (swift::CaseLabelItem, CaseLabelItemTag)
35
+ MAP (swift::CapturedValue, CapturedDeclTag)
35
36
36
37
MAP (swift::Stmt, StmtTag)
37
38
MAP (swift::BraceStmt, BraceStmtTag)
Original file line number Diff line number Diff line change @@ -439,4 +439,14 @@ codeql::MissingMemberDecl DeclTranslator::translateMissingMemberDecl(
439
439
entry.name = decl.getName ().getBaseName ().userFacingName ().str ();
440
440
return entry;
441
441
}
442
+
443
+ codeql::CapturedDecl DeclTranslator::translateCapturedValue (const swift::CapturedValue& capture) {
444
+ codeql::CapturedDecl entry{dispatcher.template assignNewLabel (capture)};
445
+ auto decl = capture.getDecl ();
446
+ entry.decl = dispatcher.fetchLabel (decl);
447
+ entry.module = dispatcher.fetchLabel (decl->getModuleContext ());
448
+ entry.is_direct = capture.isDirect ();
449
+ entry.is_escaping = !capture.isNoEscape ();
450
+ return entry;
451
+ }
442
452
} // namespace codeql
Original file line number Diff line number Diff line change @@ -48,6 +48,7 @@ class DeclTranslator : public AstTranslatorBase<DeclTranslator> {
48
48
std::optional<codeql::OpaqueTypeDecl> translateOpaqueTypeDecl (const swift::OpaqueTypeDecl& decl);
49
49
codeql::PoundDiagnosticDecl translatePoundDiagnosticDecl (const swift::PoundDiagnosticDecl& decl);
50
50
codeql::MissingMemberDecl translateMissingMemberDecl (const swift::MissingMemberDecl& decl);
51
+ codeql::CapturedDecl translateCapturedValue (const swift::CapturedValue& capture);
51
52
52
53
private:
53
54
std::string mangledName (const swift::ValueDecl& decl);
Original file line number Diff line number Diff line change @@ -477,6 +477,7 @@ void ExprTranslator::fillAbstractClosureExpr(const swift::AbstractClosureExpr& e
477
477
assert (expr.getParameters () && " AbstractClosureExpr has getParameters()" );
478
478
entry.params = dispatcher.fetchRepeatedLabels (*expr.getParameters ());
479
479
entry.body = dispatcher.fetchLabel (expr.getBody ());
480
+ entry.captures = dispatcher.fetchRepeatedLabels (expr.getCaptureInfo ().getCaptures ());
480
481
}
481
482
482
483
TrapLabel<ArgumentTag> ExprTranslator::emitArgument (const swift::Argument& arg) {
Original file line number Diff line number Diff line change @@ -39,6 +39,10 @@ class SwiftVisitor : private SwiftDispatcher {
39
39
typeTranslator.translateAndEmit (*typeRepr, type);
40
40
}
41
41
42
+ void visit (const swift::CapturedValue* capture) override {
43
+ declTranslator.translateAndEmit (*capture);
44
+ }
45
+
42
46
DeclTranslator declTranslator{*this };
43
47
ExprTranslator exprTranslator{*this };
44
48
StmtTranslator stmtTranslator{*this };
Original file line number Diff line number Diff line change @@ -118,6 +118,10 @@ class AstTranslatorBase : private swift::ASTVisitor<CrtpSubclass>,
118
118
swift::ASTVisitor<CrtpSubclass>::visit (const_cast <E*>(&entity));
119
119
}
120
120
121
+ void translateAndEmit (const swift::CapturedValue& e) {
122
+ dispatcher.emit (static_cast <CrtpSubclass*>(this )->translateCapturedValue (e));
123
+ }
124
+
121
125
private:
122
126
friend class swift ::ASTVisitor<CrtpSubclass>;
123
127
Original file line number Diff line number Diff line change
1
+ private import codeql.swift.generated.decl.CapturedDecl
2
+
3
+ class CapturedDecl extends Generated:: CapturedDecl {
4
+ override string toString ( ) { result = this .getDecl ( ) .toString ( ) }
5
+ }
Original file line number Diff line number Diff line change @@ -340,7 +340,7 @@ class Argument(Locatable):
340
340
expr : Expr | child
341
341
342
342
class AbstractClosureExpr (Expr , Callable ):
343
- pass
343
+ captures : list [ "CapturedDecl" ] | child
344
344
345
345
class AnyTryExpr (Expr ):
346
346
sub_expr : Expr | child
@@ -362,6 +362,11 @@ class AssignExpr(Expr):
362
362
class BindOptionalExpr (Expr ):
363
363
sub_expr : Expr | child
364
364
365
+ class CapturedDecl (Decl ):
366
+ decl : ValueDecl | doc ("the declaration captured by the parent closure" )
367
+ is_direct : predicate
368
+ is_escaping : predicate
369
+
365
370
class CaptureListExpr (Expr ):
366
371
binding_decls : list [PatternBindingDecl ] | child
367
372
closure_body : "ClosureExpr" | child
You can’t perform that action at this time.
0 commit comments