Skip to content

Commit 4101676

Browse files
authored
Merge pull request #9795 from github/redsun82/swift-extraction
Swift: extract more entities
2 parents eebba36 + 98fc881 commit 4101676

File tree

53 files changed

+410
-17
lines changed

Some content is hidden

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

53 files changed

+410
-17
lines changed

swift/codegen/schema.yml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,16 @@ EnumCaseDecl:
274274

275275
IfConfigDecl:
276276
_extends: Decl
277+
_children:
278+
clauses: IfConfigClause*
279+
280+
IfConfigClause:
281+
_extends: Locatable
282+
_children:
283+
condition: Expr?
284+
elements: AstNode*
285+
is_active: predicate
286+
_dir: decl
277287

278288
ImportDecl:
279289
_extends: Decl
@@ -550,7 +560,6 @@ TypeExpr:
550560
UnresolvedDeclRefExpr:
551561
_extends: Expr
552562
name: string?
553-
_pragma: qltest_skip # we should really never extract these
554563

555564
UnresolvedDotExpr:
556565
_extends: Expr
@@ -565,7 +574,8 @@ UnresolvedMemberExpr:
565574

566575
UnresolvedPatternExpr:
567576
_extends: Expr
568-
_pragma: qltest_skip # we should really never extract these
577+
_children:
578+
sub_pattern: Pattern
569579

570580
UnresolvedSpecializeExpr:
571581
_extends: Expr

swift/extractor/infra/SwiftDispatcher.h

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ class SwiftDispatcher {
9393
return fetchLabelFromUnion<AstNodeTag>(node);
9494
}
9595

96+
TrapLabel<IfConfigClauseTag> fetchLabel(const swift::IfConfigClause& clause) {
97+
return fetchLabel(&clause);
98+
}
99+
96100
TrapLabel<ConditionElementTag> fetchLabel(const swift::StmtConditionElement& element) {
97101
return fetchLabel(&element);
98102
}
@@ -140,6 +144,15 @@ class SwiftDispatcher {
140144
attachLocation(locatable->getStartLoc(), locatable->getEndLoc(), locatableLabel);
141145
}
142146

