Skip to content

Commit a3a01dd

Browse files
authored
Merge pull request github#11855 from d10c/swift/extract-captures
2 parents 65863f1 + ad5dbe1 commit a3a01dd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+10595
-68
lines changed

swift/downgrades/1e91ac9aed32bc07e5f5ad733aa4f29269ed0e77/old.dbscheme

Lines changed: 2547 additions & 0 deletions
Large diffs are not rendered by default.

swift/downgrades/1e91ac9aed32bc07e5f5ad733aa4f29269ed0e77/swift.dbscheme

Lines changed: 2519 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
description: Revert adding closure capture information
2+
compatibility: full
3+
4+
callable_captures.rel: delete
5+
captured_decls.rel: delete
6+
captured_decl_is_direct.rel: delete
7+
captured_decl_is_escaping.rel: delete

swift/extractor/infra/SwiftDispatcher.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ class SwiftDispatcher {
2929
const swift::Expr*,
3030
const swift::Pattern*,
3131
const swift::TypeRepr*,
32-
const swift::TypeBase*>;
32+
const swift::TypeBase*,
33+
const swift::CapturedValue*>;
3334

3435
template <typename E>
3536
static constexpr bool IsStorable = std::is_constructible_v<Store::Handle, const E&>;
@@ -218,6 +219,10 @@ class SwiftDispatcher {
218219
attachLocation(locatable->getStartLoc(), locatable->getEndLoc(), locatableLabel);
219220
}
220221

222+
void attachLocation(const swift::CapturedValue* capture, TrapLabel<LocatableTag> locatableLabel) {
223+
attachLocation(capture->getLoc(), locatableLabel);
224+
}
225+
221226
void attachLocation(const swift::IfConfigClause* clause, TrapLabel<LocatableTag> locatableLabel) {
222227
attachLocation(clause->Loc, clause->Loc, locatableLabel);
223228
}
@@ -364,6 +369,7 @@ class SwiftDispatcher {
364369
virtual void visit(const swift::Pattern* pattern) = 0;
365370
virtual void visit(const swift::TypeRepr* typeRepr, swift::Type type) = 0;
366371
virtual void visit(const swift::TypeBase* type) = 0;
372+
virtual void visit(const swift::CapturedValue* capture) = 0;
367373

368374
const swift::SourceManager& sourceManager;
369375
TrapDomain& trap;

swift/extractor/infra/SwiftTagTraits.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ MAP(std::filesystem::path, DbFileTag)
3232
MAP(swift::StmtCondition, StmtConditionTag)
3333
MAP(swift::StmtConditionElement, ConditionElementTag)
3434
MAP(swift::CaseLabelItem, CaseLabelItemTag)
35+
MAP(swift::CapturedValue, CapturedDeclTag)
3536

3637
MAP(swift::Stmt, StmtTag)
3738
MAP(swift::BraceStmt, BraceStmtTag)

swift/extractor/translators/DeclTranslator.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ void DeclTranslator::fillAbstractFunctionDecl(const swift::AbstractFunctionDecl&
334334
entry.params = dispatcher.fetchRepeatedLabels(*decl.getParameters());
335335
auto self = const_cast<swift::ParamDecl* const>(decl.getImplicitSelfDecl());
336336
entry.self_param = dispatcher.fetchOptionalLabel(self);
337+
entry.captures = dispatcher.fetchRepeatedLabels(decl.getCaptureInfo().getCaptures());
337338
fillValueDecl(decl, entry);
338339
fillGenericContext(decl, entry);
339340
}
@@ -439,4 +440,14 @@ codeql::MissingMemberDecl DeclTranslator::translateMissingMemberDecl(
439440
entry.name = decl.getName().getBaseName().userFacingName().str();
440441
return entry;
441442
}
443+
444+
codeql::CapturedDecl DeclTranslator::translateCapturedValue(const swift::CapturedValue& capture) {
445+
codeql::CapturedDecl entry{dispatcher.template assignNewLabel(capture)};
446+
auto decl = capture.getDecl();
447+
entry.decl = dispatcher.fetchLabel(decl);
448+
entry.module = dispatcher.fetchLabel(decl->getModuleContext());
449+
entry.is_direct = capture.isDirect();
450+
entry.is_escaping = !capture.isNoEscape();
451+
return entry;
452+
}
442453
} // namespace codeql

swift/extractor/translators/DeclTranslator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class DeclTranslator : public AstTranslatorBase<DeclTranslator> {
4848
std::optional<codeql::OpaqueTypeDecl> translateOpaqueTypeDecl(const swift::OpaqueTypeDecl& decl);
4949
codeql::PoundDiagnosticDecl translatePoundDiagnosticDecl(const swift::PoundDiagnosticDecl& decl);
5050
codeql::MissingMemberDecl translateMissingMemberDecl(const swift::MissingMemberDecl& decl);
51+
codeql::CapturedDecl translateCapturedValue(const swift::CapturedValue& capture);
5152

5253
private:
5354
std::string mangledName(const swift::ValueDecl& decl);

swift/extractor/translators/ExprTranslator.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ void ExprTranslator::fillAbstractClosureExpr(const swift::AbstractClosureExpr& e
477477
assert(expr.getParameters() && "AbstractClosureExpr has getParameters()");
478478
entry.params = dispatcher.fetchRepeatedLabels(*expr.getParameters());
479479
entry.body = dispatcher.fetchLabel(expr.getBody());
480+
entry.captures = dispatcher.fetchRepeatedLabels(expr.getCaptureInfo().getCaptures());
480481
}
481482

482483
TrapLabel<ArgumentTag> ExprTranslator::emitArgument(const swift::Argument& arg) {

swift/extractor/translators/SwiftVisitor.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ class SwiftVisitor : private SwiftDispatcher {
3939
typeTranslator.translateAndEmit(*typeRepr, type);
4040
}
4141

42+
void visit(const swift::CapturedValue* capture) override {
43+
declTranslator.translateAndEmit(*capture);
44+
}
45+
4246
DeclTranslator declTranslator{*this};
4347
ExprTranslator exprTranslator{*this};
4448
StmtTranslator stmtTranslator{*this};

swift/extractor/translators/TranslatorBase.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ class AstTranslatorBase : private swift::ASTVisitor<CrtpSubclass>,
118118
swift::ASTVisitor<CrtpSubclass>::visit(const_cast<E*>(&entity));
119119
}
120120

121+
void translateAndEmit(const swift::CapturedValue& e) {
122+
dispatcher.emit(static_cast<CrtpSubclass*>(this)->translateCapturedValue(e));
123+
}
124+
121125
private:
122126
friend class swift::ASTVisitor<CrtpSubclass>;
123127

0 commit comments

Comments
 (0)