147+
void attachLocation(const swift::IfConfigClause* clause, TrapLabel<LocatableTag> locatableLabel) {
148+
attachLocation(clause->Loc, clause->Loc, locatableLabel);
149+
}
150+
151+
// Emits a Location TRAP entry and attaches it to a `Locatable` trap label for a given `SourceLoc`
152+
void attachLocation(swift::SourceLoc loc, TrapLabel<LocatableTag> locatableLabel) {
153+
attachLocation(loc, loc, locatableLabel);
154+
}
155+
143156
// Emits a Location TRAP entry for a list of swift entities and attaches it to a `Locatable` trap
144157
// label
145158
template <typename Locatable>
@@ -215,7 +228,8 @@ class SwiftDispatcher {
215228
swift::Expr,
216229
swift::Pattern,
217230
swift::TypeRepr,
218-
swift::TypeBase>;
231+
swift::TypeBase,
232+
swift::IfConfigClause>;
219233

220234
void attachLocation(swift::SourceLoc start,
221235
swift::SourceLoc end,
@@ -269,9 +283,11 @@ class SwiftDispatcher {
269283
return realPath.str().str();
270284
}
271285

272-
// TODO: The following methods are supposed to redirect TRAP emission to correpsonding visitors,
273-
// which are to be introduced in follow-up PRs
286+
// TODO: for const correctness these should consistently be `const` (and maybe const references
287+
// as we don't expect `nullptr` here. However `swift::ASTVisitor` and `swift::TypeVisitor` do not
288+
// accept const pointers
274289
virtual void visit(swift::Decl* decl) = 0;
290+
virtual void visit(const swift::IfConfigClause* clause) = 0;
275291
virtual void visit(swift::Stmt* stmt) = 0;
276292
virtual void visit(const swift::StmtCondition* cond) = 0;
277293
virtual void visit(const swift::StmtConditionElement* cond) = 0;

swift/extractor/infra/SwiftTagTraits.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ MAP_TAG(Argument);
4949
#include <swift/AST/ExprNodes.def>
5050

5151
MAP_TAG(Decl);
52+
MAP_TAG(IfConfigClause);
5253
#define ABSTRACT_DECL(CLASS, PARENT) MAP_SUBTAG(CLASS##Decl, PARENT)
5354
#define DECL(CLASS, PARENT) ABSTRACT_DECL(CLASS, PARENT)
5455
#include <swift/AST/DeclNodes.def>

swift/extractor/visitors/DeclVisitor.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,4 +358,18 @@ void DeclVisitor::fillAbstractStorageDecl(const swift::AbstractStorageDecl& decl
358358
fillValueDecl(decl, entry);
359359
}
360360

361+
codeql::IfConfigDecl DeclVisitor::translateIfConfigDecl(const swift::IfConfigDecl& decl) {
362+
auto entry = dispatcher_.createEntry(decl);
363+
entry.clauses = dispatcher_.fetchRepeatedLabels(decl.getClauses());
364+
return entry;
365+
}
366+
367+
codeql::IfConfigClause DeclVisitor::translateIfConfigClause(const swift::IfConfigClause& clause) {
368+
auto entry = dispatcher_.createEntry(clause);
369+
entry.condition = dispatcher_.fetchOptionalLabel(clause.Cond);
370+
entry.elements = dispatcher_.fetchRepeatedLabels(clause.Elements);
371+
entry.is_active = clause.isActive;
372+
return entry;
373+
}
374+
361375
} // namespace codeql

swift/extractor/visitors/DeclVisitor.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ namespace codeql {
1414
class DeclVisitor : public AstVisitorBase<DeclVisitor> {
1515
public:
1616
using AstVisitorBase<DeclVisitor>::AstVisitorBase;
17+
using AstVisitorBase<DeclVisitor>::visit;
18+
19+
void visit(const swift::IfConfigClause* clause) {
20+
dispatcher_.emit(translateIfConfigClause(*clause));
21+
}
1722

1823
std::variant<codeql::ConcreteFuncDecl, codeql::ConcreteFuncDeclsTrap> translateFuncDecl(
1924
const swift::FuncDecl& decl);
@@ -52,6 +57,8 @@ class DeclVisitor : public AstVisitorBase<DeclVisitor> {
5257
codeql::ExtensionDecl translateExtensionDecl(const swift::ExtensionDecl& decl);
5358
codeql::ImportDecl translateImportDecl(const swift::ImportDecl& decl);
5459
std::optional<codeql::ModuleDecl> translateModuleDecl(const swift::ModuleDecl& decl);
60+
codeql::IfConfigDecl translateIfConfigDecl(const swift::IfConfigDecl& decl);
61+
codeql::IfConfigClause translateIfConfigClause(const swift::IfConfigClause& clause);
5562

5663
private:
5764
std::string mangledName(const swift::ValueDecl& decl);

swift/extractor/visitors/ExprVisitor.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,4 +668,10 @@ void ExprVisitor::emitLookupExpr(const swift::LookupExpr* expr, TrapLabel<Lookup
668668
}
669669
}
670670

671+
codeql::UnresolvedPatternExpr ExprVisitor::translateUnresolvedPatternExpr(
672+
swift::UnresolvedPatternExpr& expr) {
673+
auto entry = dispatcher_.createEntry(expr);
674+
entry.sub_pattern = dispatcher_.fetchLabel(expr.getSubPattern());
675+
return entry;
676+
}
671677
} // namespace codeql

swift/extractor/visitors/ExprVisitor.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ 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+
// The following function requires a non-const parameter because:
88+
// * `swift::UnresolvedPatternExpr::getSubPattern` has a `const`-qualified overload returning
89+
// `const swift::Pattern*`
90+
// * `swift::ASTVisitor` only visits non-const pointers
91+
// either we accept this, or we fix constness, e.g. by providing `visit` on `const` pointers
92+
// in `VisitorBase`, or by doing a `const_cast` in `SwifDispatcher::fetchLabel`
93+
codeql::UnresolvedPatternExpr translateUnresolvedPatternExpr(swift::UnresolvedPatternExpr& expr);
8794

8895
private:
8996
void fillAbstractClosureExpr(const swift::AbstractClosureExpr& expr,

swift/extractor/visitors/SwiftVisitor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class SwiftVisitor : private SwiftDispatcher {
2121

2222
private:
2323
void visit(swift::Decl* decl) override { declVisitor.visit(decl); }
24+
void visit(const swift::IfConfigClause* clause) override { declVisitor.visit(clause); }
2425
void visit(swift::Stmt* stmt) override { stmtVisitor.visit(stmt); }
2526
void visit(const swift::StmtCondition* cond) override {
2627
emit(stmtVisitor.translateStmtCondition(*cond));

swift/extractor/visitors/TypeVisitor.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "swift/extractor/visitors/TypeVisitor.h"
2+
23
namespace codeql {
34
void TypeVisitor::visit(swift::TypeBase* type) {
45
TypeVisitorBase<TypeVisitor>::visit(type);
@@ -368,4 +369,10 @@ codeql::BuiltinVectorType TypeVisitor::translateBuiltinVectorType(
368369
return createTypeEntry(type);
369370
}
370371

372+
codeql::OpenedArchetypeType TypeVisitor::translateOpenedArchetypeType(
373+
const swift::OpenedArchetypeType& type) {
374+
auto entry = createTypeEntry(type);
375+
fillArchetypeType(type, entry);
376+
return entry;
377+
}
371378
} // namespace codeql

swift/extractor/visitors/TypeVisitor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class TypeVisitor : public TypeVisitorBase<TypeVisitor> {
6868
codeql::BuiltinUnsafeValueBufferType translateBuiltinUnsafeValueBufferType(
6969
const swift::BuiltinUnsafeValueBufferType& type);
7070
codeql::BuiltinVectorType translateBuiltinVectorType(const swift::BuiltinVectorType& type);
71+
codeql::OpenedArchetypeType translateOpenedArchetypeType(const swift::OpenedArchetypeType& type);
7172

7273
private:
7374
void fillType(const swift::TypeBase& type, codeql::Type& entry);

0 commit comments

Comments
 (0)